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概要了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/170665.html
標籤:其他
下一篇:Android 引導頁
