如何访问Android源中的setPreferredNetworkType

我有一个问题,我想在我的Android手机上select首选networkingtypes。 您可以通过执行以下步骤来执行操作:

  1. 拨号##4636 ##
  2. select“电话信息”
  3. 去底部
  4. 在菜单上select首选networkingtypes

因此,在源代码search后,我find了正确的类:Phone.java(\ frameworks \ base \ telephony \ java \ com \ android \ internal \ telephony)

因此, Vinay的漂亮秘诀: 如何禁用Android上的移动数据谁正在使用Javareflection来访问隐藏的类,我也试过:

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 }); 

但问题是,我在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):在java.lang.ClassCache。 findMethodByName(ClassCache.java:308)

那么你有没有想法访问setPreferredNetworkType或selectprogrammaticaly我的首选networkingtypes?

有关信息(在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; 

Solutions Collecting From Web of "如何访问Android源中的setPreferredNetworkType"

这里有一个很好的指导如何访问内部API: https : //devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

从自己的经验,我可以告诉你,访问通常工作,但你会得到一个运行时exception,因为只有系统应用程序有权设置首选networkingtypes。

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

这里是一些硬核reflectionhttps://github.com/TheMasterBaron/Toggle-2G

你可以试试这个post: http : //www.josemauricio.net/? p= 486

它使用这些AT命令:

KitKat:echo“AT ^ SYSCONFIG = 13,1,1,2 \ r”> / dev / smd0

棒棒糖:echo“AT + WS46 = 12 \ r”> / dev / umts_at0

其中一个主要问题是创build您的设备使用的正确命令和串行端口。

为此,您的应用程序必须使用系统密钥签名或具有运营商权限。 否则,应用程序将抛出java.lang.SecurityException: No modify permission or carrier privilege.

我的应用在Android 5.1 Lollipop(API 22)上运行,并使用系统密钥进行签名,所以这是唯一可以确认的configuration。 我无法确认运营商特权方式。

AndroidManifest.xml中

将此权限添加到您的应用程序清单。 如果您使用的是Android Studio,则可能会将此行标记为错误,因为只有系统应用程序才具有此权限。 如果您可以使用系统密钥对您的应用程序进行签名,请不要担心。

 <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/> 

获得首选networking

返回在RILConstants.java中定义,例如RILConstants.NETWORK_MODE_WCDMA_PREF

 public int getPreferredNetwork() { Method method = getHiddenMethod("getPreferredNetworkType", TelephonyManager.class, null); int preferredNetwork = -1000; try { preferredNetwork = (int) method.invoke(mTelephonyManager); Log.i(TAG, "Preferred Network is ::: " + preferredNetwork); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return preferredNetwork; } 

设置首选方法。

该参数必须基于RILConstants.java ,例如: RILConstants.NETWORK_MODE_LTE_ONLY

 public void setPreferredNetwork(int networkType) { try { Method setPreferredNetwork = getHiddenMethod("setPreferredNetworkType", TelephonyManager.class, new Class[] {int.class}); Boolean success = (Boolean)setPreferredNetwork.invoke(mTelephonyManager, networkType); Log.i(TAG, "Could set Network Type ::: " + (success.booleanValue() ? "YES" : "NO")); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } 

这是访问隐藏的API方法的实用程序方法。

 /** * Get a hidden method instance from a class * @param methodName The name of the method to be taken from the class * @param fromClass The name of the class that has the method * @return A Method instance that can be invoked */ public Method getHiddenMethod(String methodName, Class fromClass, Class[] params) { Method method = null; try { Class clazz = Class.forName(fromClass.getName()); method = clazz.getMethod(methodName, params); method.setAccessible(true); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return method; }