打开和关闭wifi和移动数据链接
前一段时间,公司里面有一个这样的需要,就是要控制用户的连网方式,当时一听,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" />
上面的注释也挺多的了,如果还有什么不明白的,可以留言
好啦,这一次就到这里,接下来,我会陆续把我自己在工作上遇到的技术难点写出来的啦,和大家一起学习
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。