安卓音频权限申请适配安卓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("没有权限,播放失败")
        }
    }

亲测有效。

播放的时候也需要检测:

相关推荐
飞Link7 小时前
【网络与 AI 工程的交叉】多模态模型的数据传输特点:视频、音频、文本混合通道
网络·人工智能·音视频
音视频牛哥8 小时前
从“能播”到“能控”:深入解读 SmartMediakit 与 OTT 播放器的架构裂变
音视频·ott·低延迟rtsp播放器·smartmediakit·低延迟rtmp播放器·低延迟音视频技术方案·具身智能低延迟rtsp方案
_李小白8 小时前
【Android FrameWork】第二十四天:Activity生命周期是如何运行的
android
ytttr8738 小时前
基于C#的CAN总线数据解析BMS上位机
android·unity·c#
darryrzhong9 小时前
FluxImageLoader : 基于Coil3封装的 Android 图片加载库,旨在提供简单、高效且功能丰富的图片加载解决方案
android·github·android jetpack
pandarking9 小时前
[CTF]攻防世界:题目名称-warmup
android·web安全·网络安全
我命由我123459 小时前
Android 开发问题:在无法直接获取或者通过传递获取 Context 的地方如何获取 Context
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
惟恋惜10 小时前
Jetpack Compose之“副作用”的讲解
android
モンキー・D・小菜鸡儿11 小时前
Android14 新特性与适配指南
android·kotlin·安卓新特性
技术摆渡人12 小时前
Android系统技术探索(1)启动流程
android