当前位置: 首页 > 知识库问答 >
问题:

使用Android创建文件时出现权限被拒绝错误,即使已授予权限

欧浩淼
2023-03-14

我的清单里有这个:

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

这是我尝试创建和写入文件的地方(它在一个名为Enterprise UserInfo.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)

如您所见,它在此处打印,表示授予了权限,但紧接着出现了“权限被拒绝”错误。有没有办法解决这个问题?

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

编辑:在上面发布的同一类和文件中调用writeToFile(),这就是代码(当用户点击UI中的“注册”按钮时,会调用下面的函数:

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

编辑2:请注意,我确实在运行时在我的验证存储权限()方法中请求了权限。除非这种请求权限的方式有问题(我不认为这是因为确实出现了请求用户权限的提示),否则我认为问题在于其他方面。

共有3个答案

傅翰池
2023-03-14

嗨,首先你必须检查你使用的是哪个android SDK版本

如果它小于23,您只需将您的权限放在清单文件中即可正常工作

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

您可以做的另一件事是将compileSdkVersion和buildToolsVersion更改为23以下,如22(但我不建议您这样做,因为23以上的新特性您无法使用)

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

   defaultConfig {
      minSdkVersion 16
      targetSdkVersion 23
   }
} 

如果不工作,请告诉我

尹承泽
2023-03-14

在运行时请求权限

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

有关运行时权限的详细信息,请参阅答案

巢承安
2023-03-14

调用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)

似乎有人更改了应用程序私有数据目录上的文件所有权(或访问权限)。此目录应由应用程序的用户ID所有,因此应用程序应有必要的写入权限。

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

 类似资料:
  • 我正在尝试创建一个图像文件到外部存储器以共享它。但在尝试下面的代码时,我遇到了一些错误 到目前为止,我找到的解决方案只有使用 和 设置权限 我已经用过了。但仍然在错误选项卡中获得如下错误 E/path 和在信息选项卡中 W/系统。错误:java。木卫一。IOException:权限被拒绝 W/系统。错误:在java。木卫一。UnixFileSystem。CreateFileExclusivey0(

  • 我分配一个角色权限来创建数据库。相同的角色被分配给登录用户,但是当我试图使用分配角色的登录用户创建新数据库时,我得到权限拒绝错误。 无法执行语句。权限拒绝,数据库主,所有者dbo。运行此命令需要以下权限:CREATE DATABASE。赛贝斯错误代码=10331严重级别=14,状态=3,事务状态=0第1行 我用15.5分和16分试了一下。我做错什么了吗?我们需要考虑其他参数吗?我经历了这次讨论 h

  • 首先,我想说我可能缺少了一些基本的东西,但实际上我是Symfony的新手。 当我从terminal创建包时(我使用的是mac),它给了我这个错误;

  • 我有一个针对SDK28的Android应用程序,所以我有处理的权限。我检查是否设置了,但当Exoplayer尝试读取文件(我验证该文件确实存在)时,我看到 com.google.android.exoplayer2.upstream.filedatasource$filedatasourceException:java.io.fileNotfoundexception:/storage/emula

  • 我添加了使用权限,包括WRITE_EXTERNAL_STORAGE,android.permission.相机,READ_EXTERNAL_STORAGEAndroidManifest.xml. 当我在Nexus6(API 24)中运行我的应用程序时,它向我抛出了以下错误: java.io.IOException:权限被拒绝 这是我的代码: 如何在权限相机运行时打开之前使用它?

  • 我在清单中添加了对外部存储设备的写访问权限,并在我的Android手机中授予了这些权限。如果他们不存在,我甚至会在执行时要求他们。 然而,我总是得到这个例外: Java语言io。FileNotFoundException:/storage/simulated/03b3d97bd-5186-4506-97dc-9994b7ce0761(权限被拒绝) 你知道为什么吗? 在清单文件中: