如何在Android中以编程方式获取IMSI号码

4
我尝试了以下代码:
private String getImsi() {
   TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
   return mTelephonyMgr.getSubscriberId();
}

<uses-permission android:name='android.permission.READ_PHONE_STATE' />

但它只返回null。

在Android中,有没有其他方法使用Java获取IMSI?


1
你是否添加了 android.permission.READ_PHONE_STATE 权限? - Saeed Masoumi
尝试使用 mTelephonyMgr.getDeviceId(); ... - ELITE
getDeviceID() 返回 IMEI,但我需要 IMSI。 - AndyB
3个回答

2
String imei = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);

获得许可后

 android.permission.READ_PHONE_STATE

由于SystemProperties是Android中的一个隐藏类,因此您可以使用反射来访问它:

/**
 * Get the value for the given key.
 * @return an empty string if the key isn't found
 */
public static String get(Context context, String key) {
    String ret = "";

    try {
        ClassLoader cl = context.getClassLoader(); 
        @SuppressWarnings("rawtypes")
        Class SystemProperties = cl.loadClass("android.os.SystemProperties");

        //Parameters Types
        @SuppressWarnings("rawtypes")
        Class[] paramTypes= new Class[1];
        paramTypes[0]= String.class;

        Method get = SystemProperties.getMethod("get", paramTypes);

        //Parameters
        Object[] params = new Object[1];
        params[0] = new String(key);

        ret = (String) get.invoke(SystemProperties, params);
    } catch(Exception e) {
        ret = "";
        //TODO : Error handling
    }

    return ret;
}

谢谢,但是我如何添加android.os.SystemProperties?这个无法解决。 - AndyB
你可以参考这个答案:https://dev59.com/xWPVa4cB1Zd3GeqP41uq - Ankit Kumar
我认为反射方法不起作用了,或者是我使用方法有误?String imsi = get(getApplicationContext(), "android.telephony.TelephonyProperties.PROPERTY_IMSI"); 我仍然得到一个空字符串的IMSI。 - AndyB
我无法找到任何有关类android.telephony.TelephonyProperties的提及,只有com.android.internal.telephony.TelephonyProperties,但是那里没有PROPERTY_IMSI常量。 - Miha_x64

1

1
是的,我添加了权限,我也编辑了问题,但谢谢。 - AndyB
android.os.SystemProperties 有导入吗? - AndyB
这里是类https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/SystemProperties.java,请查看。 - Atlas91

0

以下解决方案仅适用于系统应用程序:

    private String getIMSI(){
        telephonyManager = (TelephonyManager) getSystemService(this.TELEPHONY_SERVICE);
        return telephonyManager.getSubscriberId();
    }

在AndroidManifest.xml中添加权限:
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />

第二个权限被标记为系统权限。
适用于Android 9(API 28)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接