想打开android数据连接,在网上搜到的方法是反射ITelephony,代码如下:
//开启数据连接
Class telephonyManagerClz=TelephonyManager.class;
Method mGetITelephony=telephonyManagerClz.getDeclaredMethod("getITelephony");
mGetITelephony.setAccessible(true);
Object iTelephony = mGetITelephony.invoke(tm);
Method mEnableDataConn=iTelephony.getClass().getDeclaredMethod("enableDataConnectivity");//关闭是 disableDataConnectivity
mEnableDataConn.setAccessible(true);
mEnableDataConn.invoke(iTelephony);
但这种方法行不通(三个手机没有一个成功)。首先,使用非公开的api具有很大的局限性,因为不同的手机厂商都会把google的原系统进行自定义,它们会保证公开的api的通用性,但非公 开的api就不一定了;另外这种方法需要MODIFY_PHONE_STATE权限,android2.3及以上的版本只有系统应用才能申请该权限(详情 参见stackoverflow上的这个问题How to grant MODIFY_PHONE_STATE permission for apps ran on Gingerbread),所以这个方法行不通。
可靠的方法是使用ConnectivityManager,代码如下:
public static void setDataConnectionState(Context cxt, boolean state) {
ConnectivityManager connectivityManager = null;
Class connectivityManagerClz = null;
try {
connectivityManager = (ConnectivityManager) cxt
.getSystemService("connectivity");
connectivityManagerClz = connectivityManager.getClass();
Method method = connectivityManagerClz.getMethod(
"setMobileDataEnabled", new Class[] { boolean.class });
method.invoke(connectivityManager, state);
} catch (Exception e) {
e.printStackTrace();
}
}
另ConnectivityManager的setMobileDataEnabled方法的源码如下:
/**
* Sets the persisted value for enabling/disabling Mobile data.
*
* @param enabled Whether the mobile data connection should be
* used or not.
* @hide
*/
public void setMobileDataEnabled(boolean enabled) {
try {
mService.setMobileDataEnabled(enabled);
} catch (RemoteException e) {
}
}
这个方法是不可见的,所以需要使用反射。