允许写入SD卡


80

我希望我的应用程序将应用程序数据库归档到SD卡。在我的代码中,我检查目录是否canWrite()存在,如果不存在,则抛出IOException。在此特定情况下,我试图将db文件复制到SD卡上的根目录中,但是会抛出IOException。如何更改文件夹/文件的权限以能够写入?

Answers:


209

没错,SD卡目录位于其中,/sdcard但您不应该对其进行硬编码。而是调用Environment.getExternalStorageDirectory()来获取目录:

File sdDir = Environment.getExternalStorageDirectory();

如果尚未执行此操作,则需要在清单中添加以下行,以授予您的应用正确的写入SD卡的权限:

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

谢谢...我会根据您的建议更改代码。但是目前我已经对其进行了硬编码,并且没有在清单文件中设置权限,但是无论如何它允许我将其保存到sd卡中。为什么没有设置权限就可以保存它?
bugzy

4
@ user244190-我的猜测是您的手机运行的是Android 1.5。 WRITE_EXTERNAL_STORAGE是在1.6中引入的,因此如果您希望它与前向兼容,则需要将其包含在应用程序中。
Dave Webb'2

@DaveWebb:请在这里看到我的问题:stackoverflow.com/questions/9351904/...
Saher Ahwal

没有人回应,我不知道为什么这不起作用。
Saher Ahwal

@DaveWebb-正确的想法,但可能不是手机正在运行1.5,而是由应用程序指定它是针对1.5构建的,或者(更常见的是)根本没有指定版本,并且当更新的手机看到它会添加向后兼容的权限。
克里斯·斯特拉顿

1

Dave答案中上面建议的技术无疑是一种好的设计实践,是的,最终必须在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);
  }
}

实际上,我现在看到此WRITE_EXTERNAL_STORAGE设置是用户权限,如果按上述方式进行设置,它将在清单文件中显示为活动设置(android:permission),而不是用户权限。哦,我刚刚记得,您在VS中为用户权限用户设置了项目属性(它是所有权限的复选框列表)。
samis 2012年

1
它们实际上是“ uses-permission”标签,而不是“ user-permission”,但除此之外,其他所有内容都适用。
samis 2012年

绝对必要的一件事是调用if(Build.VERSION.SDK_INT> = 19){MainActivity.get()。getExternalFilesDirs(null); } //要访问SD / Android / data / your.package.name //不要尝试自己创建包目录。不进行此调用会导致mkdir或mkdirs无法工作。
pstorli
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.