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

Android应用授予存储、音频运行时权限后自动关闭(非崩溃)仅真机复现求助

问题原因

部分国产定制ROM(小米、华为、OPPO等)在应用首次获取存储、录音这类敏感权限后,会主动销毁当前应用的Activity栈并触发重建,这是厂商的安全管控逻辑,原生模拟器没有对应定制所以不会复现。你用到的Dexter权限申请库已停止维护多年,未适配Android 11及以上系统的权限变更逻辑,也没有处理Activity重建的场景,权限回调绑定的旧Activity实例销毁后会导致逻辑中断,出现应用看似直接关闭的现象。

解决方案

1. 替换权限申请实现

弃用Dexter库,改用官方提供的Activity Result API实现权限申请,兼容性和稳定性更有保障:
首先注册权限申请回调:

private ActivityResultLauncher<String[]> requestPermissionLauncher =
    registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), result -> {
        boolean allGranted = true;
        for (Boolean granted : result.values()) {
            if (!granted) {
                allGranted = false;
                break;
            }
        }
        if (allGranted) {
            displaySongs();
        } else {
            // 自行补充权限被拒绝的处理逻辑
        }
    });

2. 增加权限预校验逻辑

不要每次进入Activity都直接触发权限申请,先判断权限是否已经授予,避免Activity重建后重复弹出权限申请框:

private boolean hasRequiredPermissions() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO) == PackageManager.PERMISSION_GRANTED
            && ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
    } else {
        return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
            && ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
    }
}

修改onCreate逻辑:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView = findViewById(R.id.listView);

    if (hasRequiredPermissions()) {
        displaySongs();
    } else {
        // 触发权限申请
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            requestPermissionLauncher.launch(new String[]{
                Manifest.permission.READ_MEDIA_AUDIO,
                Manifest.permission.RECORD_AUDIO
            });
        } else {
            requestPermissionLauncher.launch(new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.RECORD_AUDIO
            });
        }
    }
}

3. 适配高版本系统权限

Android 13及以上版本废弃了READ_EXTERNAL_STORAGE权限,需要替换为对应细分媒体权限,修改Manifest权限声明:

<!-- 适配Android 13以下版本 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- 适配Android 13及以上版本 -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:36:04