[英]Android File not being copied to SD card
我正在嘗試將外部存儲目錄中的文件復制到SD卡中的目錄中。 但是,當我檢查文件是否已成功復制時,甚至沒有在SD卡中創建文件。
我想念什么嗎? 這是我的代碼:
String sourcePath = Environment.getExternalStorageDirectory().getPath() + newFileName;
File source = new File(Environment.getExternalStorageDirectory().getPath(), newFileName);
String destinationPath = "/storage/external_SD";
File destination = new File(destinationPath, newFileName);
try {
if(!destination.exists()){
destination.mkdir();
}
FileUtils.copyFile(source, destination);
} catch (IOException e) {
e.printStackTrace();
}
copyFile
方法來自Apache庫。 這是它的鏈接: https : //commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html
但是,當我檢查文件是否已成功復制時,該文件甚至沒有在sd卡中創建。
您無法在Android 4.4+上對可移動存儲進行任意文件系統級別的訪問。
有沒有解決的辦法?
這取決於您的目標是什么。
如果您堅持必須在任意用戶設備上寫入該特定路徑,那么,不,沒有支持的解決方法。 畢竟,絕大多數Android設備上都沒有/storage/external_SD
。 設備制造商選擇在何處以及如何選擇安裝可移動介質,這取決於它們,並且實施細節將有所不同。
如果您放寬了該限制,但堅持要求您必須能夠將文件寫入任意用戶設備上的可移動存儲的根目錄中,那么,不,今天沒有受支持的解決方法。 N Developer Preview具有“作用域目錄訪問”功能,該功能應允許此功能,但是要假定任意用戶設備將運行該版本的Android或更高版本還需要幾年的時間。 另外,您沒有獲得實際的文件系統訪問權限,而是獲得了Uri
(請參閱下面的“存儲訪問框架”選項)。
現在,如果您對精確的位置更加靈活,則可以使用其他選擇:
您可以使用Context
上的所有方法getExternalFilesDirs()
, getExternalCacheDirs()
和getExternalMediaDirs()
。 注意復數形式。 如果這些返回2+條目,則第二個及后續條目是可移動存儲上的可讀取和寫入的位置,無需權限。 但是,您無法選擇確切的路徑。 而且,如果該設備具有2個以上的可移動存儲卷,則我不確定您如何幫助用戶區分它們。
您可以使用Storage Access Framework並讓用戶選擇將文件放置在何處。 歡迎用戶選擇可移動存儲...。 您將獲得一個Uri
,可以將其與ContentResolver
和openOutputStream()
來編寫內容。 您還可以獲取持久的Uri
權限,以便將來假定用戶不會將其移動或刪除時再使用該文件。
您提到的destinationPath
可能屬於私有系統文件夾或某些其他應用程序文件夾,因此可能無法訪問。 但是,您可以使用公用文件夾,例如圖片,音樂,視頻,下載等。 或在其中創建子文件夾-
String sourcePath = Environment.getExternalStorageDirectory().getPath() + newFileName;
File source = new File(Environment.getExternalStorageDirectory().getPath(), newFileName);
File destinationPath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS, "/external_SD");
try {
if(!destinationPath.exists()){
destinationPath.mkdir();
}
File destination = new File(destinationPath, newFileName);
FileUtils.copyFile(source, destination);
} catch (IOException e) {
e.printStackTrace();
}
如果要復制到外部存儲,則需要
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.