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

כשיוצרים אפליקציה, חשוב להביא בחשבון את האפליקציות האחרות במכשיר שאיתן האפליקציה צריכה לקיים אינטראקציה. אם האפליקציה שלכם מטרגטת את 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.