Android 移动数据切换按钮
在我的应用程序中,我有两个切换按钮,一个用于wifi,另一个用于移动数据。当应用程序启动时,如果我的WiFi处于打开状态,则切换按钮处于打开状态。但是,如果我的移动数据处于打开状态,切换按钮不会显示,它仍然是灰色的(无论WiFi发生了什么)。当我按下它时,它会变成绿色,我的移动数据仍处于打开状态。。。知道为什么吗Android 移动数据切换按钮,android,Android,在我的应用程序中,我有两个切换按钮,一个用于wifi,另一个用于移动数据。当应用程序启动时,如果我的WiFi处于打开状态,则切换按钮处于打开状态。但是,如果我的移动数据处于打开状态,切换按钮不会显示,它仍然是灰色的(无论WiFi发生了什么)。当我按下它时,它会变成绿色,我的移动数据仍处于打开状态。。。知道为什么吗 gprs.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
gprs.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
try {
turnData(isChecked); //Klasa za ukljucivanje gprsa
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
和移动数据类
void turnData(boolean ON) throws Exception {
Log.i("version:", "Found Gingerbread+");
final ConnectivityManager conman = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass = Class.forName(conman.getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(conman);
final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(iConnectivityManager, ON);
}
你为什么要用反射来做这个?如果我是谷歌,而我不是,我会在API中设置保护,这样人们就不能在低级系统中使用反射F。允许对这种东西进行反射将使系统变得如此脆弱,以至于没有人能够使用它 如果你看一下,你会发现IConnectivityManager甚至不是一个java类,它是一个aidl资源,这意味着它可能由本机代码(C/C++)支持,所以我不知道反射在那里会起作用 如果查看您试图访问的
setMobileDataEnabled
方法,它在源代码中是公共的
我没有使用它,但是为什么要尝试深入底层服务,而不仅仅是使用它呢?为什么要为此使用反射?如果我是谷歌,而我不是,我会在API中设置保护,这样人们就不能在低级系统中使用反射F。允许对这种东西进行反射将使系统变得如此脆弱,以至于没有人能够使用它 如果你看一下,你会发现IConnectivityManager甚至不是一个java类,它是一个aidl资源,这意味着它可能由本机代码(C/C++)支持,所以我不知道反射在那里会起作用 如果查看您试图访问的
setMobileDataEnabled
方法,它在源代码中是公共的
我没有使用过它,但为什么要尝试深入底层服务,而不仅仅是使用它呢?你可以试试,它在KitKat上对我有用
public boolean invokeMethod(String methodName, Object[] args) throws Exception {
ConnectivityManager mcm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Class ownerClass = mcm.getClass();
Class[] argsClass = null;
if (args != null) {
argsClass = new Class[1];
argsClass[0] = args.getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return (Boolean)method.invoke(mcm, args);
}
public Object invokeBooleanArgMethod(String methodName, boolean value) throws Exception {
ConnectivityManager mcm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Class ownerClass = mcm.getClass();
Class[] argsClass = new Class[1];
argsClass[0] = boolean.class;
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(mcm, value);
}
/* use these two method like these */
Object[] arg = null;
try {
boolean isMobileDataEnable = invokeMethod("getMobileDataEnabled", arg);
if(!isMobileDataEnable){
invokeBooleanArgMethod("setMobileDataEnabled", true);
}
} catch (Exception e) {
e.printStackTrace();
}
另外,在AndroidManifest.xml
中,您需要添加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
你可以试试,它在KitKat上对我有效
public boolean invokeMethod(String methodName, Object[] args) throws Exception {
ConnectivityManager mcm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Class ownerClass = mcm.getClass();
Class[] argsClass = null;
if (args != null) {
argsClass = new Class[1];
argsClass[0] = args.getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return (Boolean)method.invoke(mcm, args);
}
public Object invokeBooleanArgMethod(String methodName, boolean value) throws Exception {
ConnectivityManager mcm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Class ownerClass = mcm.getClass();
Class[] argsClass = new Class[1];
argsClass[0] = boolean.class;
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(mcm, value);
}
/* use these two method like these */
Object[] arg = null;
try {
boolean isMobileDataEnable = invokeMethod("getMobileDataEnabled", arg);
if(!isMobileDataEnable){
invokeBooleanArgMethod("setMobileDataEnabled", true);
}
} catch (Exception e) {
e.printStackTrace();
}
另外,在AndroidManifest.xml
中,您需要添加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
如果您有任何其他想法,我如何从2.3+版的切换按钮打开移动数据,请告知我…如果您有任何其他想法,我如何从2.3+版的切换按钮打开移动数据,请告知我。。。