问题原因:人脸识别抢占相机后,微信无重连机制,因此微信的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。