在我的應用程序,我存儲使用MySQLite數據庫用戶的應用數據,我允許用戶備份我的SD創建一個文件夾內的應用程序數據的SD卡卡(我們稱之爲MyAppFolder)。在只有一個SD卡插槽的Android設備上,一切正常(例如我的Droid)。如何處理一個以上的SD卡插槽
然而,在設備,如Galaxy S的具有超過1張SD卡,事情不工作。不幸的是,我實際上沒有這些設備之一,所以我無法調試任何東西,我只能通過用戶報告去。我也做了一些搜索,發現這是一個已知的問題。然而,我沒有找到任何解決方案,不涉及只是硬編碼的其他路徑,所以我正在尋找一些幫助。
在我的應用程序,我檢查,看看MyAppFolder已經存在。如果不是,我創建該文件夾。該文件夾始終創建成功,儘管它在存在2個插槽時由getExternalStorageDirectory()返回的「內部」內存插槽上創建。但是,文件不會被創建並複製到那裏。我不明白爲什麼文件夾被創建,但文件沒有創建。
誰能告訴我怎樣才能修改這個代碼與2個插槽的設備工作,以及1卡插槽?我不想硬編碼位置檢查,但如果這是唯一的方法,我會做,只是爲了讓事情工作。
這裏是我使用的代碼(略作修改,以使其可讀性更強這裏):
File root = Environment.getExternalStorageDirectory();
String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state))
{
File dataDirectory = Environment.getDataDirectory();
if (root.canWrite())
{
String savePath = root + "/MyAppFolder/";
File directory = new File(savePath);
if(!directory.exists())
{
directory.mkdirs(); //folder created successfully
}
String currentDBPath = "\\data\\my_app\\databases\\database.db";
File currentDB = new File(datDirectory, currentDBPath);
File backupDB = new File(savePath, "database.db");
if (currentDB.exists())
{
FileChannel src = new FileInputStream(currentDB[i]).getChannel();
FileChannel dst = new FileOutputStream(backupDB[i]).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
}
}
謝謝。問題雖然:你是否建議,如果我創建目錄作爲文件目錄=新文件(Environment.getExternalStorageDirectory(),「MyAppFolder」);並使用getDatabasePath()而不是內部數據庫路徑,這將使Galaxy S(和類似的設備)的工作?我知道這是一種更清晰的代碼編寫方式,但最終,究竟發生了什麼變化,這將允許文件成功寫入,目前尚未完成?我有權限設置,這對我的Droid和模擬器很好。我得到了代碼更改。但是,什麼行爲正在改變? – Michael
@Michael:我不知道在寫入「Galaxy S(和類似設備)」上的外部存儲時有任何問題。如果沒有人能夠在這些設備上寫入外部存儲器,我就會聽說它。哎呀,你會聽說過這個消息,因爲這樣的錯誤已經被主要媒體報道。我只是指出了我所發佈的內容中的一些古怪,希望它能幫助您追蹤代碼中存在的問題以及它如何訪問外部存儲。 – CommonsWare
再次感謝。指向我的用戶將他的設備連接到電腦。他說他可以看到兩個驅動器,並可以看到MyAppFolder坐在那裏。但文件夾內沒有文件。那麼,我相信,如果文件夾可以成功創建,那麼這些文件應該能夠被創建嗎?當您嘗試在getExternalStorageDirectory()返回的區域創建文件時,是否遇到過任何可能導致失敗的常見肇事者?我不明白爲什麼代碼可以在Droid上工作,但不是Galaxy S,那全是 – Michael