web-dev-qa-db-ja.com

Android 10 / API 29:設定済みネットワークに接続する方法]

私はユーザーが次の手順に従う必要があるアプリケーションに取り組んでいます。

  1. 電話をWiFiに接続します。
  2. 接続されているオブジェクトから電話を専用のホットスポットに接続します。

ユーザーが接続されているオブジェクトの専用ホットスポットに接続されている場合、アプリケーションはそれを構成するためにいくつかのHTTP要求を実行します。次に、ステップ1のグローバルWiFiへのアプリケーションを自動的に再接続したいと思います。

API 21からAPI 28まで、私が電話を再接続したいSSIDを知っているので、この機能は非常に簡単です。数列のコードで行うことができます。

private fun changeCurrentWifiNetworkLegacy(ssidToConnect: String) {
    val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

    var ssidIdentifier: Int? = null

    wifiManager.configuredNetworks?.forEach { config ->
        Log.d("SSID", config.SSID)

        if (config.SSID == "\"${ssidToConnect}\"") {
            ssidIdentifier = config.networkId
        }
    }

    ssidIdentifier?.let { id ->
        wifiManager.enableNetwork(id, true)
    }
}
 _

API 29このシンプルなコードは、この記事によればもう機能しません. https://developer.android.com/about/version/10/privacy/changes#configure-wifi

記事によると、今、私は2つのクラスを使用する必要があります。WifiNetworkSpecifierおよび/またはWifiNetworkSuggestion

残念ながら、ユーザーを前の設定されたSSIDに接続するには、これらのクラスを使用して実行例を見つけることができません。

誰かがすでにそれを達成しますか?

ご協力ありがとうございました。

11
rolandl

次のコードでどのネットワークに接続するかを設定できます。

_if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
    val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .setNetworkSpecifier(
            WifiNetworkSpecifier.Builder()
                .setSsid("My ssid")
                .build()
        )
        .build()
    cm.requestNetwork(networkRequest, object: ConnectivityManager.NetworkCallback() {
        override fun onUnavailable() {
            Log.d("TEST", "Network unavailable")
        }

        override fun onAvailable(network: Network) {
            Log.d("TEST", "Network available")
        }
    })
}
_

これにより、ConnectivityManagerの NetworkRequest メソッドを使用して、特定のSSIDを使用してネットワークを要求します。

この方法では、_Settings.System.canWrite(Context)で決定されたように、呼び出し側に_Manifest.permission.CHANGE_NETWORK_STATE_権限またはシステム設定を変更する機能を保持する必要があります。

より多くの情報を得ることができる情報については、 NetworkCallback クラスを参照してください。

(編集:輸送タイプの追加の追加。)

さらに編集:.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)を使用して正しく機能する必要がありました。 WiFinetWorkspecifierでは

ローカルWiFiネットワークを要求するためにのみ使用できます(I.Eインターネット機能なし)

によると ドキュメント

これにより、デバイスのポップアップの要求が表示されますが、最終的に求めたWiFiネットワークが私に表示されます。

2
MungoRae