Android 10(API レベル 29)以降を搭載しているデバイスでは、アプリからネットワークを追加できます。
認証情報が必要です。Google Cloud の
接続先のネットワークの提案
WifiNetworkSuggestion
。
プラットフォームは、状態に基づいて受け入れるアクセス ポイントを
入力をモニタリングできます。
Android 11(API レベル 30)以降の場合:
PasspointConfiguration
をプロビジョニングする Suggestion API でサポートされます。Android 11 より前は、PasspointConfiguration
のプロビジョニングaddOrUpdatePasspointConfiguration()
を使用する必要があります。 API- このフレームワークでは、TLS ベースの Enterprise
提案機能(EAP-TLS、EAP-TTLS、EAP-PEAP)ネットワーク リソースへの
Root CA certificate
を設定する必要があります。 およびserver domain name
。
- フレームワークは EAP-SIM ベースのエンタープライズに対して所有権要件を適用します 提案機能(EAP-SIM、EAP-AKA、EAP-AKA-PRIME)このような提案は 携帯通信会社によって署名されたアプリでのみ許可されます。
- 携帯通信会社によって署名されたアプリによって提案される場合、フレームワークは自動的に 携帯通信会社の ID が割り当てられます。 キャリア署名を使用します。そのような 対応する SIM を取り外すと、候補が自動的に無効になります ダウンロードします。
Android 12(API レベル 31)以降の場合:
非永続的な MAC アドレスのランダム化によって、追加のプライバシーを有効にできます。 ランダム化された MAC アドレスを定期的に再ランダム化します。
setMacRandomizationSetting
を使用する ネットワークのランダム化のレベルを指定しますisPasspointTermsAndConditionsSupported()
: 利用規約は Passpoint 機能であり、ネットワーク デプロイにおいて、オープン ネットワークを使用する安全でないキャプティブ ポータルを安全な Passpoint ネットワークに置き換えることができます。利用規約への同意が必要な場合は、通知が表示されます。利用規約によって制限される Passpoint ネットワークを提案するアプリでは、まずこの API を呼び出して、デバイスが機能をサポートしていることを確認する必要があります。デバイスが機能をサポートしていない場合、このネットワークには接続できず、代替ネットワークまたはレガシー ネットワークを提案する必要があります。isDecoratedIdentitySupported()
: プレフィックス装飾でネットワークの認証を行う場合、装飾された ID プレフィックスにより、ネットワーク事業者はネットワーク アクセス識別子(NAI)を更新して、AAA ネットワーク内の複数のプロキシを経由して明示的なルーティングを行えます(詳細については RFC 7542 をご覧ください)。Android 12 では、PPS-MO 拡張の WBA 仕様に適合するようにこの機能が実装されています。装飾された ID を必要とする Passpoint ネットワークを提案するアプリでは、まずこの API を呼び出して、デバイスが機能をサポートしていることを確認する必要があります。デバイスが機能をサポートしていない場合、ID が装飾されず、ネットワークの認証が失敗する可能性があります。
Passpoint の提案を作成するには、アプリで PasspointConfiguration
、Credential
、HomeSp
クラスを使用する必要があります。これらのクラスは、Wi-Fi Alliance Passpoint 仕様で定義されている Passpoint プロファイルを記述します。
次のコードサンプルは、開いている 1 つのテーブルに認証情報を提供する方法を示しています。 WPA2、WPA3 ネットワークと Passpoint ネットワーク:
Kotlin
val suggestion1 = WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion2 = WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion3 = WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val passpointConfig = PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration val suggestion4 = WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestionsList = listOf(suggestion1, suggestion2, suggestion3, suggestion4); val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager; val status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here } // Optional (Wait for post connection broadcast to one of your suggestions) val intentFilter = IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); val broadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here } }; context.registerReceiver(broadcastReceiver, intentFilter);
Java
final WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion2 = new WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion3 = new WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final PasspointConfiguration passpointConfig = new PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration final WifiNetworkSuggestion suggestion4 = new WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final List<WifiNetworkSuggestion> suggestionsList = new ArrayList<WifiNetworkSuggestion> {{ add(suggestion1); add(suggestion2); add(suggestion3); add(suggestion4); }}; final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final int status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here… } // Optional (Wait for post connection broadcast to one of your suggestions) final IntentFilter intentFilter = new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (!intent.getAction().equals( WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here... } }; context.registerReceiver(broadcastReceiver, intentFilter);
アプリが初めて候補を出すとすぐに、ユーザーは 通知されます。通知の種類は、搭載されている Android のバージョンによって異なります 次の操作を行います。
- Android 11(API レベル 30)以降では、アプリが動作していれば、ユーザーにダイアログが表示されます。 通知と、アプリが実行中の場合は通知も 説明します。
- Android 10(API レベル 29)では、 アプリがフォアグラウンドとバックグラウンドのどちらで実行されているかを確認します。
プラットフォームがネットワーク候補のいずれかに接続すると、設定が表示されます。 ネットワーク接続を、対応する提案者アプリに関連付けるテキスト。
ユーザーが接続を解除した場合の処理
ユーザーが Wi-Fi 選択ツールを使用して、 接続時にネットワーク候補が表示され、そのネットワークが 範囲内にあります。この期間中、そのネットワークは (アプリがネットワーク候補を削除して再度追加した場合も含む) 割り当てられていますユーザーが Wi-Fi 選択ツールを使用して明示的に 切断されたネットワークに接続すると、そのネットワークは 直ちに自動接続の対象になります。
アプリの承認ステータスの変更
ユーザーがネットワーク候補の通知を拒否すると、
CHANGE_WIFI_STATE
権限。ユーザーはこの承認を付与できます
後で Wi-Fi のコントロール メニュー([設定] >
アプリと通知 >特別なアプリ
アクセス >[Wi-Fi 制御] >App name など)。