棉花糖通过服务电话本地获得Imei

时间:2016-06-21 12:45:14

标签: android android-ndk java-native-interface

我需要使用本机代码从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”命令,它给了我旧的结果。但不是在本地代码中。

有没有人有想法解决这个问题?

1 个答案:

答案 0 :(得分:0)

  1. 在Android 5.x +或某些手机设备中,当应用启动时,获取IMEI或IMSI需要动态权限。

  2. 服务电话iphonesubinfo x x是平台版本的号码,7是适用于Android 5.x的IMSI + Android 7.x

  3. 在java代码中,您可以使用Runtim.getRuntime()。exec(String cmd)来执行此cmd行,并读取Process inputStream以获取它。

  4. 在C / C ++代码中,如果设备需要权限,您可以在Activity中获得Java的权限,然后使用so调用Native方法。

  5. 关于许可要求:

  6. 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。