web-dev-qa-db-ja.com

SCAN_RESULTS_AVAILABLE_ACTIONはAndroid 6.0で空のリストを返します

昨日、Nexus 5はAndroid MNCバージョンへ6.0 - Marshmallow。それ以降、デバイスで使用可能なネットワークをスキャンするアクションはリストの受信を停止します。この場合、結果リストのサイズは0になり、Wifiシステム設定に10以上のWifiネットワークがリストされている場合でもです。

これのコードは通常です:SCAN_RESULTS_AVAILABLE_ACTIONそして、次のようにReceiverでイベントを待ちます:

// Register the Receiver in some part os fragment...
getActivity().registerReceiver(wifiListener, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
wifiManager.startScan();

// Inside the receiver:
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> results = wifiManager.getScanResults();
// the result.size() is 0 after update to Android v6.0, same code working in older devices.

これについて APIの変更 トピックで検索しましたが、この機能に重大な変更はありませんでした。

誰もこれに気づきましたか? APIの何か新しいものですか、それとも単なる孤立したケースですか?

45

AOSP課題トラッカーの問題に関連する問題があります 18537 WifiManager#getScanResults()は、GPSがオフになっている場合、空の配列リストを返します。

問題は #1 から言及しています。モバイルは、モバイルのwifiリストを取得するために位置情報サービスを開く必要があります。

そして #18 から、Androidプロジェクトメンバーは、開発チームが報告した問題を修正し、今後のビルドで利用可能になると主張しています。

APPはtargetSdkVersion 23にあり、上記のソリューションに従って実行時のアクセス許可を確認します。位置情報サービスの問題を有効にすると、Android今後のリリースで修正されます。

34
Fantasy Fang

編集

そのため、問題は新しいアクセス許可の処理にあるようです。 wifiコードに進む前に許可を求める必要があります。以下に例を示します。

_// call this method only if you are on 6.0 and up, otherwise call doGetWifi()
private void getWifi() {
    if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 0x12345);
    } else {
        doGetWifi(); // the actual wifi scanning
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 0x12345) {
        for (int grantResult : grantResults) {
            if (grantResult != PackageManager.PERMISSION_GRANTED) {
                return;
            }
        }
        getWifi();
    }
}
_

このチェックはアクティビティで実行する必要があります。

元のサンプルコードは利用可能です ここ 、このトピックで説明されている問題に従って修正されています。

元の

リンクされた APIの変更 に応じて、アプリケーションにはいずれかのロケーション許可が必要です。見積もり:

WifiManager.getScanResults():アプリにはACCESS_FINE_LOCATIONまたはACCESS_COARSE_LOCATION権限が必要です。

_SCAN_RESULTS_AVAILABLE_ACTION_アクションでBroadcastReceiverが受信した 新しいブールキー があることに注意してください:_EXTRA_RESULTS_UPDATED_。これは、スキャンが完了し、wifiManager.getScanResults()を呼び出して結果にアクセスできるかどうかを示します。

7

GPSがオンになっていないと機能しません。奇妙なことですが、それが私がwifiのリストを取得する唯一の方法です:-(。

3
Robbie

指定された応答に加えて、 checkSelfPermissionContextCompatを使用して、下位Androidバージョン:

if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_CODE_ACCESS_FINE_LOCATION);
    // Get the result in onRequestPermissionsResult(int, String[], int[])
} else {
    // Permission was granted, do your stuff here
}
3
CptSadface