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

三星S8/S9(Android 8.0.0)外部存储写入权限异常问题

解决Android 8.0 Galaxy S8/S9上APK下载权限拒绝问题

我来帮你搞定这个在Galaxy S8/S9(Android 8.0)上遇到的存储权限拒绝问题,结合你提供的代码和系统特性,我梳理了问题的核心原因和具体修复方案:

问题根源分析

你的模块在多数设备上正常,但在这两款三星设备上出问题,主要是权限请求逻辑的漏洞和清单配置错误导致的:

  • 重复权限请求被覆盖:你在checkPErmissions方法里分别调用了两次ActivityCompat.requestPermissions,这会导致系统只处理最后一次的请求(READ_EXTERNAL_STORAGE),第一次的WRITE_EXTERNAL_STORAGE请求直接被覆盖。用户可能只授权了读取权限,没授权写入权限,自然会触发权限拒绝异常。
  • 权限回调处理逻辑不严谨:回调里直接递归调用checkPErmissions,如果用户只授权了其中一个权限,会反复弹出权限框,而且没有判断两个权限是否都已授权。
  • 清单文件权限语法错误:你清单里的REQUEST_INSTALL_PACKAGES权限写法有误:<uses-permissionandroid:name="android.permission.REQUEST_INSTALL_PACKAGES"/>,permission和android之间少了空格,导致这个权限不生效——而Android 8.0及以上安装未知来源应用必须要这个权限,这也可能间接影响下载流程的完整性。

具体修复方案

1. 一次性请求多个存储权限

把读写权限放在同一个请求数组里,避免请求被覆盖,修改checkPermissions方法:

private void checkPermissions(){
    // 同时检查读写外部存储权限
    int writePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int readPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
    
    if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) {
        // 一次性请求两个权限,使用同一个requestCode
        ActivityCompat.requestPermissions(this, 
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 
                100);
    } else {
        // 权限已全部授权,开始下载/取消流程
        downloadOrCancel();
    }
}

2. 修正权限回调的处理逻辑

在回调里逐一检查所有权限是否都已授权,避免递归调用的问题:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 100) {
        boolean allPermissionsGranted = true;
        // 遍历所有权限结果,判断是否全部授权
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                allPermissionsGranted = false;
                break;
            }
        }
        if (allPermissionsGranted) {
            // 权限全部通过,执行下载操作
            downloadOrCancel();
        } else {
            // 提示用户需要权限,或者直接关闭页面
            Toast.makeText(this, "需要存储权限才能完成应用更新", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
}

3. 修复清单文件的权限语法错误

把REQUEST_INSTALL_PACKAGES权限的写法修正,确保Android 8.0及以上能正常安装APK:

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

4. 可选优化:适配更高版本存储机制

如果你的应用后续需要适配Android 10及以上系统,建议使用应用专属存储路径或者MediaStore来保存APK,这样可以不需要申请外部存储权限,进一步提升兼容性。不过针对当前Android 8.0的问题,前面三个修复已经足够解决。

验证步骤

  1. 在Galaxy S8/S9(Android 8.0)上测试,确认权限弹窗只出现一次
  2. 授权后检查是否能正常下载APK到指定路径
  3. 验证APK是否能正常安装(确保REQUEST_INSTALL_PACKAGES权限生效)

内容的提问来源于stack exchange,提问作者betwar512

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:40:56