打开和关闭wifi和移动数据链接

Posted MiracleAce

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打开和关闭wifi和移动数据链接相关的知识,希望对你有一定的参考价值。



最新实战教程,让你了解Android自动化刷量、作弊与防作弊的那些事,案例:刷友盟统计、批量注册苹果帐号





前一段时间,公司里面有一个这样的需要,就是要控制用户的连网方式,当时一听,wifi还好控制啦,但是那个gprs这些移动数据好像没有api的

结果一查,还真没有api给你控制,那就只好自己想办法了,当时想到,好像设置里面有这样一个开关的

然后就这样,就翻开了settings的源码来看了

结果还真让我找到了源码里面是怎样关闭移动数据的链接的

其实ConnectivityManager这个类就是控制我们的移动数据的,但它没有公开打开和关闭的这个方法,所以我们就要通过反射来调用它的这个方法了

好了,废话不多说,我们直接上图,看看效果

下面是代码

package com.xiaobin.test;

import java.lang.reflect.Method;

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener

	private Button bt_open_wifi;
	private Button bt_close_wifi;
	private Button bt_open_gprs;
	private Button bt_close_gprs;
	private WifiManager wifiManager;
	private TelephonyManager telephonyManager;
	private ConnectivityManager connectivityManager;
	// 这个是查看一下,现在有没有联网,如果有联网就为true,没有就为false
	private boolean isConnect = false;

	private Method method;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 拿到一个wifi管理器,用来管理wifi的开关
		wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
		// 拿到一个telphonyManager,用来判断我们现在有没有联网的
		telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
		if (telephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED)
		
			isConnect = true;
			System.out.println(isConnect);
		
		// 拿到一个链接管理器,打开和关闭数据链接都通过它控制了
		connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
		if (networkInfo == null)
		
			System.out.println("当前没有联网");
		
		else
		
			System.out.println(networkInfo.isAvailable());
			System.out.println(networkInfo.getTypeName());
		

		try
		
			// 这个是ConnectivityManager里面的一个隐藏方法,用它可以对移动数据也就是我们一般所说的gprs这些进行打开或关闭的
			// 这里有一个值得注意的就是它传递的参数是一个boolean的值,所以这个class就是要boolean.class或Boolean.TYPE
			// 我之前就是想当然的用到了Boolean.class结果弄了很久才发现过来,这是错的
			method = ConnectivityManager.class.getDeclaredMethod(
					"setMobileDataEnabled", Boolean.TYPE);
		
		catch (Exception e)
		
			e.printStackTrace();
		

		bt_open_wifi = (Button) findViewById(R.id.bt_open_wifi);
		bt_close_wifi = (Button) findViewById(R.id.bt_close_wifi);
		bt_open_gprs = (Button) findViewById(R.id.bt_open_gprs);
		bt_close_gprs = (Button) findViewById(R.id.bt_close_gprs);
		bt_open_wifi.setOnClickListener(this);
		bt_close_wifi.setOnClickListener(this);
		bt_open_gprs.setOnClickListener(this);
		bt_close_gprs.setOnClickListener(this);
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	

	@Override
	public void onClick(View v)
	
		switch (v.getId())
		
			case R.id.bt_open_wifi:
				if (!wifiManager.isWifiEnabled())
				
					wifiManager.setWifiEnabled(true);
					System.out.println("正在打开wifi");
				
				break;

			case R.id.bt_close_wifi:
				if (wifiManager.isWifiEnabled())
				
					wifiManager.setWifiEnabled(false);
					System.out.println("正在关闭wifi");
				
				break;

			case R.id.bt_open_gprs:
				if (!isConnect)
				
					try
					
						method.invoke(connectivityManager, true);
						System.out.println("正在打开gprs");
						isConnect = true;
					
					catch (Exception e)
					
						e.printStackTrace();
					
				
				break;

			case R.id.bt_close_gprs:
				if (isConnect)
				
					try
					
						method.invoke(connectivityManager, false);
						System.out.println("正在关闭gprs");
						isConnect = false;
					
					catch (Exception e)
					
						e.printStackTrace();
					
				
				break;

			default:
				break;
		
	



其实上面的代码也是非常的简单啦,就主要的就是一个隐藏的函数setMobileDataEnabled,通过反射调用一下它就好啦

当然,还要加上相应的权限喔

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

上面的注释也挺多的了,如果还有什么不明白的,可以留言


好啦,这一次就到这里,接下来,我会陆续把我自己在工作上遇到的技术难点写出来的啦,和大家一起学习


源码下载




以上是关于打开和关闭wifi和移动数据链接的主要内容,如果未能解决你的问题,请参考以下文章

IOS IPAD UIpopovercontroller 需要在同一个进程上关闭和打开

预测组织的开业和关闭

Opera:检测后退、前进、刷新和关闭事件

移动到 QGraphicsView 时创建没有窗口打开和关闭的 pyqtgraph 图

ADO.NET链接执行SQL的小白思路

NodeJS - 在移动 Android/iPhone 中打开和关闭 Tourch/手电筒