运行以下代码时:
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版本上看到过这种情况。
答案 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操作员名称...