繁体   English   中英

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

[英]Unable to write to external storage; Access is denied

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

重要说明我已经在几种使用不同API的设备上都取得了成功(所有设备都低于23)。 文件已成功写入和检索。 最近,我有一台使用6.0(API 23)的新手机,以某种方式将文件写入存储系统的代码不再起作用。 我无法再在sdcard中创建文件夹,这会导致错误。

另外,手机是根植于5X的Nexus,而不是外部SD卡。 该应用程序在API 23上运行,并且危险权限(包括存储)已得到正确授权,甚至可以使用。

使用getExternalStorageDirectory的可靠方法,该方法返回emulated / 0 /。 Environment.MEDIA_MOUNTED指示已授予对存储的访问权限。 问题是当我尝试创建一个文件夹时,它告诉我我不能这样做。

.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM