android 获得手机外插SD卡 存储路径和存储空间
来源:互联网 发布:淘宝手机详情活动 编辑:程序博客网 时间:2024/06/06 02:20
获取存储路径:
/** * * <p> * Description: 获取手机外插SD 存储路径 * <p> * @date 2017-4-18 * @author * @param * @return */ public static String getOuterSDPath() { String sdcard_path = null; String sd_default = Environment.getExternalStorageDirectory() .getAbsolutePath(); LogEx.i("DownloadPathUtil sd_default", sd_default); // sd_default = /storage/emulated/0 if (sd_default.endsWith("/")) { sd_default = sd_default.substring(0, sd_default.length() - 1); } // 得到路径 try { Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec("mount"); InputStream is = proc.getInputStream(); InputStreamReader isr = new InputStreamReader(is); String line; BufferedReader br = new BufferedReader(isr); while ((line = br.readLine()) != null) { LogEx.i("DownloadPathUtil line:", line); if (line.contains("secure")) continue; if (line.contains("asec")) continue; if (line.contains("fat") && line.contains("/mnt/")) { String columns[] = line.split(" "); if (columns != null && columns.length > 1) { if (sd_default.trim().equals(columns[1].trim())) { continue; } sdcard_path = columns[1]; } } else if (line.contains("fuse") && line.contains("/mnt/")) { String columns[] = line.split(" "); if (columns != null && columns.length > 1) { if (sd_default.trim().equals(columns[1].trim())) { continue; } sdcard_path = columns[1]; } } else if (line.contains("extSdCard")) { String columns[] = line.split(" "); if (columns != null && columns.length > 1) { if (sd_default.trim().equals(columns[1].trim())) { continue; } sdcard_path = columns[1]; } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } LogEx.i("DownloadPathUtil", sdcard_path); return sdcard_path; }
Line 8065: 05-16 15:53:19.826 I/DownloadPathUtil sd_default(25251): 2017年5月16日 PM3:53:19 F[DownloadPathUtil] L[433][getOuterSDPath] /storage/emulated/0
Line 8065: 05-16 15:53:19.826 I/DownloadPathUtil sd_default(25251): 2017年5月16日 PM3:53:19 F[DownloadPathUtil] L[433][getOuterSDPath] /storage/emulated/0 这是打印的日志
发现
String sd_default = Environment.getExternalStorageDirectory() .getAbsolutePath(); LogEx.i("DownloadPathUtil sd_default", sd_default); // sd_default = /storage/emulated/0 if (sd_default.endsWith("/")) { sd_default = sd_default.substring(0, sd_default.length() - 1); }
sd_default = /storage/emulated/0 if 分支不会走的
打印的line:
05-16 15:53:19.936 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:19 F[DownloadPathUtil] L[450][getOuterSDPath] rootfs / rootfs ro,relatime 0 0
05-16 15:53:19.946 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:19 F[DownloadPathUtil] L[450][getOuterSDPath] tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,size=1248900k,nr_inodes=130627,mode=755 0 0
05-16 15:53:19.956 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:19 F[DownloadPathUtil] L[450][getOuterSDPath] devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
05-16 15:53:19.956 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:19 F[DownloadPathUtil] L[450][getOuterSDPath] none /dev/cpuctl cgroup rw,relatime,cpu 0 0
05-16 15:53:19.966 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:19 F[DownloadPathUtil] L[450][getOuterSDPath] proc /proc proc rw,relatime 0 0
05-16 15:53:19.966 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:19 F[DownloadPathUtil] L[450][getOuterSDPath] sysfs /sys sysfs rw,seclabel,relatime 0 0
05-16 15:53:19.976 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:19 F[DownloadPathUtil] L[450][getOuterSDPath] selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
05-16 15:53:19.986 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] debugfs /sys/kernel/debug debugfs rw,relatime 0 0
05-16 15:53:19.996 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] none /acct cgroup rw,relatime,cpuacct 0 0
05-16 15:53:20.006 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] tmpfs /mnt/secure tmpfs rw,seclabel,relatime,size=1248900k,nr_inodes=130627,mode=700 0 0
05-16 15:53:20.016 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] tmpfs /mnt/asec tmpfs rw,seclabel,relatime,size=1248900k,nr_inodes=130627,mode=755,gid=1000 0 0
05-16 15:53:20.026 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] tmpfs /mnt/obb tmpfs rw,seclabel,relatime,size=1248900k,nr_inodes=130627,mode=755,gid=1000 0 0
05-16 15:53:20.036 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/platform/msm_sdcc.1/by-name/persdata /persdata/absolute ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
05-16 15:53:20.046 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,nosuid,nodev,relatime,data=ordered 0 0
05-16 15:53:20.056 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0
05-16 15:53:20.066 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0
05-16 15:53:20.076 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0
05-16 15:53:20.086 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/platform/msm_sdcc.1/by-name/efs /efs ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0
05-16 15:53:20.096 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/platform/msm_sdcc.1/by-name/apnhlos /firmwarevfat ro,context=u:object_r:firmware:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
05-16 15:53:20.106 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/platform/msm_sdcc.1/by-name/modem /firmware-modem vfat ro,context=u:object_r:firmware:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
05-16 15:53:20.116 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /data/media /mnt/shell/emulated sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023 0 0
05-16 15:53:20.126 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /data/container /mnt/shell/container sdcardfs rw,nosuid,nodev,relatime,uid=1000,gid=1000 0 0
05-16 15:53:20.136 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] tmpfs /storage/emulated tmpfs rw,seclabel,nosuid,nodev,relatime,mode=050,gid=1028 0 0
05-16 15:53:20.146 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/vold/179:65 /storage/extSdCard vfat rw,dirsync,nosuid,nodev,noexec,noatime,nodiratime,uid=1000,gid=1023,fmask=0002,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
05-16 15:53:20.156 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] tmpfs /storage/extSdCard/.android_secure tmpfs ro,seclabel,relatime,size=0k,mode=000 0 0
05-16 15:53:20.166 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /data/media /storage/emulated/0 sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023 0 0
05-16 15:53:20.176 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /data/media /storage/emulated/0/Android/obb sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023 0 0
05-16 15:53:20.186 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /data/media /storage/emulated/legacy sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023 0 0
05-16 15:53:20.196 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:53:20 F[DownloadPathUtil] L[450][getOuterSDPath] /data/media /storage/emulated/legacy/Android/obb sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023 0 0
通过代码看到 含有“secure” 有 背景的两行去掉,那么含有“extSdCard”也去掉了!!!
通过代码看到 “asec” 有 背景去掉!!!!
通过代码看到 “mnt” 有 背景!! 通过代码看到 “fat” 有 背景! 含有“fuse”没有一行!! 而且也不同时含有“mut”和“fat”!!
打印出来的sdcard_path:
05-16 15:54:46.886 I/DownloadPathUtil(25251): 2017年5月16日 PM3:54:46 F[DownloadPathUtil] L[497][getOuterSDPath] /storage/extSdCard
输出日志关系:
05-16 15:54:46.866 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:54:46 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/vold/179:65 /storage/extSdCardvfat rw,dirsync,nosuid,nodev,noexec,noatime,nodiratime,uid=1000,gid=1023,fmask=0002,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
05-16 15:54:46.876 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:54:46 F[DownloadPathUtil] L[450][getOuterSDPath] tmpfs /storage/extSdCard/.android_secure tmpfs ro,seclabel,relatime,size=0k,mode=000 0 0
05-16 15:54:46.886 I/DownloadPathUtil(25251): 2017年5月16日 PM3:54:46 F[DownloadPathUtil] L[497][getOuterSDPath] /storage/extSdCard
05-16 15:54:46.866 I/DownloadPathUtil line:(25251): 2017年5月16日 PM3:54:46 F[DownloadPathUtil] L[450][getOuterSDPath] /dev/block/vold/179:65 /storage/extSdCard vfat rw,dirsync,nosuid,nodev,noexec,noatime,nodiratime,uid=1000,gid=1023,fmask=0002,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
这一行不含有 “secure” 分割之后,就会得到“/storage/extSdCard” 也就是上图中 含有fat和extSdCard 那一行!!!!!
到此日志分析结束。之所以使用“mnt”,“fuse”和“fat”分支是为了匹配市场上其他非主流手机。
获取存储空间大小:
/** * * <p> * Description: 获取手机外插SD 存储容量 MB * <p> * @date 2017-4-18 * @author * @param * @return */ public static long getOuterSDTotalSize() { String sdcard_path = getOuterSDPath(); if(TextUtils.isEmpty(sdcard_path) || TextUtils.isEmpty(sdcard_path.trim())) { return 0; } StatFs stat = new StatFs(sdcard_path); long blockSize = stat.getBlockSize(); long totalBlocks = stat.getBlockCount(); return totalBlocks * blockSize / 1024 / 1024; }
/** * * <p> * Description: 获取手机外插SD 存储容量 MB * <p> * @date 2017-4-18 * @author * @param * @return */ public static long getOuterSDFree() { String sdcard_path = getOuterSDPath(); if(TextUtils.isEmpty(sdcard_path) || TextUtils.isEmpty(sdcard_path.trim())) { return 0; } StatFs stat = new StatFs(sdcard_path); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); return availableBlocks * blockSize / 1024 / 1024; }
/***********************************************************************************************************************************************************************************/
问题来了:对于华为手机 打印line
05-18 15:47:29.930 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,size=1405708k,nr_inodes=351427,mode=755 0 0
05-18 15:47:29.931 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
05-18 15:47:29.934 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] none /dev/cpuctl cgroup rw,relatime,ionice,cpu 0 0
05-18 15:47:29.936 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] none /dev/cpuset cgroup rw,relatime,cpuset,noprefix,release_agent=/sbin/cpuset_release_agent 0 0
05-18 15:47:29.938 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] none /dev/frz cgroup rw,relatime,freezer 0 0
05-18 15:47:29.939 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] proc /proc proc rw,relatime 0 0
05-18 15:47:29.942 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] sysfs /sys sysfs rw,seclabel,relatime 0 0
05-18 15:47:29.944 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
05-18 15:47:29.945 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] none /sys/fs/cgroup tmpfs rw,seclabel,relatime,size=1405708k,nr_inodes=351427,mode=750,gid=1000 0 0
05-18 15:47:29.946 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] none /sys/fs/cgroup/pids cgroup rw,relatime,pids 0 0
05-18 15:47:29.947 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] pstore /sys/fs/pstore pstore rw,seclabel,relatime 0 0
05-18 15:47:29.948 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] /sys/kernel/debug /sys/kernel/debug debugfs rw,seclabel,relatime,gid=1000,mode=755 0 0
05-18 15:47:29.950 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] none /acct cgroup rw,relatime,cpuacct 0 0
05-18 15:47:29.951 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] tmpfs /mnt tmpfs rw,seclabel,relatime,size=1405708k,nr_inodes=351427,mode=755,gid=1000 0 0
05-18 15:47:29.952 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] /data/media /mnt/runtime/default/emulated sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023,derive=legacy,reserved=20MB 0 0
05-18 15:47:29.954 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] /data/media /mnt/runtime/read/emulated sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023,derive=legacy,reserved=20MB 0 0
05-18 15:47:29.955 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] /data/media /mnt/runtime/write/emulated sdcardfs rw,nosuid,nodev,relatime,uid=1023,gid=1023,derive=legacy,reserved=20MB 0 0
05-18 15:47:29.957 D/DownloadPathUtil line:(13848): May 18, 2017 15:47:29 F[DownloadPathUtil] L[456][getOuterSDPath] /dev/block/vold/public:179:145 /mnt/media_rw/3632-6364vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
输出的 路径: /mnt/media_rw/3632-6364 使用去寻找路径,这个是直接报错的!!!
使用下面代码:
/** * * <p> * Description: 通过反射获取SD卡路径:内置和外置(3.0以上) * <p> * @date 2017-4-18 * @author * @param * @return */ public static void getVolumePaths(Context context) { String[] paths = null; Method mMethodGetPaths = null; try { Object storageManagerObj = context.getSystemService("storage"); if (storageManagerObj != null) { mMethodGetPaths = storageManagerObj.getClass() .getMethod("getVolumePaths"); if (mMethodGetPaths != null) { paths = (String[]) mMethodGetPaths.invoke(storageManagerObj); } } } catch (Exception e) { e.printStackTrace(); return; } if (paths != null && paths.length >= 2) { String str = paths[1]; if(!TextUtils.isEmpty(str)) { LogEx.i("DownloadPathUtil str=", str); File file = new File(str); if (file != null && file.isDirectory() && file.canExecute()) { mExternalSDPath = str; //Android 4.4以上// if(Build.VERSION.SDK_INT >= 19)// {// mExternalSDPath = str + "/Android/data/" +// context.getPackageName() + DownloadSettingVo.DOWNLOAD_PATH;// }// else// {// mExternalSDPath = str + DownloadSettingVo.DOWNLOAD_PATH;// } LogEx.i("DownloadPathUtil mExternalSDPath=", mExternalSDPath); } } } }
获取的 路径是: L[563][getVolumePaths] /storage/3632-6364
所以只能采用下面这个方法获取外插sd卡。
- android 获得手机外插SD卡 存储路径和存储空间
- Android获取不同手机 自身存储和外置SD卡存储路径的解决方案
- android 手机内置,sd卡存储的存储路径和空间问题
- Android 最新获取手机内置存储大小,SD卡存储空间大小方法
- Android获得SD卡路径
- Android获得SD卡路径
- 内部存储空间 手机存储空间 sd卡
- android 获取手机SD卡和手机的内部存储
- Android获得手机内存和SD卡空间大小
- Android获取手机和SD卡的存储存储信息
- android读取系统存储级SD卡存储空间
- android读取系统存储级SD卡存储空间
- Android获取SD卡存储空间
- 获取手机及SD卡可用存储空间
- Android手机如何获取手机内存路径和sd卡路径
- android 手机获取外置SD卡路径
- 内部及外部SD卡存储空间存储
- Android判断是否存在外置SD卡(获取手机所有存储设备的路径)
- java学习(二)-----基本类
- libuv之下载编译(ubuntu16.04)
- TCP/IP(二):IP协议
- 修改Xamarin Android App 的图标跟名称
- chromium编译 win7(Service Pack 1) + vs2017
- android 获得手机外插SD卡 存储路径和存储空间
- W3School学习网
- 算法设计与应用基础
- 输出格式
- C++工程代码打包的dll在C#工程上使用注意点!变量对应关系
- TED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: already added R
- TCP/IP(三):IP协议相关技术
- EventBus Q&A
- js技巧收集