安卓SD卡写入,权限被拒绝

17

我试图使用以下代码将文件写入SD卡(在manifest.xml中已设置权限android.permission.WRITE_EXTERNAL_STORAGE)。 在执行nmea_file.createNewFile();时,它抛出了一个带有Permission Denied的异常。

你有什么猜测为什么会发生这种情况吗?

if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 
  {
     Log.d(TAG, "Sdcard was not mounted !!" ); 
  }
else
  {
    File nmea_file; 
    File root = Environment.getExternalStorageDirectory();
    FileWriter nmea_writer = null;
    try {
        nmea_file = new File(root,"NMEA.txt");
        if(!nmea_file.exists()) {
                Log.w(TAG, "File Doesn't Exists!");
                nmea_file.createNewFile();
            }
        nmea_writer = new FileWriter(nmea_file);
        nmea_writer.append(nmea);
        nmea_writer.flush();
    }
    catch (IOException e) 
    {
        Log.w(TAG, "Unable to write", e);
    } 
    finally 
    {
        if (nmea_writer != null) 
        {
            try 
            {
                nmea_writer.close();
            } 
            catch (IOException e) 
            {
                Log.w(TAG, "Exception closing file", e);
            }
        }
    }
  }

你是否在使用sharedUserId到系统? - Neeraj Nama
5个回答

31

将其添加到manifest.xml文件中

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

4
他说他已经在清单文件中拥有这个权限,希望你能清楚地阅读问题。 - user1373996

20

如果SD卡被某些操作阻塞,例如:

  1. 准备从插槽卸载SD卡
  2. 设备作为外部USB驱动器连接到电脑上

2
愚蠢地忘记了我的SD卡也被挂载了,谢谢你的提示! - Dr1Ku

12

你可能想检查一下你是否可以访问SD卡。这里是如何在代码中实现:

if(!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
    Toast.makeText(this, "External SD card not mounted", Toast.LENGTH_LONG).show();
}

2

请注意,你的 uses-sdk 语句可能会影响到你写入 SD 卡的能力。

我的 AndroidManifest.xml 文件包含以下内容:

<uses-sdk minSdkVersion="8"/>

即使我没有声明android.permission.WRITE_EXTERNAL_STORAGE,也可以毫无问题地向SD卡写入。

当我更改了我的uses-sdk语句为:

<uses-sdk android:targetSdkVersion="9" minSdkVersion="8" />

我所有的SD卡写入都失败了,显示权限被拒绝!尽管应该声明了android.permission.WRITE_EXTERNAL_STORAGE权限,但是为什么一个使用了uses-sdk语句就能工作而另一个却不能呢?


1

如果你在模拟器中检查,请检查sdcard是否已经挂载。同时,在创建模拟器时不要忘记为sdcard分配一些空间。然后,您需要在清单文件中添加以下内容:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


检查挂载状态的 API 参考:http://developer.android.com/reference/android/os/Environment.html - 1737973

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接