写入sd卡时权限被拒绝

8

我正在尝试将文件写入SD卡,但是在日志中出现了错误:

01-24 09:03:33.647: W/System.err(3353): java.io.FileNotFoundException: /mnt/sdcard/fun/itisfun.txt: open failed: EACCES (Permission denied)
    01-24 08:24:28.007: W/System.err(3353): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
    01-24 09:03:33.756: W/System.err(3353):at libcore.io.Posix.open(Native Method)

这里是写入SD卡的代码:

File root = null;     
try {  
    // check for SDcard   
    root = Environment.getExternalStorageDirectory();                   
    Log.i(TAG,"path.." +root.getAbsolutePath());  

    //check sdcard permission  
    if (root.canWrite()){  
        File fileDir = new File(root.getAbsolutePath()+"/fun/");  
        fileDir.mkdirs();  

        File file = new File(fileDir, "itisfun.txt");  
        FileWriter filewriter = new FileWriter(file);  
        BufferedWriter out = new BufferedWriter(filewriter);  
        out.write("I m enjoying......dude");  
        out.close();
    }
} catch(...) {
    ...
}

清单:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<permission  android:name="android.permission.INTERNET"></permission>
5个回答

9

如果要向Sdcard写入数据,您需要在清单文件中授予权限。

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

哎呀!我的错,我也这样做了,但是我遇到了错误,让我更新一下我的问题。 - zaamm

4

您需要确保拥有@Ram提到的权限并且SD卡已挂载。您可以通过以下方式检查它是否已挂载:

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))

您应该优雅地处理未安装的卡,但一个常见的陷阱是,如果您的手机通过USB电缆连接,则可能已被桌面操作系统挂载,这意味着它未被Android挂载。

谢谢,

Ryan


我仍然有同样的问题。 - zaamm
原始异常是FileNotFoundException,你确定文件在那里吗?如果日志已更改,你能发布日志吗? - Ryan

0
这是我使用的一点代码,
public void yourMethod(){

File root = getDir(getApplicationContext());     
    try {  
        File fileDir = new File(root.getAbsolutePath()+"/fun/");  
        fileDir.mkdirs();  

        File file = new File(fileDir, "itisfun.txt");  
        FileWriter filewriter = new FileWriter(file);  
        BufferedWriter out = new BufferedWriter(filewriter);  
        out.write("I m enjoying......dude");  
        out.close();

    } catch(...) {
    ...
    }
}


public File getDir(Context context) {

        if (android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED))
            cacheDir = new File(
                    android.os.Environment.getExternalStorageDirectory(),
                        DIRECTORY_NAME);
        else
            cacheDir = context.getCacheDir();
        return cacheDir;
    }

如果没有外部存储,它基本上会使用手机内部缓存(对于大文件来说不是太好)。
阅读this

我已经编辑过了,但它真的很简单。 - Hades

0
如果您使用的是Android 4.4版本,请阅读这里:http://www.androidcentral.com/kitkat-sdcard-changes。基本上,您无法再在驱动器上的任何位置进行读写操作。您只能写入您的私有目录和您已成为所有者的目录。

-3
  1. 检查您的SD卡上是否存在目录fun和文件itisfun.txt,如果您想通过程序创建它们,您必须添加权限:
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    此权限允许应用程序创建文件或目录,而权限:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />仅允许应用程序读取和写入已经存在的文件。
  2. 确保您的权限位于<application>标签之外,通常在其之前。

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