45

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

このコードは通常のコードです: を登録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 に何か新しいものがありますか、それとも単に孤立したケースですか?

4

5 に答える 5

35

AOSP イシュー トラッカーの問題185370で関連する問題を見つけました。 GPS がオフの場合、WifiManager#getScanResults() は空の配列リストを返します。

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

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

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

于 2015-10-27T07:37:56.643 に答える
7

編集

したがって、問題は新しい許可処理にあるようです。Wi-Fi コードに進む前に許可を求める必要があります。次に例を示します。

// 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 権限が必要です。

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

于 2015-08-22T02:38:11.880 に答える