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

Android 10 (API düzeyi 29) ve sonraki cihazlarda, Chromecast ve Google Home donanım gibi ikincil cihazlar için yapılandırmayı başlatmak amacıyla yeni bir eşler arası API kullanabilirsiniz. Bu özellik, istenen bir ağın özelliklerini açıklamak için WifiNetworkSpecifier aracılığıyla uygulamanızın 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 şunları yapın:

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

  2. Gerekli kimlik bilgileriyle birlikte bağlanılacak ağları eşleştirmek için bir ağ filtresi ayarlayın.

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

    • Her istekte SSID, SSID pattern, BSSID veya BSSID pattern değerlerinden en az biri sağlanmalıdır
    • Her istek yalnızca bir SSID veya SSID pattern ayarlayabilir
    • Her istek yalnızca bir BSSID veya BSSID pattern ayarlayabilir
  4. Belirteçleri ağ isteğine, isteğin durumunu izlemek için bir NetworkCallback örneğiyle birlikte ekleyin.

    Kullanıcı isteği kabul ederse ve ağ bağlantısı başarılı olursa geri çağırma 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 bir iletişim kutusu başlatılır. Kullanıcı, bu iletişim kutusundan bağlantı isteğini kabul edebilir.

Kullanıcı onayını atlama

Kullanıcı, belirli bir uygulamadan gelen isteğe yanıt olarak bağlanacağı bir ağı onayladıktan sonra, cihaz söz konusu erişim noktasının onayını depolar. Uygulama bu erişim noktasına tekrar bağlanmak için özel bir istekte bulunursa cihaz, kullanıcı onay aşamasını atlar ve otomatik olarak ağa bağlanır. Kullanıcı API tarafından istenen bir ağa bağlıyken ağı unutmayı seçerse, söz konusu uygulama ve ağ kombinasyonuna ilişkin depolanan bu onay kaldırılır ve gelecekte uygulamadan gelen isteklerin kullanıcı tarafından tekrar onaylanması gerekir. Uygulama, SSID veya BSSID kalıbı gibi belirli olmayan bir istekte bulunursa kullanıcının isteği onaylaması gerekir.

Kod örneği

Aşağıdaki kod örneğinde, SSID öneki "test" ve BSSID OUI'si "10:03:23" olan bir açık 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);