簡體   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