安卓音频权限申请适配安卓6-14

kotlin 复制代码
    fun hasAudioPermissions(): Boolean {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.READ_MEDIA_AUDIO
            ) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(
                        this,
                        Manifest.permission.RECORD_AUDIO
                    ) == PackageManager.PERMISSION_GRANTED
        } else {
            ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.RECORD_AUDIO
            ) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(
                        this,
                        Manifest.permission.READ_EXTERNAL_STORAGE
                    ) == PackageManager.PERMISSION_GRANTED
        }
    }

    private fun requestAudioPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            requestPermissionLauncher.launch(
                arrayOf(
                    Manifest.permission.READ_MEDIA_AUDIO,
                    Manifest.permission.RECORD_AUDIO
                )
            )
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissionLauncher.launch(
                arrayOf(
                    Manifest.permission.RECORD_AUDIO,
                    Manifest.permission.READ_EXTERNAL_STORAGE
                )
            )
        } else {
            // 对于安卓6.0以下的版本,不需要动态请求权限
            // 这些版本在安装时就会请求所有权限
        }
    }

    // 注册权限请求
    private val requestPermissionLauncher = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissions ->
        // 检查权限结果
        val readMediaAudioGranted = permissions[Manifest.permission.READ_MEDIA_AUDIO] ?: false
        val recordAudioGranted = permissions[Manifest.permission.RECORD_AUDIO] ?: false
        val readExternalStorageGranted = permissions[Manifest.permission.READ_EXTERNAL_STORAGE] ?: false

        if ((readMediaAudioGranted && recordAudioGranted) || (recordAudioGranted && readExternalStorageGranted)) {
            // 权限已授予
        } else {
            // 权限被拒绝
            this.showToast("没有权限,播放失败")
        }
    }

亲测有效。

播放的时候也需要检测:

相关推荐
汪海游龙30 分钟前
流式回复结尾的那一下闪:逐帧定位 Compose 聊天列表的三处布局跳动
android·性能优化·kotlin
2601_965454231 小时前
开源项目发布会不用剪视频,AI一键生成宣传片
人工智能·音视频
2501_915909063 小时前
Ipa Guard 防护上架,混淆、重签名和回归测试怎么做
android·ios·小程序·https·uni-app·iphone·webview
码点3 小时前
Android ANR 全解析 与 traces 分析实战
android
敲代码的瓦龙4 小时前
Jetpack?lifecycle!!!
android·kotlin
苦瓜花4 小时前
Hilt用使用及原理
android
2601_955662464 小时前
1300多种音色怎么挑?不同短视频场景的配音思路
人工智能·音视频
2601_965619695 小时前
新闻数据可视化视频:AI自动生成图表动画的完整流程
人工智能·信息可视化·音视频
深度学习04075 小时前
MySQL InnoDB Cluster 部署完整文档
android·mysql·adb
企业数字化笔记6 小时前
一段视频有两次跳投,动作分析为什么要先做事件分段?
人工智能·python·音视频