测试手机:华为荣耀4C
获取存储路径的方法:
Log.e("0",""+this.getFilesDir()); Log.e("1",""+this.getCacheDir()); Log.e("2",""+this.getExternalCacheDir()); Log.e("3",""+this.getExternalFilesDir("")); Log.e("4",""+Environment.getRootDirectory()); Log.e("5",""+Environment.getDataDirectory()); Log.e("6",""+Environment.getDownloadCacheDirectory()); Log.e("7",""+Environment.getExternalStorageDirectory()); Log.e("8",""+Environment.getExternalStoragePublicDirectory(""));
输出结果:
E/0: /data/data/com.hnsi.zheng.hnti_erp_app/files
E/1: /data/data/com.hnsi.zheng.hnti_erp_app/cache
E/2: /storage/sdcard1/Android/data/com.hnsi.zheng.hnti_erp_app/cache
E/3: /storage/sdcard1/Android/data/com.hnsi.zheng.hnti_erp_app/files
E/4: /system
E/5: /data
E/6: /cache
E/7: /storage/sdcard1
E/8: /storage/sdcard1
华为荣耀4C可选择系统默认存储路径,以上输出结果为默认存储路径设置为SD卡时的输出结果。当系统默认存储路径设置为内部储存时,输出结果如下:
E/0: /data/data/com.hnsi.zheng.hnti_erp_app/files
E/1: /data/data/com.hnsi.zheng.hnti_erp_app/cache
E/2: /storage/emulated/0/Android/data/com.hnsi.zheng.hnti_erp_app/cache
E/3: /storage/emulated/0/Android/data/com.hnsi.zheng.hnti_erp_app/files
E/4: /system
E/5: /data
E/6: /cache
E/7: /storage/emulated/0
E/8: /storage/emulated/0
context.getExternalStorageDirectory()返回的是手机外部储存,每个手机厂家对这个外部储存的理解不同,所以不同手机执行此方法返回的值可能不同。目前的手机大多应该已经不再支持自己安装扩展内存卡,而是内置大容量储存,对于此类手机,context.getExternalStorageDirectory()返回的值应该就是内置储存空间,文件可以直接存储在这个空间的路径下;还有一部分手机仍然支持扩展内存卡,这时context.getExternalStorageDirectory()返回的值可能是系统内置的储存空间,也可能是外挂的SD卡,华为荣耀4C可以通过自己设置默认储存决定这个方法的返回值,如果手机没有这项设置功能,可以通过以下方法获取手机当前挂载的所有存储空间:
/** * 获取手机当前挂载的所有储存路径 * @param context * @return 存放所有路径的数组 */ public String[] listSDRootPath(Context context) { try { StorageManager manager = (StorageManager) context.getSystemService(Activity.STORAGE_SERVICE); Method method = manager.getClass().getMethod("getVolumePaths"); return (String[]) method.invoke(manager); } catch (Exception e) { return null; } }
关于手机存储路径的使用:Google推荐使用context.getExternalCacheDir和context.getExternalFilesDir分别用来存储缓存和文件,而不是在context.getExternalStorageDirectory()路径下自己创建文件夹,因为前者在app卸载时会被系统关联删除,而后者不会随着app的删除被删除掉,这会导致储存空间存在垃圾文件,如果不希望文件随着app被删除可以自己创建文件夹存放。context.getCacheDir和context.getFilesDir方法获取的是系统内部文件,这个文件在是隐藏并受保护的,需要root权限才能访问,可以放置一些用户不可见的内容,SQLite数据库这种受保护的私密文件就存放在它们所在的/data/data/package/路径下,但是这个路径下不能放置流媒体等大量数据,否则会影响手机的正常使用。