现在的位置: 首页 > 综合 > 正文

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

2014年08月05日 ⁄ 综合 ⁄ 共 3784字 ⁄ 字号 评论关闭

前一段时间,公司里面有一个这样的需要,就是要控制用户的连网方式,当时一听,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" />

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

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

源码下载



抱歉!评论已关闭.