首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android源代码中访问setPreferredNetworkType

如何在Android源代码中访问setPreferredNetworkType
EN

Stack Overflow用户
提问于 2011-03-25 17:54:44
回答 5查看 12.6K关注 0票数 9

我有一个问题要问你,我正在尝试选择我的Android手机上的首选网络类型。通过执行以下步骤,您可以这样做:

“##4636##

  • Choose Information"

  • Go
  1. ”选择

菜单上的首选网络类型

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

因此,对于VinayHow to disable Mobile Data on Android的一些很好的技巧,他正在使用java自反函数来访问隐藏类,我也尝试过这样做:

代码语言:javascript
复制
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上有一个错误:

java.lang.ClassCache.findMethodByName(ClassCache.java:308):

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

那么,您有想法访问setPreferredNetworkType或选择编程我喜欢的网络类型吗?

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

代码语言:javascript
复制
/* 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;
EN

回答 5

Stack Overflow用户

发布于 2011-08-22 08:20:42

下面是一个很好的指南,说明如何访问内部API:https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

根据自己的经验,我可以告诉您,访问通常有效,但您将得到一个运行时异常,因为只有系统应用程序具有设置首选Network的权限。

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

票数 5
EN

Stack Overflow用户

发布于 2013-07-25 14:49:20

下面是一些硬核心反射https://github.com/TheMasterBaron/Toggle-2G

票数 1
EN

Stack Overflow用户

发布于 2016-04-23 23:41:51

你可以试试这篇文章:http://www.josemauricio.net/?p=486

它使用这些AT命令:

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

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

主要问题之一是创建正确的命令和您的设备使用的串口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5436251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档