您的位置:首页 > 移动开发 > Android开发

Android获取不同手机 自身存储和外置SD卡存储路径的解决方案

2017-02-10 10:46 483 查看
最近在给一个应用里面做一个内置的文件管理器,期间遇到一个问题,就是选择不同手机的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上测试均可用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息