כמו שאפליקציה יכולה לשלוח נתונים לאפליקציות אחרות, היא יכולה גם לקבל נתונים מאפליקציות אחרות. כדאי לחשוב על האינטראקציות של המשתמשים עם האפליקציה ועל סוגי הנתונים שאתם רוצים לקבל מאפליקציות אחרות. לדוגמה, אפליקציה של רשת חברתית עשויה להתעניין בקבלת תוכן טקסט, כמו כתובת URL מעניינת באינטרנט, מאפליקציה אחרת.
באפליקציה שמשתמשת ב-Compose Navigation, קבלת נתונים שנשלחו מאפליקציה אחרת היא תהליך של שני שלבים:
מצהירים על
<intent-filter>בקובץ המניפסט: עדיין צריך להוסיף מסנן Intent לפעילות בקובץ AndroidManifest.xml. כך מערכת ההפעלה Android OS יודעת שהאפליקציה שלכם יכולה לקבל פעולות ספציפיות (כמו ACTION_SEND) וסוגי MIME (כמו text/plain).הגדרת navDeepLink בתרשים הניווט של Compose: במקום ליירט ולנתח את ה-Intent באופן ידני בתוך השיטות onCreate או onNewIntent של הפעילות, אפשר להשתמש בתמיכה בקישור עמוק של Compose Navigation. מצרפים navDeepLink שתואם לפעולה ולסוג ה-MIME ישירות ליעד הניתן להרכבה שאמור להציג את התוכן. ה-NavController יידע באופן אוטומטי על ה-Intent ויפנה את המשתמש ישירות למסך הזה.
יעדים של שיתוף ישיר הם קישורי עומק ל-Activity ספציפי באפליקציה. הם מייצגים בדרך כלל אדם או קבוצה, והם מוצגים בקובץ לשיתוף ב-Android. לדוגמה, אפליקציית הודעות יכולה לספק יעד של שיתוף ישיר לאדם מסוים, שקישור העומק שלו מוביל ישירות לשיחה עם אותו אדם. הוראות מפורטות מופיעות במאמר בנושא הוספת יעדים לשיתוף ישיר.
סוגי MIME נתמכים
מומלץ שאפליקציה תוכל לקבל את הטווח הרחב ביותר האפשרי של סוגי MIME.
לדוגמה, אפליקציית הודעות שנועדה לשליחת טקסט, תמונות וסרטונים, צריכה לתמוך באופן אידיאלי בקבלת text/*, image/* ו-video/*. אלה כמה סוגי MIME נפוצים לשליחה ולקבלה של נתונים פשוטים ב-Android.
| למה הנמענים נרשמים | מה שולחים |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| סיומות קבצים נתמכות | application/pdf |
אפשר לעיין במאגר הרשמי של סוגי מדיה MIME של IANA.
יצירת יעדים מצוינים לשיתוף
כשמשתמש מקיש על יעד שיתוף שמשויך לפעילות ספציפית, הוא צריך להיות מסוגל לאשר ולערוך את התוכן המשותף לפני השימוש בו. הדבר חשוב במיוחד לגבי נתוני טקסט.
קבלת נתונים באמצעות פעילות
קבלת נתונים באמצעות פעילות כוללת עדכון של קובץ המניפסט, טיפול בתוכן הנכנס והבטחה שהמשתמש יזהה את האפליקציה שלכם.
עדכון המניפסט
מסנני Intent מודיעים למערכת אילו אובייקטים מסוג Intent רכיב אפליקציה מקבל.
בדומה לאופן שבו יצרתם כוונה עם פעולה ACTION_SEND בשיעור שליחת נתונים פשוטים לאפליקציות אחרות, אתם יוצרים מסנני כוונות כדי לקבל כוונות עם הפעולה הזו. מגדירים מסנן Intent במניפסט באמצעות הרכיב <intent-filter>.
לדוגמה, אם האפליקציה מטפלת בקבלת תוכן טקסט, מניפסט שכולל תמונה אחת או יותר מכל סוג ייראה כמו הקטע הבא:
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
כשמנסים לשתף את אחד מהפריטים האלה מאפליקציה אחרת על ידי יצירת כוונה והעברתה אל startActivity(), האפליקציה שלכם מופיעה כאפשרות בגיליון השיתוף או במקודד הכוונות של Android. אם המשתמש בוחר באפליקציה שלכם, הפעילות המתאימה מתחילה (.ui.MyActivity בדוגמה הקודמת). לאחר מכן, אתם צריכים לטפל בתוכן בצורה המתאימה בקוד ובממשק המשתמש.
טיפול בתוכן הנכנס
כדי לטפל בתוכן שמועבר על ידי Intent, צריך להתקשר אל getIntent() כדי לקבל את האובייקט Intent. אחרי שמקבלים את האובייקט, אפשר לבדוק את התוכן שלו כדי להחליט מה לעשות הלאה. אם אפשר להפעיל את הפעילות הזו מחלקים אחרים במערכת (כמו מרכז האפליקציות), צריך לקחת את זה בחשבון כשבודקים את הכוונה.
חשוב לבדוק את הנתונים הנכנסים, כי אף פעם אי אפשר לדעת מה אפליקציה אחרת עשויה לשלוח. לדוגמה, יכול להיות שסוג ה-MIME שגוי, או שהתמונה שנשלחת גדולה מאוד. בנוסף, חשוב לזכור לעבד נתונים בינאריים ב-thread נפרד ולא ב-thread הראשי (UI).
@Composable fun SharesheetHandler() { val context = LocalContext.current val intent = (context as? Activity)?.intent when (intent?.action) { ACTION_SEND -> { if ("text/plain" == intent.type) { handleSendText(intent) // Handle text being sent. } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } Intent.ACTION_SEND_MULTIPLE -> { if (intent.type?.startsWith("image/") == true) { handleSendMultipleImages(intent) // Handle multiple images being sent } } else -> { // Handle other intents, such as being started from the home screen } } } fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update ViewModel state to change state of text being shared } } fun handleSendImage(intent: Intent) { IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Update ViewModel state to change state of image being shared } } fun handleSendMultipleImages(intent: Intent) { IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Update ViewModel state to change state of image(s) being shared } }
אחרי קבלת הנתונים, אפשר לעדכן את ממשק המשתמש בפעולה פשוטה כמו מילוי TextField, או בפעולה מורכבת יותר כמו החלת מסנן מעניין על תמונה. האפליקציה שלכם קובעת מה יקרה בהמשך.
שיתוף קישורים לצילומי מסך
כשמצלמים מסך, אפשר לשתף את צילום המסך ואת כתובת ה-URL שמשויכת אליו.
כך חוויית המשתמש תהיה עשירה יותר. כשמקבלים כתובת URL, חשוב לוודא שמקבלים את השדה EXTRA_TEXT מה-Intent, כמו בדוגמה הבאה:
IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Handle the EXTRA_TEXT as well val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT) // Update ViewModel state to change state image being shared and the EXTRA_TEXT // if available }
איך מוודאים שהמשתמשים מזהים את האפליקציה
האפליקציה שלך מיוצגת על ידי הסמל והתווית שלה בגיליון השיתוף ובכלי לפתרון Intent ב-Android. שניהם מוגדרים במניפסט. אתם יכולים להגדיר תוויות של Activity או מסנני Intent כדי לספק הקשר נוסף.
החל מ-Android 10 (רמת API 29), הקובץ לשיתוף ב-Android משתמש רק בסמלים שמוגדרים במניפסט בתג application. מערכת Android מתעלמת מסמלים שמוגדרים בתגים intent-filter ו-activity.