[英]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.