如何在Android源代码中访问setPreferredNetworkType

sna*_*man 9 java reflection android

我有一个问题,我想在Android手机上选择首选网络类型.您可以通过执行以下步骤来执行此操作:

  1. ##4636# #
  2. 选择"手机信息"
  3. 走到最底
  4. 在菜单上选择首选网络类型

所以在对源代码进行一些搜索后,我找到了正确的类:Phone.java((frameworks\base\telephony\java\com\android\internal\telephony)

所以有了Vinay的好技巧:如何禁用Android上的移动数据 谁使用java反射来访问隐藏的类,我也尝试过这样做:

Method setPrefNetmethod;
Class telephonyManagerClass;
Object ITelephonyStub;
Class ITelephonyClass;

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManagerClass = Class.forName(telephonyManager.getClass().getName());
Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony");
getITelephonyMethod.setAccessible(true);
ITelephonyStub = getITelephonyMethod.invoke(telephonyManager);
ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName());

setPrefNetmethod = ITelephonyClass.getDeclaredMethod("setPreferredNetworkType",new Class[] { Integer.class, Message.class });

Message response = Message.obtain();
setPrefNetmethod.setAccessible(false);

setPrefNetmethod.invoke(ITelephonyStub, new Object[] { network_mode, response });
Run Code Online (Sandbox Code Playgroud)

但问题是我在DDMS上有这个错误:

03-25 18:18:45.937:WARN/System.err(2989):java.lang.NoSuchMethodException:setPreferredNetworkType 03-25 18:18:45.937:WARN/System.err(2989):at java.lang.ClassCache. findMethodByName(ClassCache.java:308)

那么你有想法访问setPreferredNetworkType或选择programmaticaly我的首选网络类型吗?

有关信息(在RILConstants.java中):

/* NETWORK_MODE_* See ril.h RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE */
int NETWORK_MODE_WCDMA_PREF     = 0; /* GSM/WCDMA (WCDMA preferred) */
int NETWORK_MODE_GSM_ONLY       = 1; /* GSM only */
int NETWORK_MODE_WCDMA_ONLY     = 2; /* WCDMA only */
int NETWORK_MODE_GSM_UMTS       = 3; /* GSM/WCDMA (auto mode, according to PRL)
                                        AVAILABLE Application Settings menu*/
int NETWORK_MODE_CDMA           = 4; /* CDMA and EvDo (auto mode, according to PRL)
                                        AVAILABLE Application Settings menu*/
int NETWORK_MODE_CDMA_NO_EVDO   = 5; /* CDMA only */
int NETWORK_MODE_EVDO_NO_CDMA   = 6; /* EvDo only */
int NETWORK_MODE_GLOBAL         = 7; /* GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)
                                        AVAILABLE Application Settings menu*/
int PREFERRED_NETWORK_MODE      = NETWORK_MODE_WCDMA_PREF;
Run Code Online (Sandbox Code Playgroud)

小智 5

以下是如何访问内部API的好指南:https: //devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

根据自己的经验,我可以告诉您访问通常有效但您将获得运行时异常,因为只有系统应用程序才有权设置首选网络类型.

这意味着您的应用程序也必须安装在系统文件夹中,并且必须使用系统密钥进行签名,这是问题的关键....