使用Android创建文件时获取权限被拒绝错误,即使获得了权限

时间:2016-11-30 06:18:56

标签: android android-studio android-permissions

我的清单中有这个:

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

这是我尝试创建和写入文件的位置(它位于名为EnterUserInfo.java的文件中:

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};


/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        System.out.println("INSIDEEEEEE");
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    } else {
        System.out.println("HEREEEEEEEEE");
    }
}

private void writeToFile(String data, Context context) {

    verifyStoragePermissions(this);
    String FILENAME = "new_clients.txt";
    String string = "hello world!";

    try {
        FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
        fos.write(string.getBytes());
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


    try {
        FileOutputStream fos = context.openFileOutput("new_clients.txt", Context.MODE_PRIVATE);
        fos.write(data.getBytes());
        fos.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

当我尝试创建文件时,会出现以下内容:

I/System.out: HEREEEEEEEEE
W/ContextImpl: Failed to ensure /data/user/0/c.b.project/files: mkdir failed: EACCES (Permission denied)
W/FileUtils: Failed to chmod(/data/user/0/cs.b07.cscb07courseproject/files): android.system.ErrnoException: chmod failed: EACCES (Permission denied)
W/System.err: java.io.FileNotFoundException: /data/user/0/c.b.project/files/new_clients.txt (Permission denied)
W/System.err:     at java.io.FileOutputStream.open(Native Method)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
W/System.err:     at android.app.ContextImpl.openFileOutput(ContextImpl.java:506)
W/System.err:     at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:192)
W/System.err:     at EnterUserInfo.writeToFile(EnterUserInfo.java:69)

如您所见,它打印here表示已授予权限,但在它发出Permission Denied错误之后。知道如何解决这个问题吗?

编辑:在旁注上,当它说它试图保存到/data/user/0/cs.b07.cscb07courseproject/files时,是在项目中还是保存在我的计算机上?因为当我去我的终端时,cd /data/cd /data都找不到。

编辑:writeToFile()在上面发布的同一个类和文件中调用,这是代码(当用户点击UI中的&#34; register&#34;按钮时,调用下面的函数:

public void createNewUser(View view) {
    // a data string is created here:
    // String data = "asd";
    writeToFile(data, this);
}

编辑2:请注意我在verifyStoragePermissions()方法中确实在运行时请求了权限。除非那种要求许可的方式有问题(我不认为这是因为提示会出现要求用户许可),所以我认为问题出在其他方面。

3 个答案:

答案 0 :(得分:1)

您不需要任何权限来致电openFileOutput()。这会将文件写入专用应用程序特定的数据区域,该区域由您的应用程序拥有。

判断这些错误:

W/ContextImpl: Failed to ensure /data/user/0/c.b.project/files: mkdir failed: EACCES (Permission denied)
W/FileUtils: Failed to chmod(/data/user/0/cs.b07.cscb07courseproject/files): android.system.ErrnoException: chmod failed: EACCES (Permission denied)

看起来有人更改了应用程序私有数据目录/data/user/0/c.b.project/上的文件所有权(或访问权限)。该目录应归您应用程序的用户ID所有,因此您的应用程序应具有写入该应用程序的必要权限。

卸载您的应用程序(应该删除该目录),然后重新安装您的应用程序(应该使用正确的权限重新创建目录)。

答案 1 :(得分:0)

在运行时请求权限

从Android 6.0(API级别23)开始,用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时。此方法简化了应用安装过程,因为用户在安装或更新应用时无需授予权限。

More about runtime permission
Refer Answer

答案 2 :(得分:0)

首先,您必须检查您使用的是哪个Android SDK版本

如果小于23 ,只需将您的权限放在清单文件中就可以了

如果Android版本大于23 您应该将所有权限放在清单文件中,并且您应该询问用户运行时权限(仅首次尝试)
为此,您应该点击此链接https://stackoverflow.com/a/33162451/4741746

你可以做的另一件事是将compileSdkVersion和buildToolsVersion改为23以下(但我不建议你这样做因为23以上的新功能你不能使用)

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

   defaultConfig {
      minSdkVersion 16
      targetSdkVersion 23
   }
} 

如果不工作让我知道