Android getSimOperator()在丢失权限时崩溃

时间:2016-04-26 09:03:57

标签: android android-permissions

运行以下代码时:

try {
    TelephonyManager telephonyManager = (TelephonyManager) MainApplication.getAppContext()
                                                                          .getSystemService(Context.TELEPHONY_SERVICE);
    String simMCCMNC = telephonyManager.getSimOperator();
} catch (Exception e) {
    Crashlytics.logException(e);
}

应用程序崩溃时出现以下日志:

  

非致命异常:java.lang.SecurityException:需要   READ_PHONE_STATE:用户10076和当前进程都没有   android.permission.READ_PHONE_STATE。          在android.os.Parcel.readException(Parcel.java:1546)          在android.os.Parcel.readException(Parcel.java:1499)          at com.android.internal.telephony.ISub $ Stub $ Proxy.getActiveSubscriptionInfoForSimSlotIndex(ISub.java:459)          在android.telephony.SubscriptionManager.getDefaultSmsSubId(SubscriptionManager.java:910)          在android.telephony.TelephonyManager.getSimOperatorNumeric(TelephonyManager.java:1622)          在android.telephony.TelephonyManager.getSimOperator(TelephonyManager.java:1592)          在com.myapp.app.ApplicationInitializer.generateBaseUrl(SourceFile:297)          at com.myapp.app.ApplicationInitializer.initFailProofComponents(SourceFile:193)          在com.myapp.app.ApplicationInitializer.prepareManager(SourceFile:121)          在com.myapp.managers.base.BaseManager.prepareManagerIfPossible(SourceFile:43)          在com.my.app.ApplicationInitializer.init(SourceFile:137)          在com.my.app.MainApplication.onCreate(SourceFile:23)          在android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1012)          在android.app.ActivityThread.handleBindApplication(ActivityThread.java:4628)          在android.app.ActivityThread.access $ 1500(ActivityThread.java:151)          在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1374)          在android.os.Handler.dispatchMessage(Handler.java:102)          在android.os.Looper.loop(Looper.java:135)          在android.app.ActivityThread.main(ActivityThread.java:5345)          在java.lang.reflect.Method.invoke(Method.java)          在java.lang.reflect.Method.invoke(Method.java:372)          在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:947)          在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)

查看Android getSimOperator()的源代码。我不明白代码如何崩溃这个方法不需要的权限?

我在调用getDeviceId()时能够重现,因为它需要READ_PHONE_STATE。

我只在Android 5.1版本上看到过这种情况。

2 个答案:

答案 0 :(得分:-2)

使用此方法可以正常工作

DeviceInfo deviceInfo = new DeviceInfo();
        TelephonyManager tMgr = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        deviceInfo.setDeviceId(Util.getDeviceID(mContext));
        if(tMgr!=null)
        {
            String simSerialNumber=tMgr.getSimSerialNumber();
            if(simSerialNumber!=null) {
                deviceInfo.setSimOperator(tMgr.getSimOperator());
                deviceInfo.setSimCountryIso(tMgr.getSimCountryIso());

                deviceInfo.setSimSerialNumber(simSerialNumber);
                deviceInfo.setSimOperatorName(tMgr.getSimOperatorName());
                deviceInfo.setSimNetworkOperator(tMgr.getNetworkOperator());
            }
        }

答案 1 :(得分:-2)

使用以下方法

 TelephonyManager manager = (TelephonyManager)getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
    String carrierName = manager.getNetworkOperatorName();

    Toast.makeText(MainActivity.this, ""+carrierName, Toast.LENGTH_SHORT).show();

您可以检索选定的SIM操作员名称...