Wifi请求权限和Action概要

Wifi请求权限概要

关于WiFi请求中不同对应的功能,应该要申请哪些权限,在这篇文章中我进行了汇总,包括权限的请求,广播添加的action值,以及Android6.0后动态申请定位权限的内容。

AndroidMainfest.xml

获取权限

在AndroidMainfest中常常用到的网络权限和定位如下所示:

	<!--获取网络状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--获取wifi状态-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <!--改变wifi状态-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <!--获取粗略位置-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <!--获取精确位置-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Tips:但有时候我们使用的功能可能没有这么多,比如仅仅只是改变WiFi状态,并不获取WiFi列表等操作的话,如下两个权限就足够了。

 	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
 	<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
广播

WiFi状态的监听不免需要通过服务(Service)接收广播的形式来进行,所以可以通过如下的action来监听WiFi广播所需要的权限。如果是监听网络状态的话如下四个Action已经足够。

  <receiver android:name="number.nine.wbhelper.WIFIBroadcastReceiver">
            <intent-filter android:priority="1000">
            	<!--wifi状态监听-->
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
                <action android:name="android.net.wifi.STATE_CHANGE"/>
                <action android:name="android.net.wifi.supplicant.STATE_CHANGE"/>
                <action android:name="android.net.wifi.NETWORK_IDS_CHANGED"/>
            </intent-filter>
        </receiver>

如下是对应Action的描述

ACTION NAME描述
wifiManager.RSSI_CHANGED_ACTIONRSSI信号强度变化
ConnectivityManager.CONNECTIVITY_ACTION是否已连接
wifiManager. WIFI_STATE_CHANGED_ACTIONwifi状态变化触发,触发两次
wifiManager.NETWORK_IDS_CHANGED_ACTION当连接请求状态发生改变时会收到。
wifiManager.SCAN_RESULTS_AVAILABLE_ACTION扫描是否有可用列表
wifiManager.NETWORK_STATE_CHANGED_ACTIONwifi连接网络的状态广播,连接过程中接收多次,在连接过程中可与获取NetworkInfo对象
wifiManager.SUPPLICANT_STATE_CHANGED_ACTION发送WIFI连接的过程信息,如果出错ERROR信息才会收到。连接WIFI时触发,触发多次。
wifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION判断是否WIFI打开了,变化触发一次

可添加如下Action进行广播监听

   /**
     * 监听wifi状态的广播
     * SCAN_RESULTS_AVAILABLE_ACTION为扫描wifi动作
     */
    private void registerBroadcast(boolean on){
        if (on){
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(wifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
            intentFilter.addAction(wifiManager.RSSI_CHANGED_ACTION);
            intentFilter.addAction(wifiManager.NETWORK_STATE_CHANGED_ACTION);
            intentFilter.addAction(wifiManager.WIFI_STATE_CHANGED_ACTION);
            intentFilter.addAction(wifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
            intentFilter.addAction(wifiManager.NETWORK_IDS_CHANGED_ACTION);
            intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
            wcontext.registerReceiver(mBroadcastReceiver,intentFilter);
        }else {
            wcontext.unregisterReceiver(mBroadcastReceiver);
        }
    }

在接收到广播后亦然可以通过如下的方式进行判断当前的一个状态

	//网络是否连接进行判断
	private boolean isConnected(Context context){
		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo net = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
		if(net != null && net.getState()==State.CONNECTED){
			return true;
		}//为网络状态可以用来判断
		return false;
	}
	//可判断状态有以下6种
	public enum State {
        CONNECTING, CONNECTED, SUSPENDED, DISCONNECTING, DISCONNECTED, UNKNOWN
    }

动态权限判断

动态权限可谓是Android 6.0之后的常客了,在WiFi中常常需要动态定位权限的判断。如果需求获取WiFi列表等操作,进行定位的动态权限申请是必不可少的。

检测定位权限

系统自带的检测方式

if (ActivityCompat.checkSelfPermission(wcontext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return null;
        }

通过LocationManager获取的权限检测方式

  public boolean getlocationState(Context context){
        LocationManager manager=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        boolean isGPS=manager.isProviderEnabled(LocationManager.GPS_PROVIDER);//判断是否打开GPS
        boolean isNetwork=manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);//判断是否打开网络
        return isGPS||isNetwork;
    }
动态申请定位权限

如下可进行动态定位权限申请,其中如果没有打开GPS,只是拿到了定位权限也是获取不了WiFi列表的,所以需要进行权限页的跳转和检测如下。

 public boolean checkLocationPermission(Context context){
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M&&
                context.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) !=PackageManager.PERMISSION_GRANTED){
            Activity activity=(Activity)context;
            activity.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},100);
            if (getlocationState(context)){
                Intent intent=new Intent();
                intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                context.startActivity(intent);
            }//未打开GPS则跳转到设置页
            return false;
        }else {
            if (getlocationState(context)){
                Intent intent=new Intent();
                intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                context.startActivity(intent);
            }
            return true;
        }
    }

综上,则是WiFi相关的权限和Action概要了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值