Android 6.0权限导致dest.mkdirs() 一直返回false问题: 无法写入文件:

来源:互联网 发布:剪切的数据怎么恢复 编辑:程序博客网 时间:2024/05/16 12:03

Android dest.mkdirs() 一直返回false问题 无法写入文件:

最近在Android开发中遇到了解压文件,一直失败的问题。调试半天总算找出了问题所在。记录一下。下面是碰到问题的代码:

    public static void unzip(InputStream is, String dir) throws IOException {        File dest = new File(dir);        if (!dest.exists()) {        //TODO必须  请求  动态权限            boolean b = dest.mkdirs();            Log.i("info",b + "=======此处一直返回false==========");        }        if (!dest.isDirectory())            throw new IOException("Invalid Unzip destination " + dest);        if (null == is) {            throw new IOException("InputStream is null");        }        ZipInputStream zip = new ZipInputStream(is);        ZipEntry ze;        while ((ze = zip.getNextEntry()) != null) {            final String path = dest.getAbsolutePath()                    + File.separator + ze.getName();            String zeName = ze.getName();            char cTail = zeName.charAt(zeName.length() - 1);            if (cTail == File.separatorChar) {                File file = new File(path);                if (!file.exists()) {                    if (!file.mkdirs()) {                        throw new IOException("Unable to create folder " + file);                    }                }                continue;            }            FileOutputStream fout = new FileOutputStream(path);            byte[] bytes = new byte[1024];            int c;            while ((c = zip.read(bytes)) != -1) {                fout.write(bytes, 0, c);            }            zip.closeEntry();            fout.close();        }    }

一,检查发现 mianfest 中已经 添加权限 如下:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

二,如果你的App 版本小于 Android 6.0 按照上述判断方式是没问题的。但是Android6.0 后Android 对于权限检查更加全面。我们必须还要在 代码中加以判断 :

1,需要我们请求权限:

ActivityCompat.requestPermissions(MainActivity.this, new String[]{android                .Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);

2, 在返回 方法中处理:

@Override     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,                                            @NonNull int[] grantResults) {         //super.onRequestPermissionsResult(requestCode, permissions, grantResults);         switch (requestCode)         {             case 1:                 if (grantResults[0]== PackageManager.PERMISSION_GRANTED)                 {                     //创建文件夹                     if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {                         File file = new File(Environment.getExternalStorageDirectory() + "/aa/bb/");                         if (!file.exists()) {                             Log.d("jim", "path1 create:" + file.mkdirs());                         }                     }                 break;         }     }  

这样 才算解决了 mkdir 一直 返回 false的问题。。

阅读全文
0 0
原创粉丝点击