1. 程式人生 > >解決Android6.0以上掃描WIFI獲得列表為空

解決Android6.0以上掃描WIFI獲得列表為空

我們知道Android SDK23之後Google對許多許可權進行了修改,比如wifi和藍芽。在Android6.0及以上掃描WIFI必須先開啟GPS,否則掃描得到的WIFI列表為空。解決方法如下:

1.首先在AndroidManifest.xml檔案中再增加以下許可權

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
></uses-permission>
2.可以在自定義的掃描函式裡做如下限制,在掃描之前提醒使用者開啟GPS

   /**
     * 掃描Wifi
     * @param context
     */
    public void startScan(Context context){

LocationManager locManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);

    if(!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){         // 未開啟位置開關,可能導致定位失敗或定位不準,提示使用者或做相應處理
    Toast.makeText(context,"未開啟GPS,無法掃描", Toast.LENGTH_SHORT).show();  
    }else {

//開始掃描
        mWifiManager.startScan();

 .....

}

}

3.但是打開了GPS之後這樣做還是無法得到掃描結果的,得到的List的size還是為零,這是為什麼呢?經過一番查詢之後,

原來是還要在程式碼中開啟ACCESS_COARSE_LOCATION許可權在呼叫上述方法之前,先呼叫下面這個方法。

public void requestLocationPermission(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//如果 API level 是大於等於 23(Android 6.0) 時
      //判斷是否具有許可權
if (ContextCompat.checkSelfPermission
(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //判斷是否需要向用戶解釋為什麼需要申請該許可權 if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION)) { Toast.makeText(getActivity(), "自Android 6.0開始需要開啟位置許可權才可以搜尋到WIFI裝置", Toast.LENGTH_SHORT); } //請求許可權 ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE_ACCESS_COARSE_LOCATION); } } }
這樣就能準確的掃描到wifi了。當然更快捷的方法把專案的目標SDK和最小SDK都設定23以下。