打开和关闭wifi和移动数据链接
http://blog.****.net/u011485531/article/details/18016351
最新实战教程,让你了解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" />
上面的注释也挺多的了,如果还有什么不明白的,可以留言
好啦,这一次就到这里,接下来,我会陆续把我自己在工作上遇到的技术难点写出来的啦,和大家一起学习
最新实战教程,让你了解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和移动数据链接
- iOS12加密相册、保险箱、加密相册Pro、保险箱Pro打开就闪退的,不要删除app,关闭4g和WiFi即可正常使用。
- unity打开移动摄像头,并自适应屏幕显示摄像头数据。兼容android和ios
- unity打开移动摄像头,并自适应屏幕显示摄像头数据。兼容android和ios
- Android: wifi打开和关闭的流程解析
- Android: wifi打开和关闭的流程解析
- Qt操作SQLite数据库——创建、打开、关闭、增加、删除和修改操作
- 移动性能测试工具perfDog分享和wifi链接问题
- 实体框架何时打开和关闭数据库连接?
- PHP中用mysqli面向对象打开、连接和关闭mysql数据库的方法
- AMD宣布350亿美元收购赛灵思,CPU、GPU、FPGA全凑齐,中国握有否决权
- 前端程序调试方法总结--高级版