You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:01:13