Wi-Fi Network Request API untuk konektivitas peer-to-peer

Di Android 10 (level API 29) dan perangkat yang lebih baru, Anda dapat menggunakan API peer to peer baru untuk melakukan konfigurasi bootstrap untuk perangkat sekunder seperti hardware Chromecast dan Google Home. Dengan fitur ini, aplikasi Anda dapat meminta pengguna untuk mengubah titik akses yang terhubung dengan perangkat menggunakan WifiNetworkSpecifier untuk mendeskripsikan properti jaringan yang diminta.

Untuk menggunakan API ini, lakukan hal berikut:

  1. Buat penentu jaringan Wi-Fi menggunakan WifiNetworkSpecifier.Builder.

  2. Setel filter jaringan untuk mencocokkan jaringan yang akan dihubungkan, beserta kredensial yang diperlukan.

  3. Tentukan kombinasi SSID, SSID pattern, BSSID, dan BSSID pattern untuk menyetel filter jaringan di setiap permintaan, dengan tunduk kepada persyaratan berikut:

    • Setiap permintaan harus menyediakan setidaknya salah satu dari SSID, SSID pattern, BSSID, atau BSSID pattern
    • Setiap permintaan hanya dapat menetapkan satu dari SSID atau SSID pattern
    • Setiap permintaan hanya dapat menetapkan satu dari BSSID atau BSSID pattern
  4. Tambahkan penentu ke permintaan jaringan bersama dengan instance NetworkCallback untuk melacak status permintaan.

    Jika pengguna menerima permintaan dan koneksi ke jaringan berhasil, NetworkCallback.onAvailable() akan dipanggil pada objek callback. Jika pengguna menolak permintaan atau jika koneksi ke jaringan gagal, NetworkCallback.onUnavailable() akan dipanggil pada objek callback.

Memulai permintaan untuk terhubung ke perangkat peer akan meluncurkan kotak dialog di perangkat yang sama, tempat pengguna perangkat dapat menerima permintaan koneksi.

Mem-bypass persetujuan pengguna

Setelah pengguna menyetujui jaringan yang akan dihubungkan sebagai respons atas permintaan dari aplikasi tertentu, perangkat akan menyimpan persetujuan untuk titik akses tertentu. Jika aplikasi membuat permintaan tertentu untuk terhubung ke titik akses tersebut lagi, perangkat akan melewati fase persetujuan pengguna dan otomatis terhubung ke jaringan. Jika pengguna memilih untuk melupakan jaringan saat terhubung ke jaringan yang diminta oleh API, persetujuan yang disimpan ini untuk kombinasi aplikasi dan jaringan tersebut akan dihapus, dan semua permintaan di masa mendatang dari aplikasi harus disetujui lagi oleh pengguna. Jika aplikasi membuat permintaan tidak spesifik, seperti dengan pola SSID atau BSSID, pengguna harus menyetujui permintaan tersebut.

Contoh kode

Contoh kode berikut menunjukkan cara terhubung ke jaringan terbuka dengan awalan SSID "test" dan OUI BSSID "10:03:23":

Kotlin

val specifier = WifiNetworkSpecifier.Builder()
    .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
    .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
    .build()

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .setNetworkSpecifier(specifier)
    .build()

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

val networkCallback = object : ConnectivityManager.NetworkCallback() {
    ...
    override fun onAvailable(network: Network?) {
        // do success processing here..
    }

    override fun onUnavailable() {
        // do failure processing here..
    }
    ...
}
connectivityManager.requestNetwork(request, networkCallback)
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback)

Java

final NetworkSpecifier specifier =
  new WifiNetworkSpecifier.Builder()
  .setSsidPattern(new PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
  .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
  .build();

final NetworkRequest request =
  new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .setNetworkSpecifier(specifier)
  .build();

final ConnectivityManager connectivityManager = (ConnectivityManager)
  context.getSystemService(Context.CONNECTIVITY_SERVICE);

final NetworkCallback networkCallback = new NetworkCallback() {
  ...
  @Override
  void onAvailable(...) {
      // do success processing here..
  }

  @Override
  void onUnavailable(...) {
      // do failure processing here..
  }
  ...
};
connectivityManager.requestNetwork(request, networkCallback);
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback);