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

android --文件存储路径

2016-09-14 14:08 232 查看
     一般手机上分为内置存储卡外置存储卡;

  内置存储卡分为可见不可见;

  不可见的 一般都是我们创建的 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作对,我听他的话就好了,他不让用就不用。这点可以参考网易云音乐和天天动听关于文件下载时的处理。如果选择了外置卡就给他个提示,“卸载后......会丢失!”



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: