写入SD卡时,权限被拒绝

时间:2013-01-23 09:10:29

标签: android permissions permission-denied

我正在尝试将文件写入SDCard,但我在logcat中遇到错误:

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)

这里是我写入SDCard的代码:

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 个答案:

答案 0 :(得分:9)

要写入Sdcard,您需要在清单文件中授予权限

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

答案 1 :(得分:4)

您需要确保已获得@Ram提及的许可,已安装SD卡。您可以通过以下方式检查它是否已安装: -

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

您应该优雅地处理未安装的卡,但常见的问题是,如果您的手机通过USB线缆插入,可能是通过桌面操作系统安装的,这意味着它不是由Android安装的。

谢谢,

赖安

答案 2 :(得分: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

答案 3 :(得分:0)

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

答案 4 :(得分:-3)

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