簡體   English   中英

如何在 Android 9.0(PIE) 中獲取 WIFI SSID?

[英]How to get WIFI SSID in Android 9.0(PIE)?

如何在 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

Android 版本 9 (Pie) 更改需要(由用戶)啟用位置,否則即使您的應用具有正確的權限,對 getConnectioInfo() 的調用也會失敗。 這在Android 9 更改中有記錄(摘錄如下):


限制訪問 Wi-Fi 位置和連接信息

在 Android 9 中,應用執行 Wi-Fi 掃描的權限要求比以前的版本更嚴格。 有關詳細信息,請參閱 Wi-Fi 掃描限制。

類似的限制也適用於 getConnectionInfo() 方法,它返回一個描述當前 Wi-Fi 連接的 WifiInfo 對象。 如果調用應用程序具有以下權限,則只能使用此對象的方法來檢索 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));

這與權限有關....自 API 級別 27 以來,您需要ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION權限。 您可能還需要CHANGE_WIFI_STATE for Android 9(根據https://developer.android.com/guide/topics/connectivity/wifi-scan無論如何,wifi 掃描就是這種情況)

您可以通過位置權限訪問您在 Android 8 中連接到它的 ssid wifi,但在 android 9 中您必須打開位置。 在此處閱讀更多信息: https : //developer.android.com/about/versions/pie/android-9.0-changes-all

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM