בקשת הרשאת גישה למכשירי Wi-Fi בקרבת מקום

באפליקציות שמטרגטות ל-Android 13 (רמת API 33) ומעלה ומנהלות חיבורי Wi-Fi, צריך לבקש את ההרשאה בתחילת ההפעלה NEARBY_WIFI_DEVICES. ההרשאה הזו מקלה על ההצדקה של גישת האפליקציה למכשירי Wi-Fi בקרבת מקום. בגרסאות קודמות של Android, האפליקציות האלה היו צריכות להצהיר על ההרשאה ACCESS_FINE_LOCATION במקום זאת.

ההרשאה היא חלק מקבוצת המכשירים בקרבת מקום

ההרשאה NEARBY_WIFI_DEVICES היא חלק מקבוצת ההרשאות מכשירים בקרבת מקום. הקבוצה הזו, שנוספה ב-Android 12 (רמת API‏ 31), כוללת גם הרשאות שקשורות ל-Bluetooth ול-Ultra-wideband. כשמבקשים שילוב כלשהו של הרשאות מקבוצת ההרשאות הזו, המערכת מציגה תיבת דו-שיח אחת בזמן הריצה ומבקשת מהמשתמש לאשר את הגישה של האפליקציה למכשירים בקרבת מקום. בהגדרות המערכת, המשתמשים צריכים להפעיל ולהשבית את ההרשאות של מכשירים בקרבת מקום כקבוצה. לדוגמה, המשתמשים לא יכולים להשבית את הגישה ל-Wi-Fi אבל להשאיר את הגישה ל-Bluetooth מופעלת באפליקציה מסוימת.

להצהיר באופן חד-משמעי שהאפליקציה לא מסיקה את המיקום הפיזי

כשמטרגטים ל-Android מגרסה 13 ומעלה, חשוב לבדוק אם האפליקציה מקבלת נתוני מיקום מממשקי API של Wi-Fi. אם לא, כדאי להצהיר על כך באופן מפורש. כדי להגדיר את ההצהרה הזו, צריך להגדיר את המאפיין usesPermissionFlags לערך neverForLocation בקובץ המניפסט של האפליקציה, כמו שמוצג בקטע הקוד הבא. התהליך הזה דומה לתהליך שאתם מבצעים כשאתם מצהירים שפרטי מכשיר ה-Bluetooth אף פעם לא משמשים לזיהוי מיקום:

<manifest ...>
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     android:usesPermissionFlags="neverForLocation" />
    <application ...>
        ...
    </application>
</manifest>

בגרסאות קודמות ובממשקי API מסוימים נדרשת הרשאת מיקום

כמה ממשקי API של Wi-Fi דורשים את ההרשאה ACCESS_FINE_LOCATION, גם כשהאפליקציה מטרגטת ל-Android 13 ואילך. לדוגמה, השיטות הבאות מהמחלקה WifiManager:

בנוסף, מכיוון שההרשאה NEARBY_WIFI_DEVICES זמינה רק ב-Android 13 ואילך, צריך לשמור את כל ההצהרות של ACCESS_FINE_LOCATION כדי לספק תאימות לדורות קודמים באפליקציה. עם זאת, כל עוד האפליקציה לא מסתמכת על נתוני מיקום מדויקים, אפשר להגדיר את גרסת ה-SDK המקסימלית של ההרשאה הזו ל-32, כפי שמוצג בקטע הקוד הבא:

<manifest ...>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

בדיקה אם יש ממשקי API שדורשים את ההרשאה

אם האפליקציה מטרגטת את Android מגרסה 13 ואילך, צריך להצהיר על ההרשאה NEARBY_WIFI_DEVICES כדי להפעיל כל אחד מממשקי ה-API הבאים של Wi-Fi:

תהליכי עבודה של גישה ל-Wi-Fi

באיור 1 מוצג תהליך העבודה של הגישה ל-Wi-Fi במכשירים עם Android מגרסה 13 ואילך, באפליקציות שמטרגטות את Android מגרסה 13 ואילך. שימו לב: כל עוד אתם מצהירים שהאפליקציה לא מסיקה את המיקום הפיזי ממידע על מכשירי Wi-Fi, אתם לא צריכים יותר להצהיר על ההרשאה ACCESS_FINE_LOCATION:

איור 1. תרשים זרימה לקביעה אם אפליקציה שמטרגטת ל-Android 13 (רמת API‏ 33) ומעלה יכולה לגשת למידע על Wi-Fi.

באיור 2 מוצג תהליך העבודה של הגישה ל-Wi-Fi במכשירים עם גרסה 12L ומטה. שימו לב להסתמכות על ההרשאה ACCESS_FINE_LOCATION.

איור 2. תרשים זרימה לקביעה אם אפליקציה שמטרגטת ל-12L (רמת API ‏32) או לגרסה ישנה יותר יכולה לגשת למידע על Wi-Fi.