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

במכשירים עם Android 10 (API ברמה 29) ומעלה, אפשר להשתמש ב-API חדש של עמית לעמית כדי לאתחל את התצורה של מכשירים משניים כמו 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() באובייקט של הקריאה החוזרת. אם המשתמש דוחה את הבקשה או אם החיבור לרשת לא מצליח, הפונקציה NetworkCallback.onUnavailable() מופעלת באובייקט של הקריאה החוזרת.

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

דילוג על אישור המשתמש

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

קוד לדוגמה

בדוגמת הקוד הבאה אפשר לראות איך להתחבר לרשת פתוחה עם קידומת SSID של "test" ו-OUI של BSSID של "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);