android --文件存储路径

     一般手机上分为内置存储卡外置存储卡;

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值