הצהרה על צורכי הרשאות גישה לחבילה

כשיוצרים אפליקציה, חשוב להביא בחשבון את האפליקציות האחרות במכשיר שאיתן האפליקציה צריכה לקיים אינטראקציה. אם האפליקציה שלכם מטרגטת את Android 11 (רמת API 30) ואילך, המערכת תציג באופן אוטומטי לאפליקציה שלכם חלק מהאפליקציות, אבל תסנן אפליקציות אחרות כברירת מחדל. במדריך הזה נסביר איך להפוך את האפליקציות האלה לגלויות לאפליקציה שלכם.

אם האפליקציה שלכם מטרגטת את Android 11 ואילך, והיא צריכה לקיים אינטראקציה עם אפליקציות שאינן גלויות באופן אוטומטי, צריך להוסיף את הרכיב <queries> לקובץ המניפסט של האפליקציה. בתוך האלמנט <queries>, מציינים את האפליקציות האחרות לפי שם החבילה, לפי חתימה על כוונת הפעולה או לפי רשות הספק, כפי שמתואר בקטעים הבאים.

שמות ספציפיים של חבילות

אם אתם יודעים אילו אפליקציות ספציפיות אתם רוצים לשלוח אליהן שאילתות או לבצע איתן אינטראקציה, כמו אפליקציות שמשתלבות עם האפליקציה שלכם או אפליקציות שבשירותים שלהן אתם משתמשים, תוכלו לכלול את שמות החבילות שלהן בקבוצה של אלמנטים <package> בתוך האלמנט <queries>:

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

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

אם אתם מפתחים ספרייה ל-Android, אתם יכולים להצהיר על הצרכים שלכם לגבי החשיפה של החבילה על ידי הוספת רכיב <queries> לקובץ המניפסט של ה-AAR. לרכיב <queries> יש את אותה פונקציונליות שיש לרכיב שאפשר להצהיר עליו באפליקציות במניפסטים שלהן.

אם הספרייה כוללת תקשורת עם אפליקציית מארח, למשל באמצעות שירות מקושר, צריך לכלול רכיב <package> שמציין את שם החבילה של אפליקציית המארח:

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

ההצהרה הזו מאפשרת לכם לבדוק אם אפליקציית המארח מותקנת ולנהל איתה אינטראקציה, למשל על ידי קריאה ל-bindService(). כתוצאה מהאינטראקציה הזו, אפליקציית הקריאה שמשתמשת בספרייה תהיה גלויה לאפליקציית המארח באופן אוטומטי.

חבילות שתואמות לחתימה של מסנן Intent

יכול להיות שהאפליקציה שלכם תצטרך לשלוח שאילתה או לבצע אינטראקציה עם קבוצה של אפליקציות שמשמשות למטרה מסוימת, אבל יכול להיות שאתם לא יודעים את שמות החבילות הספציפיים שצריך לכלול. במקרה כזה, אפשר לציין חתימות של מסנני כוונות באלמנט <queries>. לאחר מכן האפליקציה תוכל לזהות אפליקציות עם רכיבים תואמים של <intent-filter>.

בדוגמת הקוד הבאה מוצג רכיב <intent> שיאפשר לאפליקציה לראות אפליקציות מותקנות אחרות שתומכות בשיתוף תמונות בפורמט JPEG:

<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>

לרכיב <intent> יש כמה הגבלות:

  • חובה לכלול רכיב <action> אחד בלבד.
  • אסור להשתמש במאפיינים path,‏ pathPrefix,‏ pathPattern ו-port ברכיב <data>. המערכת מתנהגת כאילו הגדרתם את הערך של כל מאפיין בתור התו הכללי לחיפוש (*).
  • אי אפשר להשתמש במאפיין mimeGroup של רכיב <data>.
  • בתוך הרכיבים <data> של רכיב <intent> יחיד, אפשר להשתמש בכל אחד מהמאפיינים הבאים לכל היותר פעם אחת:

    • mimeType
    • scheme
    • host

    אפשר לחלק את המאפיינים האלה בין כמה רכיבי <data> או להשתמש בהם באלמנט <data> יחיד.

הרכיב <intent> תומך בתו הכללי לחיפוש (*) כערך של כמה מאפיינים:

  • המאפיין name של רכיב <action>.
  • סוג המשנה של המאפיין mimeType של רכיב <data> (image/*).
  • הסוג והסוג המשנה של המאפיין mimeType של רכיב <data> (*/*).
  • המאפיין scheme של רכיב <data>.
  • המאפיין host של רכיב <data>.

אלא אם צוין אחרת ברשימה הקודמת, המערכת לא תומכת בשילוב של טקסט ותווים כלליים לחיפוש, כמו prefix*.

חבילות שמשתמשות ברשות ספציפית

אם אתם צריכים לשלוח שאילתה לספק תוכן אבל אתם לא יודעים את שמות החבילות הספציפיים, תוכלו להצהיר על הרשאת הספק ברכיב <provider>, כפי שמוצג בקטע הקוד הבא:

<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

אפשר להצהיר על רשויות של ספקים ברכיב <queries> אחד. בתוך הרכיב <queries> אפשר להצהיר על רכיב <provider> אחד או יותר. רכיב <provider> יכול לכלול רשות אחת של ספק או רשימה של רשויות של ספקים, מופרדת בפסיקים.

כל האפליקציות (לא מומלץ)

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

דוגמאות לתרחישים לדוגמה שבהם מומלץ לכלול את ההרשאה QUERY_ALL_PACKAGES:

  • אפליקציות נגישות
  • דפדפנים
  • אפליקציות לניהול מכשירים
  • אפליקציות אבטחה
  • אפליקציות אנטי-וירוס

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

עדכון המדיניות הזה מ-Google Play מספק הנחיות לאפליקציות שזקוקות להרשאה QUERY_ALL_PACKAGES.