ממשק API לבקשת רשת Wi-Fi לקישוריות עמית-לעמית

ב-Android 10 (רמת API 29) ואילך, ניתן להשתמש ב-API חדש מקצה לקצה (P2P) כדי הגדרת אתחול עבור מכשירים משניים כמו Chromecast ו-Google Home חומרה. התכונה הזו מאפשרת לאפליקציה לבקש מהמשתמש לשנות את הרשאת הגישה שאליו המכשיר מחובר באמצעות WifiNetworkSpecifier כדי לתאר מאפיינים של רשת מבוקשת.

כדי להשתמש ב-API הזה:

  1. יצירת מציין של רשת Wi-Fi באמצעות WifiNetworkSpecifier.Builder

  2. הגדרת מסנן רשת כדי להתאים לרשתות שאליהן רוצים להתחבר, יחד עם דרישת פרטי הכניסה.

  3. בוחרים בשילוב של SSID, SSID pattern, BSSID, וגם BSSID pattern כדי להגדיר את מסנן הרשת בכל בקשה, בכפוף לתנאים הבאים דרישות:

    • כל בקשה צריכה לספק לפחות אחד מהערכים SSID, SSID pattern, BSSID, או BSSID pattern
    • בכל בקשה אפשר להגדיר רק אחד מהערכים SSID או SSID pattern
    • בכל בקשה אפשר להגדיר רק אחד מהערכים BSSID או BSSID pattern
  4. הוספת המציינים לבקשת הרשת יחד עם NetworkCallback כדי לעקוב אחרי הסטטוס של הבקשה.

    אם המשתמש מאשר את הבקשה והחיבור לרשת מוצלח, NetworkCallback.onAvailable() מופעל באובייקט ה-callback. אם המשתמש ידחה את הבקשה או אם החיבור לרשת נכשל, NetworkCallback.onUnavailable() מופעל באובייקט ה-callback.

התחלת הבקשה להתחבר למכשיר של אפליקציה להשוואה מפעילה תיבת דו-שיח אותו מכשיר, שממנו המשתמש של המכשיר יכול לאשר את בקשת החיבור.

עקיפה של אישור המשתמשים

לאחר שהמשתמש מאשר רשת להתחבר אליה בתגובה לבקשה מ לאפליקציה הספציפית, המכשיר מאחסן את האישור של נקודת הגישה הספציפית. אם האפליקציה שולחת בקשה ספציפית להתחבר לנקודת הגישה הזו שוב, המכשיר מדלג על שלב אישור המשתמש ומתחבר לרשת באופן אוטומטי. אם המשתמש בוחר לשכוח את בזמן החיבור לרשת שה-API מבקש, יוסר האישור לשילוב הזה של האפליקציה והרשת, וכל אפשרות עתידית בקשה מהאפליקציה צריכה לקבל אישור שוב מהמשתמש. אם האפליקציה שולח בקשה לא ספציפית, למשל באמצעות SSID או BSSID, המשתמש צריך לאשר את הבקשה.

דוגמת קוד

דוגמת הקוד הבאה מראה איך להתחבר לרשת פתוחה עם SSID קידומת של "test" ו-BSSID OUI של "10:03:23":

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