微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 11 打开失败:EACCES权限被拒绝

如何解决Android 11 打开失败:EACCES权限被拒绝

我正在开发一个应用程序。我将不同的文件类型(例如 docx、pdf、zip)上传到 WAMP 服务器。以下是我的内部存储的文件路径。

/storage/emulated/0/WhatsApp/Media/WhatsApp Documents/api.txt

我已在清单文件添加并允许存储权限,并在运行时读取文件。但是没有可用的内部存储权限请求。

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

而且对于 Android 10 我也使用了这个属性

android:requestLegacyExternalStorage="true"

但是当我从内部存储读取文件以进行上传时,我在 Android 11 操作系统(即三星 galaxy 板载 Android R)上收到此错误

java.io.FileNotFoundException:/storage/emulated/0/WhatsApp/Media/WhatsApp Documents/api.txt:打开失败:EACCES(权限被拒绝)

解决方法

在 Android 11 设备上,您的应用只能访问自己的文件。

以及公共目录中的一般媒体。

尝试列出该 whatsapp 目录中的文件,您将看到它们未列出。

您有两种读取文件的选项。

  1. 让用户使用 ACTION_OPEN_DOCUMENT 选择文件。
  2. 在清单中请求 MANAGE_EXTERNAL_STORAGE 并让用户确认。
,

您可以尝试在应用程序标记中使用清单文件中的 android:preserveLegacyExternalStorage="true" 标记。此标签用于访问 android 11 设备中的存储。有关更多详细信息,请点击此链接,它将根据您的要求向您解释更多。

我搜索了很多时间,得到了在清单文件中添加 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> 的解决方案,并尝试在 android 11 手机中获取文件访问权限。然后您将打开并从存储中读取文件。

但问题是 Play 商店不允许您在应用中使用 MANAGE_EXTERNAL_STORAGE 权限。允许开发人员使用它来访问所有文件需要时间。 Here the link is

,

尝试使用此方法获取路径.....

public static String getDriveFile(Context context,Uri uri) { 乌里 returnUri = uri; Cursor returnCursor = context.getContentResolver().query(returnUri,null,null);

    int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
    int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
    returnCursor.moveToFirst();
    String name = (returnCursor.getString(nameIndex));
    String size = (Long.toString(returnCursor.getLong(sizeIndex)));
    File file = new File(context.getCacheDir(),name);
    try {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        FileOutputStream outputStream = new FileOutputStream(file);
        int read = 0;
        int maxBufferSize = 1 * 1024 * 1024;
        int bytesAvailable = inputStream.available();

        //int bufferSize = 1024;
        int bufferSize = Math.min(bytesAvailable,maxBufferSize);

        final byte[] buffers = new byte[bufferSize];
        while ((read = inputStream.read(buffers)) != -1) {
            outputStream.write(buffers,read);
        }
        Log.e("File Size","Size " + file.length());
        inputStream.close();
        outputStream.close();
        Log.e("File Path","Path " + file.getPath());
        Log.e("File Size","Size " + file.length());
    } catch (Exception e) {
        Log.e("Exception",e.getMessage());
    }
    return file.getPath();

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。