可能很多编译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指令以及得到返回值的整个流程.