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

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

2017-11-21 17:39 656 查看

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的问题。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐