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