Eşler arası bağlantı için Wi-Fi Network Request API

Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran cihazlarda, Chromecast ve Google Home donanımı gibi ikincil cihazlar için yapılandırmayı başlatmak üzere yeni bir eşler arası API kullanabilirsiniz. Bu özellik, uygulamanızın istenen ağın özelliklerini açıklamak için WifiNetworkSpecifier kullanarak kullanıcıdan cihazın bağlı olduğu erişim noktasını değiştirmesini istemesini sağlar.

Bu API'yi kullanmak için aşağıdakileri yapın:

  1. WifiNetworkSpecifier.Builder kullanarak bir kablosuz ağ belirteci oluşturun.

  2. Gerekli kimlik bilgileriyle birlikte bağlanılacak ağlarla eşleşecek bir ağ filtresi ayarlayın.

  3. Aşağıdaki şartlara tabi olarak her istekte ağ filtresini ayarlamak için SSID, SSID pattern, BSSID ve BSSID pattern kombinasyonuna karar verin:

    • Her istek en az bir SSID, SSID pattern, BSSID veya BSSID pattern sağlamalıdır
    • Her istekte yalnızca SSID veya SSID pattern ayarlanabilir.
    • Her istekte yalnızca BSSID veya BSSID pattern ayarlanabilir.
  4. İsteğin durumunu izlemek için belirteci, ağ isteğine bir NetworkCallback örneğiyle birlikte ekleyin.

    Kullanıcı isteği kabul ederse ve ağa bağlantı başarılı olursa geri arama nesnesinde NetworkCallback.onAvailable() çağrılır. Kullanıcı isteği reddederse veya ağ bağlantısı başarısız olursa geri çağırma nesnesinde NetworkCallback.onUnavailable() çağrılır.

Eş cihaza bağlanma isteği başlatıldığında, aynı cihazda kullanıcının bağlantı isteğini kabul edebileceği bir iletişim kutusu açılır.

Kullanıcı onayı atlama

Kullanıcı, belirli bir uygulamadan gelen bir isteğe yanıt olarak bağlanılacak bir ağı onayladığında cihaz, söz konusu erişim noktası için onayı saklar. Uygulama, söz konusu erişim noktasına tekrar bağlanmak için belirli bir istek gönderirse cihaz, kullanıcı onayı aşamasını atlar ve ağa otomatik olarak bağlanır. Kullanıcı, API tarafından istenen bir ağa bağlıyken ağı unutmayı seçerse uygulama ve ağ kombinasyonu için saklanan bu onay kaldırılır ve gelecekte uygulamadan gelen isteklerin kullanıcı tarafından tekrar onaylanması gerekir. Uygulama, SSID veya BSSID deseniyle belirli olmayan bir istek gönderirse kullanıcının isteği onaylaması gerekir.

Kod örneği

Aşağıdaki kod örneğinde, "test" ön ekiyle başlayan bir SSID ve "10:03:23" BSSID OUI ile açık bir ağa nasıl bağlanılacağı gösterilmektedir:

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