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 cihazlarda yapılandırmayı önyüklemek için 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 kablosuz ağ tanımlayıcısı oluşturun.

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

  3. Aşağıdaki şartlara tabi olacak şekilde her istekte ağ filtresini ayarlamak için SSID, SSID pattern, BSSID ve BSSID pattern yer alanlarından oluşan bir kombinasyona 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 tanımlayıcıları bir NetworkCallback örneğiyle birlikte ağ isteğine ekleyin.

    Kullanıcı isteği kabul ederse ve ağ ile bağlantı 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.

Bir eş cihaza bağlanma isteği başlatıldığında, aynı cihazda bir iletişim kutusu açılır. Söz konusu cihaz kullanıcısı, 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ğı ağı onayladıktan sonra, cihaz söz konusu erişim noktasının onayını saklar. Uygulama, söz konusu erişim noktasına tekrar bağlanmak için belirli 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 bu 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 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 "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);