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 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast