Wi-Fi suggestion API untuk konektivitas internet

Perangkat yang menjalankan Android 10 (API level 29) dan yang lebih baru memungkinkan aplikasi Anda menambahkan kredensial jaringan agar perangkat dapat terhubung secara otomatis ke titik akses Wi-Fi. Anda dapat memberikan saran terkait jaringan yang akan dihubungkan menggunakan WifiNetworkSuggestion. Platform ini akhirnya memilih titik akses yang akan diterima berdasarkan input dari aplikasi Anda dan lainnya.

Di Android 11 (level API 30) dan yang lebih tinggi:

  • Framework ini menerapkan persyaratan kepemilikan untuk saran Enterprise berbasis EAP-SIM (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); saran tersebut hanya diizinkan oleh aplikasi yang ditandatangani oleh operator.
  • Untuk saran yang diberikan oleh aplikasi yang ditandatangani oleh operator, framework akan otomatis menetapkan ID operator yang sesuai dengan penandatanganan operator aplikasi. Saran tersebut akan otomatis dinonaktifkan jika SIM yang sesuai dihapus dari perangkat.

Di Android 12 (level API 31) dan yang lebih tinggi:

  • Privasi tambahan dapat diaktifkan melalui pengacakan MAC non-persisten, yang secara berkala mengacak ulang alamat MAC acak. Gunakan setMacRandomizationSetting untuk menentukan tingkat pengacakan untuk jaringan Anda.

  • isPasspointTermsAndConditionsSupported().Persyaratan dan ketentuan merupakan fitur Passpoint yang memungkinkan deployment jaringan untuk menggantikan captive portal yang tidak aman, yang menggunakan jaringan terbuka, dengan jaringan Passpoint yang aman. Notifikasi ditampilkan kepada pengguna ketika persyaratan dan ketentuan harus disetujui. Aplikasi yang menyarankan jaringan Passpoint yang dilindungi oleh persyaratan dan ketentuan harus memanggil API ini terlebih dahulu untuk memastikan bahwa perangkat mendukung kemampuan tersebut. Jika perangkat tidak mendukung kemampuan tersebut, perangkat tidak akan dapat terhubung ke jaringan ini, dan jaringan alternatif atau lama harus disarankan.

  • isDecoratedIdentitySupported(): Saat mengautentikasi ke jaringan dengan dekorasi awalan, awalan identitas yang didekorasi memungkinkan operator jaringan memperbarui Network Access Identifier (NAI) untuk melakukan perutean eksplisit melalui beberapa proxy di dalam jaringan AAA (lihat RFC 7542 untuk informasi selengkapnya).

    Android 12 menerapkan fitur ini agar sesuai dengan spesifikasi WBA untuk ekstensi PPS-MO. Aplikasi yang menyarankan jaringan Passpoint yang memerlukan identitas yang didekorasi harus memanggil API ini terlebih dahulu untuk memastikan bahwa perangkat mendukung kemampuan tersebut. Jika perangkat tidak mendukung kemampuan tersebut, identitas tidak akan didekorasi dan autentikasi ke jaringan mungkin akan gagal.

Untuk membuat saran Passpoint, aplikasi harus menggunakan class PasspointConfiguration, Credential, dan HomeSp. Class ini menjelaskan profil Passpoint, yang ditentukan dalam spesifikasi Passpoint Aliansi Wi-Fi.

Contoh kode berikut menunjukkan cara memberikan kredensial untuk satu jaringan terbuka, satu WPA2, satu jaringan WPA3, dan satu jaringan 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);

Segera setelah aplikasi menempatkan saran untuk pertama kalinya, pengguna akan diberi tahu. Jenis notifikasi bergantung pada versi Android yang berjalan di perangkat:

  • Di Android 11 (level API 30) dan yang lebih tinggi, pengguna akan melihat dialog jika aplikasi berjalan di latar depan, dan notifikasi jika aplikasi berjalan di latar belakang.
  • Di Android 10 (API level 29), pengguna melihat notifikasi, terlepas dari apakah aplikasi berjalan di latar depan atau latar belakang.

Ketika platform terhubung ke salah satu saran jaringan, setelan akan menampilkan teks yang mengatribusikan koneksi jaringan ke aplikasi pemberi saran yang sesuai.

Menangani pengguna yang terputus koneksi

Jika pengguna menggunakan pemilih Wi-Fi untuk memutuskan koneksi secara eksplisit dari salah satu saran jaringan saat terhubung, jaringan tersebut akan diabaikan ketika masih berada dalam jangkauan. Selama periode ini, jaringan tersebut tidak akan dipertimbangkan untuk koneksi otomatis, meskipun aplikasi menghapus dan menambahkan kembali saran jaringan yang sesuai dengan jaringan. Jika pengguna menggunakan pemilih Wi-Fi untuk secara eksplisit terhubung ke jaringan yang sebelumnya terputus, jaringan tersebut akan segera dipertimbangkan untuk koneksi otomatis.

Mengubah status persetujuan untuk aplikasi

Pengguna yang menolak notifikasi saran jaringan akan menghapus izin CHANGE_WIFI_STATE dari aplikasi. Pengguna dapat memberikan persetujuan ini nanti dengan membuka menu kontrol Wi-Fi (Setelan > Aplikasi & notifikasi > Akses Aplikasi Khusus > Kontrol Wi-Fi > App name).