本系列着重介绍 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)
}
}
}