代码改变世界

Android APN开关原理

2011-07-18 23:54  shaobin0604  阅读(2337)  评论(3编辑  收藏  举报

通常是采用加后缀法关闭APN,即在APN信息表(content://telephony/carriers/current )的apn, type字段添加自定义的后缀(参考自APNDroid )。但实际上Android已经提供了开/关数据业务的方法,只是设置为@hidden,没有提供给SDK。

2.1 在com.android.internal.telephony.ITelephony接口里提供的以下方法

boolean enableDataConnectivity()
          Allow mobile data connections.

boolean disableDataConnectivity()
          Disallow mobile data connections.

这两个方法是隐藏的,不能直接调用。可以使用如下两种方法:

  • 反射
  • 自行编译framework.jar,把这个jar包加入工程的classpath,直接调用。

对于第二种方法,使用如下代码获得接口实现类的实例

   1: ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.getService("phone"));

需要权限 

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

2.2 开始 在android.net.ConnectivityManager类里提供了以下方法

boolean getMobileDataEnabled()
          Gets the value of the setting for enabling Mobile data.

void setMobileDataEnabled(boolean enabled)  # 更新说明:该方法在 Android 5.0 API 21 中已移除
          Sets the persisted value for enabling/disabling Mobile data.

不幸的是这两个方法依然是隐藏的。调用方法如前所叙述。

需要权限

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

完整的代码 https://github.com/shaobin0604/ToggleAPN