2010-01-23 198 views
73

我想我的應用程序將應用程序數據庫存檔到SD卡。在我的代碼中,我檢查目錄canWrite()是否存在,如果不存在,則拋出IOException。在這個特定的例子中,我試圖將數據庫文件複製到SD卡上的根目錄,但它拋出了IOException。如何更改文件夾/文件的權限以便能夠寫入?允許寫入SD卡

回答

201

你說得對,SD卡目錄是/sdcard,但你不應該硬編碼了。取而代之的是,撥打電話到Environment.getExternalStorageDirectory()拿到目錄:

File sdDir = Environment.getExternalStorageDirectory(); 

如果您還沒有這樣做的話,你就需要通過添加下面的線,讓您的應用程序寫入SD卡的正確權限你的清單:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

謝謝...我會改變我的代碼按你的建議。然而,目前我有硬編碼,並沒有清單文件中設置的權限,但它允許我將它保存到SD卡無論如何。爲什麼我能夠在沒有權限設置的情況下保存它? – bugzy 2010-02-08 16:34:17

+4

@ user244190 - 我的猜測是您的手機正在運行Android 1.5。 'WRITE_EXTERNAL_STORAGE'是在1.6中引入的,所以如果你希望它是向前兼容的,你需要將它包含在你的應用程序中。 – 2010-02-08 16:38:32

+0

gotcha。感謝... – bugzy 2010-02-08 21:01:05

1

建議的技術上面戴夫的回答肯定是一個不錯的設計實踐,最終是所要求的權限必須在AndroidManifest.xml文件中設置訪問外部存儲。

然而,單式的方式來增加大部分(如果不是所有的,不知道)「清單選項」是通過開展此項活動(或服務)之類的屬性。

Visual Studio Mono插件自動生成清單,所以最好不要 手動篡改它(我確定有些情況下沒有其他選項)。

例如:

[Activity(Label="MonoDroid App", MainLauncher=true, Permission="android.permission.WRITE_EXTERNAL_STORAGE")] 
public class MonoActivity : Activity 
{ 
    protected override void OnCreate(Bundle bindle) 
    { 
    base.OnCreate(bindle); 
    } 
} 
+0

實際上,我現在看到這個WRITE_EXTERNAL_STORAGE設置是一個用戶權限,如果按照上面的方式設置,它將在清單文件中顯示爲活動設置(android:permission)而不是用戶權限。哦,我只記得,你在VS中設置了用戶權限用戶的項目屬性(它是一個所有權限的複選框列表)。 – samosaris 2012-08-22 19:18:59

+1

它們實際上是「使用許可」標籤,而不是「用戶許可」,但除此之外,其他所有內容都是正確的。 – samosaris 2012-08-22 20:06:00

+0

有一點是絕對必要的是調用 如果(Build.VERSION.SDK_INT> = 19){ MainActivity.get()getExternalFilesDirs(空)。 } //訪問SD/Android/data/your.package.name //不要試圖自己創建包目錄。不進行此調用會導致mkdir或mkdirs失敗。 – user2607942 2018-01-05 22:54:59