web-dev-qa-db-ja.com

Android 9.0(PIE)でWIFI SSIDを取得する方法は?

Android 9.0(PIE)でWIFI SSIDを取得する方法は?コードはAndroidバージョン8.1.0までは正常に機能していますが、Android 9.0では機能していません

ConnectivityManager connManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo.isConnected()) {
            WifiManager wifiManager = (WifiManager) activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            wifiInfo.getSSID();
            String name = networkInfo.getExtraInfo();
            String ssid = "\"" + wifiInfo.getSSID() + "\"";
}

しかし、このコードはAndroid 9.0では動作しません

6
Abhinav Tiwari

Androidバージョン9(Pie)を変更するには、(ユーザーが)Locationを有効にする必要があります。そうしないと、アプリに正しい権限がある場合でもgetConnectioInfo()の呼び出しが失敗します。これは Android 9の変更 (以下の抜粋)で文書化されています:


Wi-Fiの場所と接続情報への制限されたアクセス

Android 9では、アプリがWi-Fiスキャンを実行するための許可要件は、以前のバージョンよりも厳密です。詳細については、Wi-Fiスキャンの制限を参照してください。

同様の制限は、現在のWi-Fi接続を記述するWifiInfoオブジェクトを返すgetConnectionInfo()メソッドにも適用されます。呼び出し元アプリに次のアクセス許可がある場合にのみ、このオブジェクトのメソッドを使用してSSIDおよびBSSID値を取得できます。

  • ACCESS_FINE_LOCATIONまたはACCESS_COARSE_LOCATION
  • ACCESS_WIFI_STATE

SSIDまたはBSSIDを取得するには、デバイスでロケーションサービスを有効にする必要もあります([設定]> [ロケーション]の下)。


私の場合、WIFI SSIDを読み取ろうとする前に、以下の関数を呼び出して(Android 9+)で実行している場合のみ)、位置情報が有効かどうかを検出します。

public static boolean isLocnEnabled(Context context) {
    List locnProviders = null;
    try {
        LocationManager lm =(LocationManager) context.getApplicationContext().getSystemService(Activity.LOCATION_SERVICE);
        locnProviders = lm.getProviders(true);

        return (locnProviders.size() != 0);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (BuildConfig.DEBUG) {
            if ((locnProviders == null) || (locnProviders.isEmpty()))
                Log.d(TAG, "Location services disabled");
            else
                Log.d(TAG, "locnProviders: " + locnProviders.toString());
        }
    }
    return(false);
}

位置情報が有効になっていない場合、必要であることを示すダイアログがポップアップし、ユーザーが位置設定ページにジャンプできるようになります(以下のコードを参照)。

context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
9
gOnZo

これは権限に関連しています。..APIレベル27では、ACCESS_FINE_LOCATIONまたはACCESS_COARSE_LOCATION許可。また、CHANGE_WIFI_STATE for Android 9(Wi-Fiスキャンの場合はとにかく https://developer.Android.com/guide/topics/connectivity/wifi-scan

1
John O'Reilly

接続されているssid wifiにアクセスするには、Android 8で場所の許可が必要ですが、Android 9では場所をオンにする必要があります。詳細はこちら: https://developer.Android.com/about/versions/pie/Android-9.0-changes-all

0
Mohammad Davari