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

במכשירים עם Android 10 (רמת API‏ 29) ומעלה, אתם יכולים להשתמש ב-API חדש מסוג Peer-to-Peer כדי להגדיר מכשירים משניים כמו 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);