Android 音视频知识点(一)

162 阅读1分钟

本系列着重介绍 Android 音视频开发的知识点

1、基本环境 要使用 Android 进行音视频开发,首先要获得相关系统权限。需要考虑api版本兼容性

AndroidManifest.xml 权限设置内容,兼容旧版本

<uses-feature android:name="android.hardware.camera.any" /> <!-- 需要设备有相机 -->
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<!-- Android 13+ 专用权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

<!-- 兼容旧版本(Android 12 及以下) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

Activity 权限申请模版,使用 JetpackCompose 组件

针对 api 33 或以上的系统,需要分别申请 图片、音频、视频 权限

class MainActivity : AppCompatActivity() {

    companion object {
        private const val TAG: String = "Ideacode_MediaStudy"
    }

    private val requestPermissions = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {permissions ->
        permissions.entries.forEach {entry ->
            val permission = entry.key
            val isGranted = entry.value

            Log.d(TAG, "permission:${permission}  isGranted:${isGranted}")

            if (isGranted) {
                Log.d(TAG, "${permission} is granted.")
            } else {
                val shouldShow = ActivityCompat.shouldShowRequestPermissionRationale(this,
                    permission)

                Log.d(TAG, "permission:${permission}  shouldShow:${shouldShow}")

                if (!shouldShow) {
                    Log.d(TAG, "${permission} denied permanently")
                } else {
                    Log.d(TAG, "${permission} denied")
                }
            }
        }

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<Button>(R.id.request_permission).setOnClickListener() {
            checkAndRequestPermissions()
        }
    }

    private fun checkAndRequestPermissions() {
        val permissionsNeeded = mutableListOf<String>()

        getRequestPermissions().forEach { permission ->
            Log.d(TAG, "request permission: ${permission}")

            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                permissionsNeeded.add(permission)
            }
        }

        permissionsNeeded.forEach {permissionNeeded ->
            Log.d(TAG, "permissionNeeded: ${permissionNeeded}")
        }

        if (permissionsNeeded.isNotEmpty()) {
            requestPermissions.launch(permissionsNeeded.toTypedArray())
        } else {
            Toast.makeText(this, "所有权限都已经赋予", Toast.LENGTH_LONG).show()
        }
    }

    private fun getRequestPermissions(): Array<String> {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            arrayOf(Manifest.permission.READ_MEDIA_IMAGES,
                Manifest.permission.READ_MEDIA_VIDEO,
                Manifest.permission.READ_MEDIA_AUDIO,
                Manifest.permission.RECORD_AUDIO,
                Manifest.permission.CAMERA)
        } else {
            arrayOf(
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.RECORD_AUDIO,
                Manifest.permission.CAMERA)
        }
    }
}

完整代码:e.coding.net/g-ithd5590/…