Android P系统禁止闲置APP在后台使用麦克风的问题

android P的系统为了进一步提高用户的安全隐私,禁止了后台闲置应用使用麦克风。

所以当一个app进入后台后,变成闲置idle状态,是无法在使用麦克风录音的。

下面的分析是从系统framework层代码入手,libaudiopolicyservice.so文件源码,来了解后台闲置app无法使用麦克风的原理,并从系统的角度,屏蔽了后台app无法使用麦克风的限制。

逻辑分析

代码路径:frameworks\av\services\audiopolicy\service\AudioPolicyService.cpp

禁止闲置app使用麦克风的逻辑是在AudioPolicyService中处理的。

安卓应用在后台一段时间后,就会被置为闲置状态(Idel),下面是几个监听应用激活,闲置状态的方法:

void AudioPolicyService::UidPolicy::onUidActive(uid_t uid) {
    updateUidCache(uid, true, true);
}

void AudioPolicyService::UidPolicy::onUidGone(uid_t uid, __unused bool disabled) {
    updateUidCache(uid, false, false);
}

void AudioPolicyService::UidPolicy::onUidIdle(uid_t uid, __unused bool disabled) {
    updateUidCache(uid, false, true);
}

都执行了updateUidCache(),当闲置Idle状态时,传入的参数是false,true.我们在来看看updateUidCache。

void AudioPolicyService::UidPolicy::updateUidCache(uid_t uid, bool active, bool insert) {
    if (isServiceUid(uid)) return;
    bool wasActive = false;
    {
        Mutex::Autolock _l(mLock);
        updateUidLocked(&mCachedUids, uid, active, insert, nullptr, &wasActive);
        // Do not notify service if currently overridden.
        if (mOverrideUids.find(uid) != mOverrideUids.end()) return;
    }
    bool nowActive = active && insert;
    if (wasActive != nowActive) notifyService(uid, nowActive);
}

updateUidCache中调用了notifyService,并把nowActive的表示传给了notifyService,Idle状态传入的nowActive是false.

void AudioPolicyService::UidPolicy::notifyService(uid_t uid, bool active) {
    sp<AudioPolicyService> service = mService.promote();
    if (service != nullptr) {
        service->setRecordSilenced(uid, !active);
    }
}

关键的函数: service->setRecordSilenced(uid, !active);

setRecordSilenced函数就是将麦克风mute掉,导致应用无法在使用麦克风进行录音了。

从系统角度解决问题:

修改notifyService为以下:

void AudioPolicyService::UidPolicy::notifyService(uid_t uid, bool active) {
    sp<AudioPolicyService> service = mService.promote();
    if (service != nullptr) {
    	//将active标志置为true,这样不管是闲置idle状态还是active状态,都可以使用麦克风录音
		active = true;
        service->setRecordSilenced(uid, !active);
    }
}

但是这样安卓为了保护用户隐私的初衷就改变了。

从APP角度解决问题

上述的分析中得知,系统只对后台闲置服务进行闲置,不让后台服务偷偷使用麦克风。

那么我的应用程序中,把后台服务改成前台服务,就可以解决这个问题。

目前Android9.0的前台服务中,必须弹出一个通知,告知用户,某个前台服务正在运行。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值