我需要使用本机代码从Galaxy S6获取Imei! 我不能使用Java代码。
在Lollipop中我使用
char *res = exec_get_out((char *) "service call iphonesubinfo 3");
获取IMEI和其他字符,我在其中提取Imeinumber。
现在有了Marshmallow,新的权限被释放了。我实施了它。 我可以用javacode获得下面的imei。
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)
{
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 123);
}
String test = ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
但是当我想用旧的本机方法获取Number时,我得到以下结果。
>null from uid 10169 not allowed to perform OP_READ_PHONE_STATE
我在adb shell中尝试了“service call iphonesubinfo 3”命令,它给了我旧的结果。但不是在本地代码中。
有没有人有想法解决这个问题?
答案 0 :(得分:0)
在Android 5.x +或某些手机设备中,当应用启动时,获取IMEI或IMSI需要动态权限。
服务电话iphonesubinfo x x是平台版本的号码,7是适用于Android 5.x的IMSI + Android 7.x
在java代码中,您可以使用Runtim.getRuntime()。exec(String cmd)来执行此cmd行,并读取Process inputStream以获取它。
在C / C ++代码中,如果设备需要权限,您可以在Activity中获得Java的权限,然后使用so调用Native方法。
关于许可要求:
1)检查权限:int st = ContextCompat.checkSelfPermission(....); 如果st是PackageManager.PERMISSION_GRANTED,你可以直接获得IMEI / IMSI,如果没有,
2)调用ActivityCompat.requestPermission(Activity,String [] permissions,int requestCode)并覆盖一个方法:AppCompatActivity中的onRequestPermission()。
3)在onRequestPermission中,检查READ_PHONE_STATE权限的结果是GRANTED,并再次调用get IMEI / IMSI。