0

I have implemented the below code which is widely used but I got the security exception.

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;
}

and the error log is as below

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)
CoolMind
  • 26,736
  • 15
  • 188
  • 224
Amit Patel
  • 11
  • 2
  • 1
    Check this answer - https://stackoverflow.com/questions/2480288/programmatically-obtain-the-phone-number-of-the-android-phone – Android Geek Jul 15 '21 at 04:52
  • 2
    There is no garunteed way to get it. First, not every device has a phone number. Secondly, not every phone actually knows its own phone number- depending on how the SIM is set up, it may not have that information on it. Your bug by the way is that you need READ_PHONE_STATE permission in your manifest AND you must ask for runtime permission for it – Gabe Sechan Jul 15 '21 at 05:48

1 Answers1

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

add line to manifest

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
Vijay S
  • 358
  • 3
  • 10
  • I think, it is a wrong answer. See comments in https://stackoverflow.com/questions/2480288/programmatically-obtain-the-phone-number-of-the-android-phone. – CoolMind Jul 15 '21 at 05:30