如何解决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 目录中的文件,您将看到它们未列出。
您有两种读取文件的选项。
- 让用户使用 ACTION_OPEN_DOCUMENT 选择文件。
- 在清单中请求 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] 举报,一经查实,本站将立刻删除。