如何在Android上获取用户的手机号码?

问题描述

我已经实现了以下广泛使用的代码,但我遇到了安全异常。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
    SubscriptionManager sManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
    SubscriptionInfo infoSim1 = sManager.getActiveSubscriptionInfoForSimslotIndex(0);
    SubscriptionInfo infoSim2 = sManager.getActiveSubscriptionInfoForSimslotIndex(1);
    return infoSim1 != null || infoSim2 != null;
} else {
    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getSimserialNumber() != null;
}

错误日志如下

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.demozapier/com.app.demozapier.MainActivity}: java.lang.SecurityException: getActiveSubscriptionInfoForSimslotIndex
    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3521)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3693)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2135)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:236)
    at android.app.ActivityThread.main(ActivityThread.java:8060)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
 Caused by: java.lang.SecurityException: getActiveSubscriptionInfoForSimslotIndex
    at android.os.Parcel.createExceptionorNull(Parcel.java:2376)
    at android.os.Parcel.createException(Parcel.java:2360)
    at android.os.Parcel.readException(Parcel.java:2343)
    at android.os.Parcel.readException(Parcel.java:2285)
    at com.android.internal.telephony.ISub$Stub$Proxy.getActiveSubscriptionInfoForSimslotIndex(ISub.java:1365)
    at android.telephony.SubscriptionManager.getActiveSubscriptionInfoForSimslotIndex(SubscriptionManager.java:1357)
    at com.app.demozapier.MainActivity.isSimAvailable(MainActivity.java:220)
    at com.app.demozapier.MainActivity.init(MainActivity.java:74)
    at com.app.demozapier.MainActivity.onCreate(MainActivity.java:68)
    at android.app.Activity.performCreate(Activity.java:8141)
    at android.app.Activity.performCreate(Activity.java:8113)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3494)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3693) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2135) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:236) 
    at android.app.ActivityThread.main(ActivityThread.java:8060) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

解决方法

    TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();

在清单中添加一行

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