Android:TelephonyManager.getSimSerialNumber()返回null

5

在什么情况下,这个方法会返回一个空引用? 只能依靠SIM卡吗? 在这些情况下,不存在获取后者标识号的替代方法吗?

谢谢大家!


Android 10中限制了电话SIM卡的序列号。我们可以使用TELEPHONY_SUBSCRIPTION_SERVICE代替(>= Android 5.1)。有关详细信息,请参阅下面的回答。 - Adarsh Chithran
3个回答

3

从Android 10开始,getSimSerialNumber()需要特权权限,并且第三方应用程序无法注册此权限。

请参见:https://developer.android.com/about/versions/10/privacy/changes#non-resettable-device-ids

一种可能的解决方案是使用来自Android 5.1的TELEPHONY_SUBSCRIPTION_SERVICE来检索SIM串行号。以下是步骤:

  • Check for READ_PHONE_STATE permission.
  • Get Active subscription list.( Returns the list of all active sim cards)
  • Retrieve the sim details from Subscription Object.

    if ( isPermissionGranted(READ_PHONE_STATE) ) {

            String simSerialNo="";
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
    
                SubscriptionManager subsManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); 
    
                List<SubscriptionInfo> subsList = subsManager.getActiveSubscriptionInfoList();
    
                if (subsList!=null) {
                    for (SubscriptionInfo subsInfo : subsList) {
                        if (subsInfo != null) {
                            simSerialNo  = subsInfo.getIccId());
                        }
                    }
                }
            } else {
                TelephonyManager tMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                simSerialNo = tMgr.getSimSerialNumber();
            }
        }
    

请看这是否有帮助


2
请确保在Android清单文件中添加了以下权限,如果没有,请添加此声明并重试。
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

注意:将此权限标签添加到应用程序标签之外。
示例代码片段:
.....
.....
.....
</application>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android......"/>
 ..........
 </manifest>

最好的祝愿


0

尝试下面的代码..我会对你有所帮助的。

TelehponyManager manager = (TelehponyManager)getSystemService(TELEPHONY_SERVICE);

String imei = manager.getDeviceId();

String imsi = manager.getSubscriberId();

你好,感谢您的回答,但不幸的是它并没有解决我的问题。我需要唯一地识别SIM卡。IMEI与设备配对,而“用户标识”则在运营商网络中标识帐户,因此如果用户更改运营商并携带电话号码(使用号码可携带性),则IMSI可能会更改,但SIM卡仍然相同。 - Vincenzo

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