Android 11 デベロッパー プレビュー 2 が公開されました。ぜひお試しのうえ、フィードバックをお寄せください

インターネット接続のための Wi-Fi サジェスチョン API

Android 10 (API レベル 29) 以上 を実行している端末では、アプリが Wi-Fi アクセスポイントに自動接続する端末のネットワーク認証情報を追加できます。WifiNetworkSuggestion を使用して、接続先となるネットワークのサジェスチョンを提供できます。プラットフォームは最終的に、アプリなどからの入力情報に基づいて、受け入れるアクセス ポイントを選択します。

以下は、オープンネットワーク、WPA2 ネットワーク、WPA3 ネットワークのそれぞれに認証情報を提供する方法を示したコードサンプルです。

Kotlin

val suggestion1 = WifiNetworkSuggestion.Builder()
        .setSsid("test111111")
        .setIsAppInteractionRequired() // Optional (Needs location permission)
        .build()

val suggestion2 = WifiNetworkSuggestion.Builder()
        .setSsid("test222222")
        .setWpa2Passphrase("test123456")
        .setIsAppInteractionRequired() // Optional (Needs location permission)
        .build()

val suggestion3 = WifiNetworkSuggestion.Builder()
        .setSsid("test333333")
        .setWpa3Passphrase("test6789")
        .setIsAppInteractionRequired() // Optional (Needs location permission)
        .build()

val suggestionsList = listOf(suggestion1, suggestion2, suggestion3)

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() // Optional (Needs location permission)
  .build()

final WifiNetworkSuggestion suggestion2 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test222222")
  .setWpa2Passphrase("test123456")
  .setIsAppInteractionRequired() // Optional (Needs location permission)
  .build()

final WifiNetworkSuggestion suggestion3 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test333333")
  .setWpa3Passphrase("test6789")
  .setIsAppInteractionRequired() // Optional (Needs location permission)
  .build()

final List<WifiNetworkSuggestion> suggestionsList =
  new ArrayList<WifiNetworkSuggestion> {{
    add(suggestion1);
    add(suggestion2);
    add(suggestion3);
  }};

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);

プラットフォームがネットワークへの接続を開始する前に、ユーザーがアプリからのサジェスチョンを承認する必要があります。この承認は、アプリからのいずれかのサジェスチョンと一致するネットワークをプラットフォームがスキャン結果から初めて検出したときの通知に応答する形で、ユーザーによって行われます。プラットフォームがネットワーク サジェスチョンの 1 つに接続すると、設定には、ネットワーク接続をサジェスチョンを出したアプリに関連付けるテキストが表示されます。

ユーザーによる切断の取り扱い

ユーザーが Wi-Fi ピッカーを使用して、接続中のネットワーク サジェスチョンのいずれかから明示的に切断すると、そのネットワークは 24 時間ブラックリストに登録されます。ブラックリスト期間中、アプリがそのネットワークに相当するネットワーク サジェスチョンを削除して再追加しても、そのネットワークは自動接続の対象になりません。

アプリの承認ステータスを変更する

ユーザーがネットワーク サジェスチョン通知を拒否すると、アプリから CHANGE_WIFI_STATE パーミッションが削除されます。ユーザーは、Wi-Fi 制御メニューに移動して、後でこの承認を付与できます (設定 > アプリと通知 > 特別なアプリアクセス > Wi-Fi 制御 > アプリ名)。