本方式可以获得内部存储设备地址、SD卡地址、USB设备地址,兼容性能达到99%(别问我为什么这么保证,因为是借鉴了Android设置->存储页面的源码)。

由于调用了几个被@hide的方法,所以采用了反射。

具体代码如下:

public static List getAllExternalStorage(Context context) {

List storagePath = new ArrayList<>();

StorageManager storageManager = (StorageManager) context.getSystemService(STORAGE_SERVICE);

StorageVolume[] storageVolumes;

try {

Method getVolumeList = StorageManager.class.getDeclaredMethod("getVolumeList");

storageVolumes = (StorageVolume[]) getVolumeList.invoke(storageManager);

Method getVolumeState = StorageManager.class.getDeclaredMethod("getVolumeState", String.class);

for (StorageVolume storageVolume : storageVolumes) {

String desc = storageVolume.getDescription(context);

Log.i(TAG, "storageVolume name--->" + desc);

Method getPath = StorageVolume.class.getMethod("getPath");

String path = (String) getPath.invoke(storageVolume);

Log.i(TAG, "StoragePath--->" + path);

//这里需要用StorageManager反射调用getVolumeState函数,而不应该用StorageVolume的getState方法,因为可能会报错

String state = (String) getVolumeState.invoke(storageManager, path);

Log.i(TAG, "storageVolume State--->" + state);

if (Environment.MEDIA_MOUNTED.equals(state)) {

HomeDirBean bean = new HomeDirBean(path, desc);

storagePath.add(bean);

}

}

} catch (Exception e) {

Log.e(TAG, e.getMessage());

}

return storagePath;

}

这里需要注意,可能有小伙伴会问,既然StorageVolume类有getState方法,为啥还要用StorageManager反射调用getVolumeState方法,并传入path地址,而在源码里,StorageManager的getVolumeState的方法的实现,也是将path重新创建为StorageVolume类,然后再调用其getState方法,我们这样做成这不是多此一举吗?

源码截图如下:

答案当然不是了,不然我也不会放弃性能去反射那个方法去装这个逼了。主要原因是@hide的这个方法里,mountPoint被重新打包成StorageVolume时,这相当于系统去创建的一个StorageVolume实例,自然可以执行它的所有方法。而如果是应用直接调用,在被打包时,很多方法被隐藏了,比如这个getState方法,这时候应用就会报错,找不到该方法。

先简单写到这,以后有补充再添加。

以上这篇Android获得所有存储设备位置的最佳方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

android定位地点的保存,Android获得所有存储设备位置的最佳方法相关推荐

  1. android 定位服务和wifi,android WIFI定位和基站定位实现

    android WIFI定位和基站定位实现 来源:互联网 作者:佚名 时间:2015-04-01 13:38 关于定位原理网上很多,这里就不多说了.下面说怎么实现的,直接贴代码如下:首先是Util类: ...

  2. android u盘广播路径,android6.0 外部存储设备插拔广播以及获取路径(U盘)

    android4.1版本时U盘插拔时的广播 在android4.1时我们可以用以下的BroadcastReceiver接收U盘广播. 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 a ...

  3. android 定位服务源码,android gps定位app源码(GpsTracker)

    [实例简介]做到了 gps 开启关闭后的提醒 以及地理位置记录(经纬度) [实例截图] [核心代码] package android.gpstracker; import android.app.Ac ...

  4. android定位数据在移动,android - 在我的Wi-Fi和移动数据关闭的情况下,是否可以仅通过GPS从经纬度获取地址? - 堆栈内存溢出...

    我正在测试一款在三星平板电脑中借助GPS进行纬度和经度的应用程序. 我能够从GPS单元捕获当前的纬度,经度. 现在,我想使用纬度经度从这些位置获取地址,而无需使用Internet即wi-fi,移动数据 ...

  5. Android定位与百度定位

    Android定位与百度定位 AS开发作业四:LBS Android定位与百度定位 前言 一.实验内容与界面展示 1. 实验内容与技术 2. 界面展示 二.实现过程 1. 项目配置 2. activi ...

  6. Android定位方式和测试方法,定位方式(d16)

    一,回顾, ①selector和xpath的区别,selector是解析的html,xpth是解析的xml,所以使用selector比使用xpath快, ②定位元素的单数和复数,当使用单数定位不到元素 ...

  7. android下存储设备的使用

    本文转自android官网,原文地址:https://source.android.google.cn/devices/storage 1.概览 1.1.存储 Android 一直在不断发展,可支持各 ...

  8. android获取拍摄视频的gps,关于gps:Android获取当前位置的最佳方式

    本问题已经有最佳答案,请猛点这里访问. 在以下场景中获取android当前位置的最佳方法是什么, 如果GPS不可用,请从网络提供商处获取位置 如果GPS可用并且可以获得当前位置,请从GPS提供商处获取 ...

  9. 关于android定位方式

    android 定位一般有四种方法,这四种方式分别是GPS定位.WIFI定位.基站定位.AGPS定位. 1. Android GPS 需要GPS硬件支持直接和卫星交互来获取当前经纬度,这种方式需要手机 ...

最新文章

  1. 自学篇之--js 提取复选框和单选框的值 和纯css的3D按钮
  2. Leetcode: 4Sum
  3. autoencoder
  4. 【Python】一文掌握Conda软件安装:虚拟环境、软件通道、加速solving、跨服务器迁移...
  5. Common Lisp 操作Mysql
  6. php赋值给jq,jquery怎么给div赋值
  7. (转)python3 urllib.request.urlopen() 错误UnicodeEncodeError: 'ascii' codec can't encode characters...
  8. 终端中用命令成功修改linux~Ubuntu PATH环境变量
  9. sql 视图不排序_算法工程师SQL进阶:神奇的自连接与子查询
  10. 前端面试题之手写事件模型及事件代理/委托
  11. pmon构建过程分析
  12. 小米5miui10android,小米8 Miui10.3 最新稳定版(10.3.5.0 9.0) 快过闪电 AI 人性化设置 冰箱 流畅 实用...
  13. 初探NIVIDIA GPU+CUDA+pyTorch
  14. luoguT30208 太极剑(贪心)
  15. 如何修改服务器BMC密码,C2100服务器BMC卡固件升级失败和密码重置问题
  16. 《CryENGINE+Game+Programming+with+C++,+C#,+and+Lua》第七章
  17. 志在必得的。。。。失败。。。
  18. proxmox的安装
  19. html中加大p的距离,html中P标签段落与CSS段落间距距离调整
  20. 字段是否包含中文、英文、数字

热门文章

  1. 在网页子文本框模拟特定的鼠标滚轮_Pyhton爬虫的另类操作,之前有碰到不能爬的网页来看看!...
  2. 脉冲神经网络原理及应用pdf_CNN卷积神经网络原理讲解+图片识别应用(附源码)...
  3. python刚出来多少薪资-Python工资待遇的几个层级,你工作几年了?目前是哪个层级?...
  4. python工资这么高为什么不学-人人学Python,为什么就业拿高薪的那么少?
  5. 智能机器人语音ic丨智能玩具语音识别芯片丨机器人语音播报芯片丨AI语音提示芯片...
  6. 语音识别开放化开发平台有哪些?
  7. nodejs的koa中cookie和session的使用,cookie和session的区别
  8. 【PYTHON笔记】:文件打开和关闭
  9. 视频质量,分辨率以及码率之间的关系
  10. 360路由器v2刷第三方固件_路由器不拆闪存,编程器刷机技巧,恢复出厂固件办法...