Android中如何区分TF【SD】卡路径和USB路径
来源:互联网 发布:mac用哪个word 编辑:程序博客网 时间:2024/05/19 00:36
在Android系统中,我们是不能通过正规的API获取到外卡【TF卡和USB】的路径,需要重写系统或是通过反射的方法获取。当然,修改系统文件是比较重的,所以我们选择通过反射方法来获取;
- 获取手机或平板中所有存储路径:
/** * @return 返回所有存储路径 */ public static String[] getAllVolumePaths(Context mContext) { try { //存储管理类 StorageManager sm = (StorageManager)mContext.getSystemService(STORAGE_SERVICE); //获取存储路径的方法 Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths", null); //获取路径数组 String[] paths = (String[]) getVolumePathsMethod.invoke(sm, null); return paths; } catch (Exception e) { Log.e(TAG, "getPrimaryStoragePath() failed", e); } return null; }
2.获取系统默认的内部存储:
paths[0] :是系統内存;
paths.lenght()大于1的时候,可能是TF卡,也可能是USB,也可能两者都存在,但是无法区别开;
3.使用系统属性来获取TF卡的路径:
属性系统是android的一个重要特性。它作为一个服务运行,管理系统配置和状态。所有这些配置和状态都是属性。每个属性是一个键值对(key/value pair),其类型都是字符串。这些属性可能是有些资源的使用状态,进程的执行状态,系统的特有属性……
特别属性 :
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中。客户端应用程序可以轮询那个属性值,以确定结果。】
通过Adb命令获取系统属性: 通过命令行打印系统属性:
C:\Users\xxx>adb shell
其中
root@KYD-H58:/ # getPprop
[vold.path.internal_storage]: []
vold.path.external_sd对应的值就是SD卡的存储路径。通过Java代码获取系统属性:
private static Method getStringPropMethod = null; public static String getSystemPropString(final String key, final String defaultValue) { try { if (getStringPropMethod == null) { getStringPropMethod = Class.forName( "android.os.SystemProperties").getMethod("get", String.class, String.class); } return (String) getStringPropMethod.invoke(null, key, defaultValue); } catch (Exception e) { Log.e(TAG, "Reflect error: " + e.toString()); return defaultValue; } }
获取sd卡的路径:【如果没有获取到值,则返回sd】
String sd_path = getSystemPropString("vold.path.external_sd","sd");
4.根据key值获取对应的存储路径:
/** * 6.0获取外置sdcard和U盘路径,并区分 * * @param mContext * @param keyword * EXT = "内部存储"; SD = "SD卡"; USB = "U盘" * @return */ public static String getStoragePath(Context mContext, String keyword) { String resultpath = ""; String[] paths = getAllVolumePaths(mContext); String sd_path = getSystemPropString("vold.path.external_sd","sd"); if ("EXT".equals(keyword)&&paths.length>0) resultpath = paths[0]; if ("SD".equals(keyword)&&!"sd".equals(sd_path)) resultpath = sd_path; if ("USB".equals(keyword)){ //0默认为内部存储 for (int i = 1; i <paths.length ; i++) { if (sd_path.equals("sd")) resultpath = paths[i]; else if(!sd_path.equals("sd")&&!paths[i].equals(sd_path)){ resultpath = paths[i]; } } } return resultpath; }
5.获取内卡、SD卡和USB路径
@Override protected void onResume() { super.onResume(); StringBuilder sb = new StringBuilder(); String ext_path = null; String sd_path = null; String usb_path = null; ext_path = getStoragePath(this, "EXT"); sd_path = getStoragePath(this, "SD"); usb_path = getStoragePath(this, "USB"); sb.append("内部存储路径:"+ext_path+"\n"+"SD卡路径:"+sd_path+"\n"+"USB卡路径:"+usb_path); logTv.setText(sb.toString()); }
- Android中如何区分TF【SD】卡路径和USB路径
- Android开发中如何获取外置TF卡的路径
- Android开发中如何获取外置TF卡的路径
- Android手机如何获取手机内存路径和sd卡路径
- Android 内部存储(外置SD卡)和扩展存储卡(TF卡)路径的获取
- Android中怎样获取SD卡路径
- Android中获取内置SD卡和外置SD卡路径的方法
- android 获取SD卡的路径和SD卡内存
- Android获取机身存储、内置SD卡与外置TF卡路径
- Android SD卡 路径问题
- android获取sd卡路径
- Android SD卡路径问题
- Android获得SD卡路径
- Android获得SD卡路径
- Android获取sd卡路径
- Android SD卡路径问题
- android项目中如何获取assets下面的文件在SD卡上面的保存路径
- android SD卡路径问题以及如何获取SDCard 内存
- 如何配置局域网
- Structured Streaming 输入输出
- Java基础github
- REDIS中意外的耗时命令-DEL-EXISTS
- 让用户故事真的像故事那样
- Android中如何区分TF【SD】卡路径和USB路径
- 对于Unity中旋转问题的一点总结
- UEditor配置笔记(持续更新中)
- 树莓派玩转A7模块(gprs篇)
- 动画弹出PopupWindow并使背景变暗
- spring boot 学习地址
- Android Https的安全使用
- Axios 请求配置参数详解
- chrome Provisional headers are shown