如何在Android中使用隐藏方法?

时间:2016-03-25 06:49:37

标签: android reflection sdk

我是Android的新手。我的手机有两个SIM插槽,我想知道第二张SIM卡的信息。所以我想在隐藏的TelephonyManager中使用下面的方法。

enter image description here

有人告诉我如何使用反射,这是我的尝试。

            Class<TelephonyManager> telephonyManagerClass = TelephonyManager.class;
            TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            try {
                Method method = telephonyManagerClass.getMethod("getSimState", new Class[]{int.class});
                method.setAccessible(true);
                Object object = method.invoke(telephonyManager,1);
                int a = (int)object;
                System.out.println(a);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }catch (Exception e){
                e.printStackTrace();
            }

不幸的是,这是例外:

 java.lang.NoSuchMethodException: getSimState [int]
 at java.lang.Class.getConstructorOrMethod(Class.java:472)
 at java.lang.Class.getMethod(Class.java:857)
 at (MainActivity.java:61)
 at android.view.View.performClick(View.java:4438)
 at android.view.View$PerformClick.run(View.java:18442)
 at android.os.Handler.handleCallback(Handler.java:733)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:136)
 at android.app.ActivityThread.main(ActivityThread.java:5195)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:515)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603)
 at dalvik.system.NativeStart.main(Native Method)

你能帮我解决一下吗?

1 个答案:

答案 0 :(得分:2)

在Lollipop 5.1(API 22)之前,Android中不支持多张SIM卡。 KitKat中不存在具有该签名的方法,因此您的手机使用制造商提供的专有软件来处理双SIM卡。您很可能需要联系制造商或供应商以获取有关如何访问该功能的信息,除非您可以通过针对您的品牌和型号的搜索找到某些内容。

作为参考,KitKat源中的here's that method,您可以看到,SIM索引不带任何参数。如果您获得的方法没有参数,那么您的反射方法将起作用,但这不会帮助您访问第二个SIM的状态。