问题描述
我已经实现了以下广泛使用的代码,但我遇到了安全异常。
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"/>