微信视频界面提示“无法获取摄像头数据,请再次尝试”

问题原因:人脸识别抢占相机后,微信无重连机制,因此微信的Camera client 销毁后无更新,导致连接失败

解决方法:

此HAL在framework层增加了一个强制写优先级的逻辑,使人脸识别无法抢占相机:

if(strcmp("facerecognition", packageName) == 0 || (int)(priorityScores.size() - 1) != 0 ) {
    
    //if FaceRecognition want to grab camera , set FR priority as 800 (higher value means lower priority)

    priorityScores[priorityScores.size() - 1] = 800;

}

这段代码加在 CameraService::handleEvictionsLocked函数中。这个函数本就是处理Camera client连接冲突问题,在原始的逻辑中就有:

std::vector<int> priorityScores(ownerPids.size());

std::vector<int> states(ownerPids.size());

// Get priority scores of all active PIDs

status_t err = ProcessInfoService::getProcessStatesScoresFromPids(

ownerPids.size(), &ownerPids[0], /*out*/&states[0],

/*out*/&priorityScores[0]);

if (err != OK) {

    ALOGE("%s: Priority score query failed: %d",__FUNCTION__, err);

    return err;

}



// Update all active clients' priorities

std::map<int,resource_policy::ClientPriority> pidToPriorityMap;

for (size_t i = 0; i < ownerPids.size() - 1; i++) {
    pidToPriorityMap.emplace(ownerPids[i],resource_policy::ClientPriority(priorityScores[i], states[i]));

}
mActiveClientManager.updatePriorities(pidToPriorityMap);

在这里 pidToPriorityMap.emplace 会将优先级信息从 priorityScores[i] 复制到 pidToPriorityMap,并用 mActiveClientManager.updatePriorities 跟新到ClientManager中。

所以我们在赋值之前,加入判断,如果当前包名是 facerecognition 且当前数组索引不等于0 (当不发生抢占时,索引一定为0,所以只有当面部识别试图抢占时才会进入此case)

优先级的数值因项目而已 之前660平台上优先级只有0~11,但在我了解到的目前所使用的845上,或者说Android O上,初始化priority value = -800,而且这个值越小,其代表的优先级越高。

所以在我增加的case中 将强制写priority value为800, 以保证其无法抢占微信Camera client。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值