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. Şunu kullanarak bir kablosuz ağ tanımlayıcısı oluştur: WifiNetworkSpecifier.Builder.

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

  3. SSID, aşağıdakilerden oluşan bir kombinasyona karar verin SSID pattern, BSSID, ve BSSID pattern şuna tabi olarak her istekte ağ filtresini ayarlayın: koşullar:

    • 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 belirteci, ağ isteğine bir NetworkCallback örneğiyle birlikte ekleyin.

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

Bir eş cihaza bağlanma isteği başlatılırken Kullanıcı tarafından sağlanan bağlantı isteğini kabul edebileceği cihaz.

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ğlanırsanız 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 uygulamadan gelecek tüm istekler kullanıcı tarafından tekrar onaylanmalıdır. Uygulama özel olmayan bir istekte bulunduğunda (örneğin, SSID veya BSSID kalıbıyla) kullanıcısı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 içeren 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);