失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android网络状态监听及切换 WiFi开关与状态监听 便携式热点 Wifi热点 WI-FI直连WifiP2p

Android网络状态监听及切换 WiFi开关与状态监听 便携式热点 Wifi热点 WI-FI直连WifiP2p

时间:2020-10-20 16:29:24

相关推荐

Android网络状态监听及切换 WiFi开关与状态监听 便携式热点 Wifi热点 WI-FI直连WifiP2p

Android用wifi热点组建局域网创建socket。Android手机开启热点,并开启手机GPRS联网的代码实现。

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

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

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

-- 判断是否有网络,编程- Android

public boolean isNetworkConnected(Context context) {

if (context != null) {

ConnectivityManager mConnectivityManager = (ConnectivityManager)

context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();

if (mNetworkInfo != null) {

return mNetworkInfo.isAvailable();

}

}

return false;

}

>WI-FI直连, WifiP2p

Wi-Fi直连的Demo_Public- /coderminer/Demo_Public/tree/master/Demo_wifi_direct , /coderminer/Demo_Public

一旦两个设备之间建立了Wi-Fi直连,那么这两个设备之间就可以通过socket传输数据。

从Android4.0(API Level=14)开始,允许通过Wi-Fi模块在两个移动设备之间建立直接连接(这种技术称为Wi-Fi Direct),这种连接不需要无线路由作为中介,而只是像蓝牙一样在两个设备之间直接建立的数据传输通道。在Android SDK中提供了一些API,通过这些API可以发现其它支持Wi-Fi Direct的设备,也可以接收其它设备的Wi-Fi Direct请求。在Wi-Fi Direct出现之前,通常使用蓝牙或利用无线路由连接多部Android设备,蓝牙的有效距离比较短,而且传输速率不如Wi-Fi。不过有了Wi-Fi Direct后,两部设备可以直接连接,既方便又快速,非常适合数据分享。

> 便携式热点,Wifi热点

android的便携式热点打开与关闭都会发出 .wifi.WIFI_AP_STATE_CHANGED 的广播,但是便携式热点相关的信息在WiFimanage中是隐藏的,这个广播是隐藏的。

private BroadcastReceiver wifiReceiver = new BroadcastReceiver(){

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (".wifi.WIFI_AP_STATE_CHANGED".equals(action)) {

//便携式热点的状态为:10---正在关闭;11---已关闭;12---正在开启;13---已开启

int state = intent.getIntExtra("wifi_state", 0);

Log.i(TAG, "state= "+state);

wiFiAPObserver.stateChanged(state);

}

}

};

//创建热点

public void createAp() {

if (mWifiManager.isWifiEnabled()) {

mWifiManager.setWifiEnabled(false);

}

try {

WifiConfiguration apConfiguration = new WifiConfiguration();

apConfiguration.SSID = WifiAdmin.SSID;

apConfiguration.preSharedKey = WifiAdmin.PassWord;

apConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);

method.invoke(mWifiManager, apConfiguration, true);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 关闭WiFi热点

*/

public void closeWifiAp() {

if (isWifiApEnabled()) {

try {

Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");

method.setAccessible(true);

WifiConfiguration config = (WifiConfiguration) method.invoke(mWifiManager);

Method method2 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);

method2.invoke(mWifiManager, config, false);

} catch (Exception e) {

e.printStackTrace();

}

}

}

/**

* 判断热点是否打开

*

* @return

*/

public boolean isWifiApEnabled() {

try {

Method method = mWifiManager.getClass().getMethod("isWifiApEnabled");

method.setAccessible(true);

return (Boolean) method.invoke(mWifiManager);

} catch (Exception e) {

e.printStackTrace();

}

return false;

}

> wifi的打开与关闭

//WiFi开关与状态监听

@Override

public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {//这个监听wifi的打开与关闭,与wifi的连接无关

Log.v("my2", "收到WIFI_STATE_CHANGED_ACTION");

int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1111);

switch (wifiState) {

case WifiManager.WIFI_STATE_DISABLED:

Log.v("my2", "收到"+"WIFI_STATE_DISABLED");

break;

case WifiManager.WIFI_STATE_DISABLING:

Log.v("my2", "收到"+"WIFI_STATE_DISABLING");

break;

case WifiManager.WIFI_STATE_ENABLED:

Log.v("my2", "收到"+"WIFI_STATE_ENABLED");

break;

case WifiManager.WIFI_STATE_ENABLING:

Log.v("my2", "收到"+"WIFI_STATE_ENABLING");

break;

case WifiManager.WIFI_STATE_UNKNOWN:

Log.v("my2", "WIFI_STATE_UNKNOWN");

}

}

}

若开机时默认为打开WIFI状态会检测到WIFI_STATE_ENABLED,只会发送这一条广播.

// 监听网络连接,包括wifi和移动数据的打开和关闭,以及连接上可用的连接都会接到监听

if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {

//获取联网状态的NetworkInfo对象

NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

if (info != null) {

//如果当前的网络连接成功并且网络连接可用

if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) {

if (info.getType() == ConnectivityManager.TYPE_WIFI || info.getType() == ConnectivityManager.TYPE_MOBILE) {

Log.i("TAG", getConnectionType(info.getType()) + "连上");

}

} else {

Log.i("TAG", getConnectionType(info.getType()) + "断开");

}

}

}

> Android网络状态监听 有网无网状态,

class NetworkChangeReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();

if (networkInfo != null && networkInfo.isAvailable()) {

switch (networkInfo.getType()) {

case TYPE_MOBILE:

Toast.makeText(context, "正在使用2G/3G/4G网络", Toast.LENGTH_SHORT).show();

break;

case TYPE_WIFI:

Toast.makeText(context, "正在使用wifi上网", Toast.LENGTH_SHORT).show();

break;

default:

break;

}

} else {

Toast.makeText(context, "当前无网络连接", Toast.LENGTH_SHORT).show();

}

}

}

}

public class NetworkConnectChangedReceiver extends BroadcastReceiver{

private static final String TAG = "NetworkChangedReceiver";

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction() == ConnectivityManager.CONNECTIVITY_ACTION) {

/*判断当前网络时候可用以及网络类型*/

boolean isConnected = NetworkUtils.isConnected();

workType networkType = NetworkUtils.getNetworkType();

EventBus.getDefault().post(new NetworkChangeEvent(isConnected, networkType));

}

}

}

-- 做到WIFI网络和GPRS网络的切换

由于Android没有提供直接切换GPRS网络的方法,通过查看系统源码发现,系统是调用IConnectivityManager类中的setMobileDataEnabled(boolean)方法来设置GPRS网络的,由于方法不可见,只能采用反射来调用。

<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_WIFI_STATE" />

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

public static void toggleMobileData(Context context, boolean enabled) {

ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

Class<?> conMgrClass = null; // ConnectivityManager类

Field conMgrField = null; // ConnectivityManager类中的字段

Object iConMgr = null; // IConnectivityManager类的引用

Class<?> iConMgrClass = null; // IConnectivityManager类

Method setMobileDataEnabledMethod = null; // setMobileDataEnabled方法

try {

// 取得ConnectivityManager类

conMgrClass = Class.forName(conMgr.getClass().getName());

// 取得ConnectivityManager类中的对象mService

conMgrField = conMgrClass.getDeclaredField("mService");

// 设置mService可访问

conMgrField.setAccessible(true);

// 取得mService的实例化类IConnectivityManager

iConMgr = conMgrField.get(conMgr);

// 取得IConnectivityManager类

iConMgrClass = Class.forName(iConMgr.getClass().getName());

// 取得IConnectivityManager类中的setMobileDataEnabled(boolean)方法

setMobileDataEnabledMethod = iConMgrClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);

// 设置setMobileDataEnabled方法可访问

setMobileDataEnabledMethod.setAccessible(true);

// 调用setMobileDataEnabled方法

setMobileDataEnabledMethod.invoke(iConMgr, 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();

}

}

如果觉得《Android网络状态监听及切换 WiFi开关与状态监听 便携式热点 Wifi热点 WI-FI直连WifiP2p》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。