问题描述:
发现在android 加密的情况下,mm-camera-daemon进程会在手动解锁以后才会启动,这就导致在cameraserver启动的时候无法匹配到对应的camera devices。进而导致后悔一直connect camera 失败,提示没有对应的camera.
android 8.0 系统启动的时候会启动涉及camera的进程有三个:
该进程的启动控制在:hardware/interfaces/camera/provider/2.4/default/[email protected]
2、cameraserver
该进程的启动控制在:frameworks/av/camera/cameraserver/cameraserver.rc
3、mm-qcamera-daemon
该进程的启动控制在:device/qcom/XXXX/init_target.rc
[email protected]启动以后会通过hal层的interface接口获取底层的camera devices等信息,
hardware/qcom/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_interface.c
然而这个底层的camera probe 是在mm-camera-daemon中进行的。
但是在android 加密的情况下,mm-qcamera-daemon会等到手动解锁以后才会启动,导致mm-qcamera-daemon启动太慢,hal无法获得camera的驱动信息,进而认为没有camera,后续就会出现camera一直连接不上,报错:
03-20 14:40:07.880 2061 2193 I CameraService: CameraService::connect call (PID -1 "com.hmdglobal.camera2", camera ID 0) for HAL version 256 and Camera API version 1
03-20 14:40:07.881 2061 2193 E CameraService: CameraService::connect X (PID 13570) rejected (invalid camera ID 0)
即提示没有对应的camera。
解决方法是:
在mm_camera_interface.c中
get_num_of_cameras时候添加判断当前是否加密状态,若加密状态,则一直自循环,知道解锁后再去获取camera。
具体patch:
@@ -1772,6 +1772,38 @@ void sort_camera_info(int num_cam)
return;
}
+
+/*===========================================================================
+ * FUNCTION : checkEncryptionCompleted
+ *
+ * DESCRIPTION: check data encryption completed or not
+ *
+ * PARAMETERS :
+ *
+ * RETURN : status of encryption process
+ *==========================================================================*/
+bool checkEncryptionCompleted() //添加判断函数,判断当前是否加密状态
+{
+ char property[PROPERTY_VALUE_MAX];
+ bool is_EncryptionDone = false;
+ property_get("ro.crypto.state", property, "unencrypted");
+ if (!strcmp(property, "encrypted")) {
+ property_get("ro.crypto.type", property, "block");
+ if (!strcmp(property, "block")) {
+ property_get("vold.decrypt", property, "");
+ if (!strcmp(property, "trigger_restart_framework")) {
+ is_EncryptionDone = true;
+ }
+ }
+ } else if (!strcmp(property, "unsupported")) {
+ is_EncryptionDone = true;
+ LOGE(" Encryption not enabled , skip this");
+ }
+ return is_EncryptionDone;
+}
/*===========================================================================
* FUNCTION : get_num_of_cameras
*
@@ -1874,16 +1905,18 @@ uint8_t get_num_of_cameras()
cfg.cfgtype = CFG_SINIT_PROBE_WAIT_DONE;
cfg.cfg.setting = NULL;
+
+ while (1) { //添加循环判断,该循环10s执行一次
+ if(checkEncryptionCompleted()){
+ LOGD("Data Encryption completed, start Camera Daemon");
+ break;
}
+ LOGD(" Camera Daemon not started yet , Waiting for encryption to complete");
+ }
+
+ if (ioctl(sd_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &cfg) < 0)
close(sd_fd);
dev_fd = -1;