一、背景
Android 14系统强化了隐私保护机制,默认禁止应用在后台获取麦克风权限。表现为:
录音APK切换到后台时生成空文件
无系统错误提示但录音数据丢失
仅前台应用可获得完整录音权限
二、解决方案
方案一:前台服务绑定(推荐)
RecordService中使用startForeground方法将这个服务设置成前台服务,然后在这个RecordService中实现录音逻辑。
public class RecordService extends Service {
private MediaRecorder mRecorder;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 必须添加前台通知
startForeground(NOTIFICATION_ID, buildNotification());
startRecording();
return START_STICKY;
}
// ...完整实现参考
}
AndroidManifest.xml中:android:foregroundServiceType="microphone"
<service android:name="com.example.record.RecordService"
android:foregroundServiceType="microphone"
android:exported="false"
tools:ignore="ForegroundServicePermission" />
方案二:系统级适配(需ROOT)
目标文件:修改Android系统中的
AppOpsService.java
文件,该文件负责权限管理。需要添加白名单检测逻辑,以绕过后台录音限制
// 在AppOpsService.java中添加白名单检测逻辑
if (op == OP_RECORD_AUDIO) {
String allowList = SystemProperties.get("persist.sys.allow_background_record", "");
if (allowList.contains(packageName)) {
return MODE_ALLOWED; // 白名单应用允许后台录音
}
}
2、配置设备属性(编译或运行时设置)
编译时配置:在Android系统编译阶段,通过PRODUCT_PROPERTY_OVERRIDES
添加属性:
# 在设备makefile中配置
PRODUCT_PROPERTY_OVERRIDES += \
persist.sys.allow_background_record=com.example.recorder
运行时配置(需ADB调试):通过ADB命令临时生效属性:
adb shell setprop persist.sys.allow_background_record com.example.recorder