设为首页 收藏本站
查看: 1259|回复: 0

[经验分享] Android打开WIFI或者移动网络的代码实现

[复制链接]

尚未签到

发表于 2015-10-2 08:15:25 | 显示全部楼层 |阅读模式
  MainActivity如下:

package wy.testnetwork;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
/**
* Demo描述:
* 通过代码打开wifi或者移动网络
*
* 学习资料:
* 1 http://blog.iyunv.com/way_ping_li/article/details/8493700
* 2 http://stackoverflow.com/questions/12535101/how-can-i-turn-off-3g-data-programmatically-on-android
* 3 http://www.cnblogs.com/willyan/archive/2012/07/03/2574513.html
* 4 http://ask.iyunv.com/questions/152
* 5 http://blog.iyunv.com/lfdfhl/article/details/10311505
* 6 http://blog.iyunv.com/tu_bingbing/article/details/8469871
* 7 http://blog.iyunv.com/stevenhu_223/article/details/9052083
*   Thank you very much
*   
* 备注说明:
* 1 在学习资料1中还涉及到利用代码打开GPS
* 2 通过代码打开wifi和移动网络在某些机型上是不可实现的
*
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
toggleWiFi(this, false);
toggleMobileData(this, true);
}

//设置是否打开Wifi
private void toggleWiFi(Context context, boolean enabled) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(enabled);
}
/**
* 设置是否打开移动网络
*
* 但没有直接的API可调用,但是我们发现:
* 在ConnectivityManager中有一隐藏的方法setMobileDataEnabled()
* 源码如下:
* public void setMobileDataEnabled(boolean enabled) {
*   try {
*      mService.setMobileDataEnabled(enabled);
*   } catch (RemoteException e) {
*      }
* }
*
* 这里的重点就是mService,查看其声明:
* private IConnectivityManager mService;
* 继续查看源码可知IConnectivityManager为了一个AIDL(接口interface IConnectivityManager)
*
*
* 调用过程:
* ConnectivityManager中有一隐藏的方法setMobileDataEnabled()
* 在setMobileDataEnabled()中调用了IConnectivityManager中的setMobileDataEnabled(boolean)
*
* 所以我们首先需要反射出ConnectivityManager类的成员变量mService(IConnectivityManager类型)
*/
private void toggleMobileData(Context context, boolean enabled) {  
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//ConnectivityManager类  
Class<?> connectivityManagerClass = null;
//ConnectivityManager类中的字段  
Field connectivityManagerField = null;

//IConnectivityManager接口
Class<?> iConnectivityManagerClass = null;
//IConnectivityManager接口的对象
Object iConnectivityManagerObject = null;
//IConnectivityManager接口的对象的方法
Method setMobileDataEnabledMethod = null;
try {
//取得ConnectivityManager类
connectivityManagerClass = Class.forName(connectivityManager.getClass().getName());
//取得ConnectivityManager类中的字段mService
connectivityManagerField = connectivityManagerClass.getDeclaredField("mService");
//取消访问私有字段的合法性检查
//该方法来自java.lang.reflect.AccessibleObject
connectivityManagerField.setAccessible(true);

//实例化mService
//该get()方法来自java.lang.reflect.Field
//一定要注意该get()方法的参数:
//它是mService所属类的对象
//完整例子请参见:
//http://blog.iyunv.com/lfdfhl/article/details/13509839
iConnectivityManagerObject = connectivityManagerField.get(connectivityManager);
//得到mService所属接口的Class
iConnectivityManagerClass = Class.forName(iConnectivityManagerObject.getClass().getName());
//取得IConnectivityManager接口中的setMobileDataEnabled(boolean)方法
//该方法来自java.lang.Class.getDeclaredMethod
setMobileDataEnabledMethod =
iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
//取消访问私有方法的合法性检查
//该方法来自java.lang.reflect.AccessibleObject
setMobileDataEnabledMethod.setAccessible(true);
//调用setMobileDataEnabled方法
setMobileDataEnabledMethod.invoke(iConnectivityManagerObject,enabled);
} catch (ClassNotFoundException e) {   
e.printStackTrace();  
} catch (NoSuchFieldException e) {   
e.printStackTrace();  
} catch (SecurityException e) {   
e.printStackTrace();  
} catch (NoSuchMethodException e) {   
e.printStackTrace();  
} catch (IllegalArgumentException e) {   
e.printStackTrace();  
} catch (IllegalAccessException e) {   
e.printStackTrace();  
} catch (InvocationTargetException e) {   
e.printStackTrace();  
}
}

}

  
AndroidManifest.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="wy.testnetwork"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="10" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="wy.testnetwork.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
  
main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通过代码打开wifi或者移动网络"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dip"
/>
</RelativeLayout>
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-121535-1-1.html 上篇帖子: 树莓派的WIFI配置 下篇帖子: 安卓手机wifi 无法获取ip问题解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表