Android getSimOperator() 在缺少权限时崩溃
Posted
技术标签:
【中文标题】Android getSimOperator() 在缺少权限时崩溃【英文标题】:Android getSimOperator() crashes on missing permission 【发布时间】: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了? 【参考方案1】:使用下面的方法
TelephonyManager manager = (TelephonyManager)getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
String carrierName = manager.getNetworkOperatorName();
Toast.makeText(MainActivity.this, ""+carrierName, Toast.LENGTH_SHORT).show();
您可以检索选定的模拟运营商名称...
【讨论】:
我想了解为什么根据文档甚至不需要权限时会崩溃。 这实际上是一个不同的方法,它返回一个完全不同的字符串 我未经允许就这样做了 我也在办公室的所有设备上。但是当我们发布它时,它似乎在某些设备上崩溃了。【参考方案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());
【讨论】:
为什么会这样?你没有改变任何东西,你仍然在调用 tMgr.getSimOperator() 在 manifests 中提供这个权限 Like this code以上是关于Android getSimOperator() 在缺少权限时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )