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ın yapılandırmasını başlatmak için yeni bir eşler arası API kullanabilirsiniz. Bu özellik, uygulamanızın kullanıcıdan cihazın bağlı olduğu erişim noktasını değiştirmesini istemesine olanak tanır. Bunun için istenen ağın özelliklerini açıklamak üzere WifiNetworkSpecifier kullanılır.

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

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

  2. Bağlanılacak ağları eşleştirmek için bir ağ filtresi ve gerekli kimlik bilgilerini ayarlayın.

  3. Her istekte ağ filtresini ayarlamak için SSID, SSID pattern, BSSID ve BSSID pattern kombinasyonuna karar verin. Bu kombinasyon aşağıdaki koşullara tabidir:

    • Her istekte SSID, SSID pattern, BSSID veya BSSID pattern değerlerinden en az biri sağlanmalıdır.
    • Her istekte SSID veya SSID pattern değerlerinden yalnızca biri ayarlanabilir.
    • Her istekte BSSID veya BSSID pattern parametrelerinden yalnızca biri ayarlanabilir.
  4. İsteğin durumunu izlemek için ağ isteğine belirleyicileri ve bir NetworkCallback örneğini 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 açılır. Bu iletişim kutusundan cihazın kullanıcısı bağlantı isteğini kabul edebilir.

Kullanıcı onayını atlama

Kullanıcı, belirli bir uygulamadan gelen istek üzerine bağlanılacak ağı onayladıktan sonra cihaz, belirli erişim noktası için onayı depolar. Uygulama, söz konusu erişim noktasına tekrar bağlanmak için özel bir istekte bulunursa 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 depolanan bu onay kaldırılır ve uygulamadan gelecek tüm ağ isteklerinin 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 ön eki "test" ve BSSID OUI'si "10:03:23" olan 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);