无法写入外部存储器;访问被拒绝



我有一个类,它存储应用程序第一次启动时从Facebook下载的图像。我所做的是,我会使用一个类来创建一个文件夹(如果它以前不存在的话),并将所有图像存储在那里。

重要我在不同API的多台设备上取得了成功(均低于23台)。文件写入和检索成功。最近,我有一部新手机,它使用6.0(API 23),但不知怎么的,将文件写入存储系统的代码不再有效。我无法再在SD卡中创建文件夹,这导致了错误。

作为补充信息,该手机是一个根nexus 5X,而不是一个外部SD卡。该应用程序在API 23上运行,在使用该应用程序之前,包括存储在内的危险权限都得到了正确授权。

使用getExternalStorageDirectory的久经考验的方法,该方法返回模拟的/0/。Environment.MEDIA_INSTALLED表示已授予对存储的访问权限问题是当我试图创建一个文件夹时,它告诉我不能这样做。

.canwrite表示我试图创建的mkdirs目录不可访问

供您参考,我的清单:

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

我的写入外部存储的方法:

public static String storeImage(Bitmap bitmap, String filename) {
    String stored = null;
    String folder_main = "Samepage";
    String root = Environment.getExternalStorageDirectory().toString();
    String state = Environment.getExternalStorageState();
    Log.i(TAG,"Storage state is " + state);
    File folder = new File(root + "/Samepage");
    Log.i(TAG, folder.toString());
    if (!Environment.MEDIA_MOUNTED.equals(state)) {
        Log.e(TAG,"Storage is not mounted!");
    }
    if (folder.canWrite()) {
        Log.i(TAG, "External storage is accessible");
        if (!folder.exists()) {
            folder.mkdirs();
        }
    } else 
        Log.e(TAG, "Default storage is not accessible");

    File sdcard = Environment.getExternalStorageDirectory();
    if (folder.exists()) {
        File file = new File(root, filename + ".png");
        if (file.exists())
            file.delete();
        try {
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();
            stored = "success";
            Log.i(TAG, "User image created successfully");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return stored;
}

在API 23+上,我建议在任何外部存储操作之前运行此函数:

private static final int REQUESTCODE_STORAGE_PERMISSION = 999999999;
private static boolean storagePermitted(Activity activity) {
    Boolean readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
    Boolean writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
    if (readPermission && writePermission) {
        return true;
    }
    ActivityCompat.requestPermissions(activity, new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, REQUESTCODE_STORAGE_PERMISSION);
    return false;
}

此方法请求对外部存储的读写权限,如果应该执行该操作,则返回true。截至API,默认情况下已禁用23个外部存储权限。

进一步阅读:developer.android.com/training/permissions/requesting.html

最新更新