【发布时间】:2016-08-20 00:04:29
【问题描述】:
运行以下代码时:
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) 在 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(源文件:297) 在 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 版本上看到过这种情况。
【问题讨论】:
-
会不会是所有抛出异常的客户端都被root了?
标签: android android-permissions