Android获取不同手机 自身存储和外置SD卡存储路径的解决方案
16lz
2021-01-26
最近在给一个应用里面做一个内置的文件管理器,期间遇到一个问题,就是选择不同手机的sd卡存储和手机本身存储。可以在两者之间来回切换,经过一系列测试发现,现在的很多手机厂家定制的手机内存和sd卡内存的路径都不同,用android系统自带的api无法准确获取区分sd卡和手机自身的准确路径,比如再一台手机上获取的手机的路径是/storage/emulated/0。很可能在另外一个手机上用同样的方法获取到的就不是这个路径。
下面给出解决方案,大致思路是:首先获取到手机(设备)中所有的存储路径,包括 手机自身的存储路径,sd卡存储路径,其他存储路径。返回的是一个存放路径的String数组。然后我们对数组进行处理,一般第一位元素arr[0]就是手机自身的存储路径,arr[1]就是外置sd卡的存储路径。
获取到路径了,我们接下来就可以进行其他操作了。
下面是代码
/** * 得到所有的存储路径(内部存储+外部存储) * * @param context * @return */ public static String[] getAllSdPaths(Context context) { Method mMethodGetPaths = null; String[] paths = null; //通过调用类的实例mStorageManager的getClass()获取StorageManager类对应的Class对象 //getMethod("getVolumePaths")返回StorageManager类对应的Class对象的getVolumePaths方法,这里不带参数 StorageManager mStorageManager = (StorageManager)context .getSystemService(context.STORAGE_SERVICE);//storage try { mMethodGetPaths = mStorageManager.getClass().getMethod("getVolumePaths"); paths = (String[]) mMethodGetPaths.invoke(mStorageManager); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return paths; }
接下来是在ManiActivity中进行调用
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); strAllPath = FilesUtils.getAllSdPaths(this); initView();// 控件初始化 setLayout();// 视图切换 moblieStorgePath = strAllPath[0];// 手机 sDStorgePath = strAllPath[1];// sd卡 Log.e("moblieStorgePath", moblieStorgePath + ""); Log.e("strAllPath", strAllPath.length + ""); Log.e("strAllPath[0]", strAllPath[0]); Log.e("strAllPath[1]", strAllPath[1]);
运行结果log:
经过与手机自带文件管理器比对,strAllPath[0]为手机自身的储存,strAllPath[1]为我的sd卡存储。已经在oppo r9s ,红米1s,小米2s上测试均可用。
更多相关文章
- Android(安卓)如何获取应用签名,微信需要的签名是MD5还是SHA1?
- 局域网内android设备发现及通讯
- Android(安卓)View获取坐标值、相对距离的方法
- 浅析android适配器adapter中的那些坑
- Android开发的第一个例子(内附Sdk、Android(安卓)studio的下载)
- android安全问题(一) 静音拍照与被拍
- android调用webservice实现手机归属查询
- Android重力感应器入门介绍
- Android(安卓)Studio获取开发版SHA1值和发布版SHA1值的史上最详