新版Android系统下能否检测非通话类应用的麦克风使用情况?
Android 10+ 检测非通话类麦克风录制应用的可行方案
在Android 10及以上系统中,仍然可以检测到正在主动录制音频且未使用VOICE_CALL/VOICE_COMMUNICATION音频来源的应用,但需要适配新版系统的API和权限规则,以下是具体实现方案:
1. 利用AudioRecordingCallback监听录制状态
Android 10(API 29)引入了AudioManager.AudioRecordingCallback,可以监听系统内所有音频录制的状态变化,包括录制的启动、停止,以及录制使用的音频源信息。通过过滤掉通话类音频源,即可定位到目标应用。
核心代码示例
val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager val recordingCallback = object : AudioManager.AudioRecordingCallback() { override fun onRecordingConfigChanged(configs: MutableList<AudioRecordingConfiguration>) { super.onRecordingConfigChanged(configs) configs.forEach { config -> // 排除通话类音频源的录制 if (config.clientAudioSource != MediaRecorder.AudioSource.VOICE_CALL && config.clientAudioSource != MediaRecorder.AudioSource.VOICE_COMMUNICATION) { val packageName = packageManager.getPackagesForUid(config.clientUid)?.firstOrNull() val isActiveRecording = config.isActive if (isActiveRecording && packageName != null) { // 这里处理检测到的录制应用逻辑 Log.d("MicMonitor", "检测到应用 [$packageName] 正在使用麦克风录制") } } } } } // 注册监听,指定主线程Handler处理回调 audioManager.registerAudioRecordingCallback(recordingCallback, Handler(Looper.getMainLooper()))
权限要求
- 在
AndroidManifest.xml中声明危险权限:<uses-permission android:name="android.permission.RECORD_AUDIO" /> - 运行时动态请求
RECORD_AUDIO权限,只有获取该权限后,才能监听其他应用的录制状态;无权限时仅能监听自身应用的录制。
2. 适配系统机制变化
Android 10+对前台服务和麦克风抢占逻辑的调整,不影响该方案的有效性:
- 麦克风抢占规则:非通话类录制无法抢占正在进行的通话类录制,但会被通话类录制抢占;非通话类录制之间会互相抢占,
AudioRecordingCallback会在录制状态变更时及时触发,确保能捕捉到当前活跃的录制应用。 - 前台服务限制:如果需要持续后台检测,需将应用设为前台服务,避免被系统回收监听回调。
3. 兼容性与注意事项
- 版本适配:该API仅支持Android 10及以上,需通过
Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q做版本判断。 - ROM兼容性:部分定制ROM可能对该API做了限制,需在目标设备上进行测试验证。
- 资源释放:不再需要监听时,调用
audioManager.unregisterAudioRecordingCallback(recordingCallback)释放资源。
内容的提问来源于stack exchange,提问作者Gustafah88
相关产品推荐
相关产品推荐

