打开和关闭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 需要在同一个进程上关闭和打开