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

Android 10 (API düzeyi 29) ve sonraki sürümlerin yüklü olduğu 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 istenen bir ağın özelliklerini açıklamak için WifiNetworkSpecifier kullanarak cihazın bağlı olduğu erişim noktasını değiştirmesini istemesine olanak tanır.

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ştirmek için bir ağ filtresi ayarlayın.

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

    • Her istekte SSID, SSID pattern, BSSID veya BSSID pattern özelliklerinden en az biri sağlanmalı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 belirleyicileri 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 çağırma nesnesinde NetworkCallback.onAvailable() çağrılır. Kullanıcı isteği reddederse veya ağa bağlantı 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 cihazın kullanıcısı, bağlantı isteğini bu iletişim kutusundan kabul edebilir.

Kullanıcı onayını atlama

Kullanıcı, belirli bir uygulamanın isteğine yanıt olarak bağlanılacak bir ağı onayladığında cihaz, belirli erişim noktası için onayı 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 uygulama ve ağ kombinasyonu için depolanan onay kaldırılır ve uygulamadan gelen tüm gelecekteki isteklerin kullanıcı tarafından tekrar onaylanması gerekir. Uygulama, SSID veya BSSID deseni 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 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);