一般手机上分为内置存储卡和外置存储卡;
内置存储卡分为可见和不可见;
不可见的 一般都是我们创建的 sqlite 数据库 (使用SQLiteOpenHelper时默认路径)等重要文件在这里面;具体路径 data/data/“你的报名”,比如:/data/data/com.example.soucetest(手机没有root的话是打不开这个文件夹的,模拟器是可以得)
以下以我用到过的分别举例(4.4以后好像有一些api变化,还有一个可以得到多个路径{返回List}的方法,我记不清了,以后用到再补充)
第一部分(内置不可见):
1.得到内置文件路径的方法:
String innerInvisiblePath=Context.getFilesDir().getAbsolutePath();//内置不可见 包括用到该路径存储文件的方法: a.context.openFileOutput("test", Context.MODE_PRIVATE); b.context.openFileInput("test"); 这里文件读写路径都是在/data/data/com.example.soucetest/files文件夹下2.得到内置缓存路径
Context.getCacheDir().getAbsolutePath();//内置不可见 这里文件读写路径都是在/data/data/com.example.soucetest/cache文件夹下
第二部分(内置可见):
1.External文件和缓存
Context.getExternalFilesDir() Context.getExternalCacheDir() 这两个分别对应 /storage/emulated/0 /Android/data/你的应用的包名/files/ 目录和 /storage/emulated/0 /Android/data /你的应用的 包名/ cache,之
所以列出来是因为它们比较特别,如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这
个目录下的所有文件都会被删除,不会留下垃圾信息。(/data/data/包名/下的文件也会)
而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项
2.根目录
String innerVisiblePath=Environment.getExternalStorageDirectory().getAbsolutePath();//内置可见 这里读写的路径为内置存储卡的根目录/storage/emulated/0;这个就不多说了,内置卡根目录,可以 连接电脑查看到,一般我们需要存储一些什么东西,比如用户笔记导出,图片保存可以使用这个路径。
第三部分(外置内存卡)
StorageManager来获取多个sdcard,我现在都是用这个方法的。我开发时获取外置存储卡是从网上搬的另一个方法。这个方法可以取得2.3版本以下的路径,我就不推荐了。我个人推荐的是下面的方法,原因很简单,Android给提供好了方法不用,还要绕过android通过linux?那你可能说StorageManager不支持2.3以下的系统,别怪我太坦白:骚年,你太年轻,微信支付宝都到4.0了,2.3以下,呵呵。。。谁用谁自己写。(老板要求支持?不行,,没错,我当时拒绝了。老板有时候还是讲道理的,但有个人不讲道理,他叫客户。所以我第一个涉及外置存储卡的项目就没用自己推荐的方式,于是一气之下从网上搬砖~-~)
public static String[] getStoragePaths(Context cxt) { List<String> pathsList = new ArrayList<String>(); if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.GINGERBREAD) { //TODO 这里对2.3以下版本单独处理;可以避开android直接使用linux cat/proc/mounts。我现在做项目 //都不适配2.3以下,需要的可以自己网上搜方法 } else { StorageManager storageManager = (StorageManager) cxt.getSystemService(Context.STORAGE_SERVICE); try { Method method = StorageManager.class.getDeclaredMethod("getVolumePaths"); method.setAccessible(true); Object result = method.invoke(storageManager); if (result != null && result instanceof String[]) { String[] pathes = (String[]) result; StatFs statFs; for (String path : pathes) { if (!TextUtils.isEmpty(path) && new File(path).exists()) { statFs = new StatFs(path); if (statFs.getBlockCount() * statFs.getBlockSize() != 0) { pathsList.add(path); } } } } } catch (Exception e) { e.printStackTrace(); File externalFolder = Environment.getExternalStorageDirectory(); if (externalFolder != null) { pathsList.add(externalFolder.getAbsolutePath()); } } } return pathsList.toArray(new String[pathsList.size()]); } 这个方法还是比较可靠的,实验的真机有三星A7,摩托某M机型,华为某板(6.0的那个)不好意思哦,为了证实我测过,我必须举例,奈何健忘所以都记不清型号了<>
如果存在外置卡的情况下,获得的log如下:
内置路径:/storage/emulated/0
外置路径:/storage/extSdCard
第四部分(KitKat4.4版本前后区别)
简单介绍:这个变化主要是针对外置sd卡,可以看出内置sd卡只要有权限任何目录都可以进行操作的。外置内存卡secondar storage针对的主要是写入的限制,可以看出只要有权限读还是不受影响的。但是写无论是否有权限也只能对应自己包名的文件夹进行操作,即外置sd卡的android/data/[package name]
简单的说,你再也不能随意向外置sd卡除自己包名以外的文件夹写入(write)东西了。
请问楼主有什么解决方案吗?答:没有,我没有。 并且我也没去找解决方案,因为我不打算和google作对,我听他的话就好了,他不让用就不用。这点可以参考网易云音乐和天天动听关于文件下载时的处理。如果选择了外置卡就给他个提示,“卸载后......会丢失!”