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概要了。