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