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

Android 10 (API düzeyi 29) ve sonraki cihazlarda yeni bir eşler arası API kullanarak Chromecast ve Google Home gibi ikincil cihazlar için önyükleme yapılandırması donanım. Bu özellik, uygulamanızın kullanıcıdan erişimi değiştirmesini istemesini sağlar cihazın bağlandığı noktanın WifiNetworkSpecifier kullanabilirsiniz.

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 en az bir SSID, SSID pattern, BSSID veya BSSID pattern
    • Her istekte yalnızca SSID veya SSID pattern ayarlanabilir
    • Her istekte yalnızca BSSID veya BSSID pattern ayarlanabilir
  4. Tanımlayıcıları, ağ isteğine NetworkCallback örnek olması gerekir.

    Kullanıcı isteği kabul ederse ve ağ bağlantısı başarılı, NetworkCallback.onAvailable() geri çağırma nesnesinde çağrılır. Kullanıcı isteği reddederse veya ağ bağlantısı başarısız olursa, NetworkCallback.onUnavailable() geri çağırma nesnesinde ç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ını atlama

Kullanıcı, söz konusu uygulamaya özgü bir erişim noktası varsa cihaz, ilgili erişim noktasının onayını 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ı ağa bağlıyken bu depolanan veriler bu uygulama ve ağ kombinasyonu için onay kaldırıldığında ve gelecekte uygulamadan gelen istek kullanıcı tarafından tekrar onaylanmalıdır. Uygulama bir SSID veya BSSID kalıbı gibi belirli olmayan bir istekte bulunduğunda kullanıcısının isteği onaylaması gerekir.

Kod örneği

Aşağıdaki kod örneğinde, SSID ile açık bir ağa nasıl bağlanılacağı gösterilmektedir "test" öneki ve "10:03:23" BSSID OUI hatası:

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);