2010-01-23 191 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