昨日、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の何か新しいものですか、それとも単なる孤立したケースですか?
AOSP課題トラッカーの問題に関連する問題があります 18537 WifiManager#getScanResults()は、GPSがオフになっている場合、空の配列リストを返します。
問題は #1 から言及しています。モバイルは、モバイルのwifiリストを取得するために位置情報サービスを開く必要があります。
そして #18 から、Androidプロジェクトメンバーは、開発チームが報告した問題を修正し、今後のビルドで利用可能になると主張しています。
APPはtargetSdkVersion 23にあり、上記のソリューションに従って実行時のアクセス許可を確認します。位置情報サービスの問題を有効にすると、Android今後のリリースで修正されます。
そのため、問題は新しいアクセス許可の処理にあるようです。 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()
を呼び出して結果にアクセスできるかどうかを示します。
GPSがオンになっていないと機能しません。奇妙なことですが、それが私がwifiのリストを取得する唯一の方法です:-(。
指定された応答に加えて、 checkSelfPermission
のContextCompat
を使用して、下位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
}