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

How to use a hidden method in Android?

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

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

            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)

你能帮我解决一下吗?

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

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