Android Galaxy S21访问Download文件遇EACCES权限拒绝问题求助
解决Android设备(如Galaxy S21)上的文件权限拒绝问题
在Galaxy S21等部分Android设备上访问/storage/emulated/0/Download/Joueurs.xlsx时触发错误:
java.io.FileNotFoundException: /storage/emulated/0/Download/Joueurs.xlsx: open failed: EACCES (Permission denied)
已参考相关方案修改Manifest和代码,但问题未解决。Galaxy S21无法在设置中切换多媒体权限为“所有文件”,且模拟器难以复现该问题。
相关Manifest配置及代码片段
Manifest文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.prod.gfer94" android:minSdkVersion="8" android:targetSdkVersion="19"> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage"/> <application android:icon="@drawable/icogaef" android:label="@string/app_name" android:roundIcon="@drawable/icogaef" android:theme="@style/AppTheme" android:requestLegacyExternalStorage="true"> <activity android:name=".MainActivity" android:exported="true" android:label="G.F.E.R94" android:textColor="@color/colorBleuDistrict">
代码片段
ImageButton BoutonLicencies = findViewById(R.id.imageButtonLicencies); BoutonLicencies.setOnClickListener(v -> { if (accesLicencies == 1){ searchFile("Joueurs.xlsx"); try { FileInputStream fileJoueur = null; if(!fileName.canRead()) fileName.setReadable(true); fileJoueur = new FileInputStream(fileName); XSSFWorkbook myWorkBook = null; myWorkBook = new XSSFWorkbook(fileJoueur); XSSFSheet mySheet = myWorkBook.getSheetAt(0); mySheet = myWorkBook.getSheetAt(0); Iterator<Row> rowIterator = mySheet.iterator();
解决思路
- 适配Android 11+的全文件权限授权流程:
MANAGE_EXTERNAL_STORAGE权限无法自动授予,需主动引导用户跳转到系统设置页面授权。可通过以下Intent打开授权页面:Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); - 改用合规方式访问公共目录文件:放弃直接操作绝对路径,使用MediaStore或存储访问框架(SAF)读取Download目录下的文件。比如通过MediaStore查询文件名获取Uri,再用ContentResolver打开输入流,无需依赖特殊权限。
- 补全动态权限申请:即使
targetSdkVersion低于23,Android 6.0+系统仍需动态申请READ_EXTERNAL_STORAGE权限,确保用户已授权该权限后再尝试访问文件。 - 放弃
requestLegacyExternalStorage依赖:该属性仅对targetSdk 29有效,Android 11及以上版本会忽略此配置,无法通过它绕过Scoped Storage限制。 - 验证文件路径与存在性:打开文件前打印
fileName.getAbsolutePath()确认路径正确,同时调用fileName.exists()检查文件是否真实存在,避免因文件被删除/移动导致的异常。
内容的提问来源于stack exchange,提问作者Georges GRESSIEN
相关产品推荐
相关产品推荐

