簡體   English   中英

無法在 SD 卡上寫入文件

[英]Can't write file on SD-card

我試圖在 SD 卡上寫一張照片但沒有成功。

我有在可移動存儲中寫入的權限並且安裝了 SD 卡。

此外,我檢查了 SD 卡的路徑是否存在,並獲得了肯定的結果。

它失敗的地方是當我使用mkdir()函數時。 它返回 false 並且沒有創建文件。

我已經在三星 A6(棉花糖)和三星 Tab4(棒棒糖)上進行了測試

這是我用來檢索 SD 卡路徑的代碼片段。
因為標准程序不適用於三星設備,所以我使用的是從 stackoverflow 答案中獲取的這段代碼

三星A6用這個函數返回的路徑是/storage/6DD9-1D15。

public String[] getStorageDirectories() {
    String[] storageDirectories;
    String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE");

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        List<String> results = new ArrayList<String>();
        File[] externalDirs = getApplicationContext().getExternalFilesDirs(null);
        for (File file : externalDirs) {
            String path = file.getPath().split("/Android")[0];
            if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Environment.isExternalStorageRemovable(file))
                    || rawSecondaryStoragesStr != null && rawSecondaryStoragesStr.contains(path)) {
                results.add(path);
            }
        }
        storageDirectories = results.toArray(new String[0]);
    } else {
        final Set<String> rv = new HashSet<String>();

        if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) {
            final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator);
            Collections.addAll(rv, rawSecondaryStorages);
        }
        storageDirectories = rv.toArray(new String[rv.size()]);
    }
    return storageDirectories;
}

相反,這是我用來在 SD 卡下的 DCMI 目錄中寫入文件夾的代碼(我將在其中放置照片)

public void mkFolder(String folderPath) { // make a folder under Environment.DIRECTORY_DCIM

    File folder = new File(folderPath);

    try {
        // MKDIRS returns false
        if (folder.mkdirs()) {
            Log.d(TAG, "folder created:" + folder.toString());
        } else {
            Log.d(TAG, "create folder fails:" + folder.toString());
        }
    } catch (Exception ecp) {
        ecp.printStackTrace();
    }
}

在 API 級別 18 及以下,您的getStorageDirectories()將通過它的else塊。 該塊假設:

  • SECONDARY_STORAGE環境變量存在......這不是必需的
  • SECONDARY_STORAGE包含一個分隔的目錄列表......這不是必需的
  • 目錄列表匹配可移動存儲選項......這不是必需的
  • 您可以使用這些目錄...這不是必需的

在 API 級別 19+ 上,您的getStorageDirectories()代碼將通過其if塊。 在那里,你開始很好,調用getExternalFilesDirs() 如果該方法返回 2+ 項,則第二個和后續項指向可移動存儲,特別是指向可移動存儲上可以讀寫的位置。 然后,您的代碼假設:

  • 該目錄有一個/Android路徑段...這不是必需的
  • /Android前面的目錄路徑部分表示您可以在其中創建文件和目錄的位置......這永遠不是真的

除了getExternalFilesDirs()等方法返回的特定目錄,您沒有對可移動存儲的文件系統級訪問權限。

所以,要么:

  • 堅持getExternalFilesDirs()返回的特定位置,或

  • 切換到使用存儲訪問框架,允許用戶選擇存儲內容的位置(可能是也可能不是可移動存儲)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM