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_ACTION

RSSI信号强度变化

ConnectivityManager.CONNECTIVITY_ACTION

是否已连接

wifiManager. WIFI_STATE_CHANGED_ACTION

wifi状态变化触发,触发两次

wifiManager.NETWORK_IDS_CHANGED_ACTION

当连接请求状态发生改变时会收到。

wifiManager.SCAN_RESULTS_AVAILABLE_ACTION

扫描是否有可用列表

wifiManager.NETWORK_STATE_CHANGED_ACTION

wifi连接网络的状态广播,连接过程中接收多次,在连接过程中可与获取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概要了。