通常是采用加后缀法关闭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,直接调用。 对于第二种方法,使用如下代码获得接口实现类的实例 2.2 在Android.net.ConnectivityManager类里提供了以下方法 boolean getMobileDataEnabled() Gets the value of the setting for enabling Mobile data. void setMobileDataEnabled(boolean enabled) Sets the persisted value for enabling/disabling Mobile data. 不幸的是这两个方法依然是隐藏的。调用方法如前所叙述。
final TelephonyManager mTelManager;
mTelManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
try {
Method m = mTelManager.getClass().getDeclaredMethod("getITelephony"); m.setAccessible(true);
Object telephony = m.invoke(mTelManager);
m = telephony.getClass().getMethod((enabled ? "enable" : "disable") + "DataConnectivity");
m.invoke(telephony);
return true;
} catch (Exception e) {
Log.e("", "cannot fake telephony", e);
return false;
}
}