AOSP 7.0后IMEI为空的问题

可能很多编译aosp源码的朋友都发现了一个问题,就是在android7.0之后 IMEI获取为空.

我用的分支是 android-8.1.0_r41

解决办法如下:

 在文件 aosp/hardware/ril/reference-ril/reference-ril.c  文件中有一个方法 如下

static void
onRequest (int request, void *data, size_t datalen, RIL_Token t)
{
    ATResponse *p_response;
    int err;

    RLOGD("onRequest: %s", requestToString(request));

     
    if (sState == RADIO_STATE_UNAVAILABLE
        && request != RIL_REQUEST_GET_SIM_STATUS
    ) {
        RIL_onRequestComplete(t, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
        return;
    }

  
    if (sState == RADIO_STATE_OFF
        && !(request == RIL_REQUEST_RADIO_POWER
            || request == RIL_REQUEST_DEVICE_IDENTITY //新增加行 避免请求不通过直接返回
            || request == RIL_REQUEST_GET_SIM_STATUS)
            ) {
        RIL_onRequestComplete(t, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
        return;
    }

 在最后的判断中增加文中的那一行判断.

 继续在该方法中下面的代码片段做出修改

 case RIL_REQUEST_DEVICE_IDENTITY:
      //取消下面的if判断条件
      //if (TECH_BIT(sMdmInfo) == MDM_CDMA) { 
            RLOGD("RIL_REQUEST_DEVICE_IDENTITY response :%s ", "IS CDMA ");
            requestCdmaDeviceIdentity(request, data, datalen, t);
      //}
        
      break;

此时IMEI的AT请求指令已经能够正常发送并返回结果了.但是解析仍然有问题.

 继续该文件中找到 如下方法 对比差异性做出修改即可.

static void requestCdmaDeviceIdentity(int request __unused, void *data __unused,
                                        size_t datalen __unused, RIL_Token t)
{
    int err;
    int response[4];
    char * responseStr[4];
    ATResponse *p_response = NULL;
    const char *cmd;
    const char *prefix;
    char *line, *p;
    int commas;
    int skip;
    int count = 4;

    responseStr[0] = "----";
    responseStr[1] = "----";
    responseStr[2] = "77777777";
    responseStr[3] = "----";
    err = at_send_command_numeric("AT+CGSN", &p_response);
    RLOGD("requestCdmaDeviceIdentity response :%d ", err);
    if (err < 0 || p_response->success == 0) {
    
        RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
        return;
    } else {
        RLOGD("requestCdmaDeviceIdentity success !!");
        responseStr[0] = p_response->p_intermediates->line;   //此处结果接收作出修改
    }
    RLOGD("requestCdmaDeviceIdentity response---> :%s ", responseStr[3]);
    
    RIL_onRequestComplete(t, RIL_E_SUCCESS, responseStr, count*sizeof(char*));
    at_response_free(p_response);
}

另外查看RIL日志命令如下:

 adb logcat -b radio -s *:E
  
 其中  * 表示日志的LOG_TAG 在 各个文件的最上面都有定义
 如reference-ril.c中定义的 #define LOG_TAG "RIL"
 那么就可以adb logcat -b radio -s RIL:E 过滤文件中的日志.
 其中  E 表示日志的等级 
 
 各位可以自行在ril部分添加各种日志详细查看整个ril发送AT指令以及得到返回值的整个流程.
 
 

猜你喜欢

转载自blog.csdn.net/SpHinner/article/details/81184586
今日推荐