מערכת Android משתמשת בכוונות ובתוספות שלהם כדי לאפשר למשתמשים לשתף מידע במהירות להשתמש בקלות באפליקציות שהם אוהבים.
ב-Android יש למשתמשים שתי דרכים לשתף נתונים בין אפליקציות:
- גיליון השיתוף של Android מיועד בעיקר לשליחת תוכן מחוץ לאפליקציה ו/או באופן ישיר למשתמש אחר. לדוגמה, שיתוף כתובת URL עם חבר.
- מקודד Intent של Android הוא המתאים ביותר להעברת נתונים השלב הבא במשימה מוגדרת היטב. לדוגמה, פתיחת קובץ PDF מהאפליקציה ומתן הרשאה למשתמשים לבחור את הצופה המועדף.
כשיוצרים Intent, מציינים את הפעולה שרוצים שהכוונה תבצע.
מערכת Android משתמשת בפעולה ACTION_SEND
כדי לשלוח נתונים מפעילות אחת לאחרת,
גם מעבר לגבולות התהליכים. צריך לציין
בין הנתונים לבין הסוג שלהם. המערכת מזהה באופן אוטומטי את הפעילויות התואמות
שיכול לקבל את הנתונים ולהציג אותם למשתמש. במקרה של מקודד Intent,
אם רק פעילות אחת יכולה להתמודד עם הכוונה, הפעילות הזו תתחיל מיד.
למה כדאי להשתמש בדף השיתוף של Android
מומלץ מאוד להשתמש בדף Sharesheet של Android כדי ליצור עקביות עבור המשתמשים באפליקציות. אסור להציג את רשימת יעדי השיתוף של האפליקציה שלך או ליצור רשימה משלך וריאציות של גיליון שיתוף.
הקובץ לשיתוף של Android מאפשר למשתמשים לשתף מידע עם האדם הנכון, בעזרת הצעות רלוונטיות לאפליקציות, והכול בהקשה אחת. ה-Sharesheet יכול להציע יעדים שאינם זמינים לפתרונות מותאמים אישית, ומשתמש בדירוג עקבי. הסיבה לכך היא שה-Sharesheet יכול להביא בחשבון מידע על פעילות האפליקציה והפעילות של המשתמשים. והוא זמין רק למערכת.
לגיליון השיתוף של Android יש גם הרבה תכונות שימושיות למפתחים. לדוגמה, אפשר: לבצע את הפעולות הבאות:
- איך אפשר לדעת מתי המשתמשים משלימים שיתוף ואיפה
- הוספת
ChooserTarget
ויעדים מותאמים אישית לאפליקציה - הצגת תצוגה מקדימה של תוכן עם טקסט עשיר, החל מ-Android 10 (רמת API 29)
- החרגת יעדים שתואמים לשמות ספציפיים של רכיבים
שימוש בגיליון לשיתוף ב-Android
לכל סוגי השיתוף, צריך ליצור כוונה ולהגדיר את הפעולה שלה
Intent.ACTION_SEND
כדי להציג את הגיליון האלקטרוני של Android, צריך להתקשר
Intent.createChooser()
,
ומעבירים אליו את האובייקט Intent
.
היא מחזירה גרסה של הכוונה שלכם שתמיד מציגה את קובץ השיתוף של Android.
שליחת תוכן של טקסט
השימוש הישיר והנפוץ ביותר ב-Sharesheet של Android הוא לשלוח תוכן טקסט בין פעילות אחת לפעילות אחרת. לדוגמה, רוב הדפדפנים יכולים לשתף את כתובת האתר של האתר הנוכחי כטקסט באפליקציה אחרת. הדבר שימושי לשיתוף מאמר או אתר עם חברים באמצעות באימייל או ברשתות חברתיות. לדוגמה:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent);
תוכלו גם להוסיף תוספות כדי לכלול מידע נוסף, כמו נמעני אימייל.
(EXTRA_EMAIL
,
EXTRA_CC
,
EXTRA_BCC
),
נושא האימייל
(EXTRA_SUBJECT
), וכו'
הערה: אפליקציות אימייל מסוימות, כמו Gmail, מחייבות
String[]
עבור תוספות כמו
EXTRA_EMAIL
וגם EXTRA_CC
. כדאי להשתמש
putExtra(String, String[])
כדי להוסיף את הפרטים האלה לכוונת הרכישה.
שליחת תוכן בינארי
שיתוף נתונים בינאריים באמצעות הפעולה ACTION_SEND
.
הגדרת סוג MIME המתאים והצבת URI לנתונים שבתוספת
EXTRA_STREAM
, בתור
אפשר לראות בדוגמה הבאה.
בדרך כלל משתמשים בשיטה הזו כדי לשתף תמונה, אבל אפשר להשתמש בה כדי לשתף כל סוג של תוכן בינארי.
Kotlin
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
Java
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
לאפליקציה המקבלת נדרשת הרשאה כדי לגשת לנתונים ש-Uri
מצביע על. יש שתי דרכים מומלצות לעשות זאת:
- לאחסן את הנתונים ב-
ContentProvider
שלך, ולוודא לאפליקציות יש הרשאת גישה מתאימה לספק שלכם. המנגנון המועדף לספק היא להשתמש בהרשאות לכל URI, באופן זמני ולאפשר גישה רק לאפליקציה המקבלת. דרך קלה ליצורContentProvider
כמו זה כדי להשתמשFileProvider
כיתה עוזרת. - שימוש במערכת
MediaStore
.MediaStore
מיועד בעיקר לסוגי MIME של וידאו, אודיו ותמונה. עם זאת, החל מ-Android 3.0 (API ברמה 11), הוא יכול לאחסן גם סוגים שאינם מדיה. מידע נוסף זמין במאמר הבא:MediaStore.Files
אפשר להוסיף קבצים אלMediaStore
באמצעותscanFile()
, ואחריוUri
בסגנוןcontent://
מועברonScanCompleted()
קריאה חוזרת. לתשומת ליבכם: לאחר הוספת התוכן למערכתMediaStore
, הוא יהיה נגיש ל- כל אפליקציה במכשיר.
שימוש בסוג ה-MIME הנכון
עליך לספק את סוג ה-MIME הספציפי ביותר שזמין לנתונים
מתבצעת שליחה. לדוגמה, כדאי להשתמש ב-text/plain
כשמשתפים טקסט פשוט. הנה כמה
סוגי MIME נפוצים כששולחים נתונים פשוטים ב-Android:
מקבלים נרשמים ל- | השולחים שולחים |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
סיומות קבצים נתמכות | application/pdf |
למידע נוסף על סוגי MIME, אפשר לעיין במאמר IANA מרשם רשמי של סוגי מדיה MIME.
בדף Sharesheet של Android עשויה להופיע תצוגה מקדימה של התוכן, בהתאם לסוג ה-MIME שסופק. במידה מסוימת תכונות של תצוגה מקדימה זמינות רק לסוגים ספציפיים.
שיתוף של כמה קטעי תוכן
כדי לשתף כמה קטעי תוכן, אפשר להשתמש בACTION_SEND_MULTIPLE
פעולה יחד עם רשימה של מזהי URI שמפנים אל התוכן. סוג ה-MIME משתנה בהתאם
תמהיל של תכנים שאתה משתף. לדוגמה, אם שיתפת שלוש תמונות בפורמט JPEG, עליך להשתמש בסוג
"image/jpg"
לשילוב של סוגי תמונות, צריך להשתמש בפונקציה "image/*"
כדי להתאים
פעילות שמטפלת בכל סוג של תמונה. אמנם ניתן לשתף שילוב של סוגים, אבל אנחנו מאוד רוצים
לא מומלץ, כי
לא ברור למי שמקבל את ההודעה מה מיועד לשלוח. אם יש צורך לשלוח מספר סוגים, השתמשו
"*/*"
הניתוח של האפליקציה המקבל תלוי
ולעבד את הנתונים שלכם. הנה דוגמה:
Kotlin
val imageUris: ArrayList<Uri> = arrayListOf( // Add your image URIs here imageUri1, imageUri2 ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } startActivity(Intent.createChooser(shareIntent, null))
Java
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, null));
צריך לוודא שנקודת ה-Uri
של האובייקטים שצוינה מפנה
לנתונים שאפליקציה מקבלת יכולה לגשת אליהם.
הוספת תוכן עשיר לתצוגות מקדימות של טקסט
החל מ-Android 10 (רמת API 29), ב-Sharesheet של Android מוצגת תצוגה מקדימה של טקסט
משותף. במקרים מסוימים, קשה להבין את הטקסט שמשתפים. כדאי לשקול לשתף
כתובת URL מורכבת כמו https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
. A עשיר יותר
התצוגה המקדימה יכולה להראות למשתמשים מה הם משתפים.
כשמציגים טקסט בתצוגה מקדימה, אפשר להגדיר כותרת, תמונה ממוזערת או את שתי האפשרויות. הוספת תיאור ל
Intent.EXTRA_TITLE
לפני השיחה אל Intent.createChooser()
, וצריך להוסיף
תמונה ממוזערת רלוונטית באמצעות ClipData
.
הערה: ה-URI של תוכן התמונה מגיע
FileProvider
, בדרך כלל מ-<cache-path>
שהוגדר.
מידע נוסף זמין בשיתוף קבצים. חשוב לתת
כדאי לשתף את ההרשאות המתאימות כדי לקרוא כל תמונה שרוצים להשתמש בה כתמונה ממוזערת. לקבלת מידע נוסף,
פרטים נוספים זמינים בIntent.FLAG_GRANT_READ_URI_PERMISSION
.
הנה דוגמה:
Kotlin
val share = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
התצוגה המקדימה נראית בערך כך:
הוספת פעולות מותאמות אישית לגיליון השיתוף
ב-Android מגרסה 14 (API ברמה 34) ואילך, אפליקציות יכולות להוסיף פעולות מותאמות אישית לגיליון השיתוף של Android.
הפעולות המותאמות אישית מוצגות כסמלי פעולות קטנים בחלק העליון של דף השיתוף של Android ובאפליקציות
יכול לציין כל Intent
כפעולה שמופעלת כשלוחצים על הסמל.
כדי להוסיף פעולות מותאמות אישית בדף Sharesheet של Android, קודם צריך ליצור
ChooserAction
עם
ChooserAction.Builder
.
אפשר לציין PendingIntent
כפעולה שמופעלת כשלוחצים על הסמל. הוספת פרטי חיוב
מערך שמכיל את כל הפעולות המותאמות אישית ומציינים אותו כך:
EXTRA_CHOOSER_CUSTOM_ACTIONS
מהנתח Intent
.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
הוספת יעדים מותאמים אישית
הקובץ Sharesheet של Android מאפשר לציין עד שני אובייקטים מסוג ChooserTarget
מוצגים לפני שקיצורי הדרך לשיתוף ויעדי הבוררים נטענים מ-ChooserTargetServices
. אפשר גם
לציין עד שתי כוונות שמצביעות על פעילויות שמפורטות
לפני ההצעות לאפליקציות:
הוספת Intent.EXTRA_CHOOSER_TARGETS
ו-Intent.EXTRA_INITIAL_INTENTS
אל
כוונת השיתוף שלך אחרי השיחה
Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
Java
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
חשוב להשתמש בתכונה הזו בזהירות. כל Intent
בהתאמה אישית
ו-ChooserTarget
שמוסיפים מפחיתים את המספר שהמערכת מציעה. אנחנו בדרך כלל
לא להוסיף יעדים מותאמים אישית. דוגמה הולמת וחלקה להוספה
Intent.EXTRA_INITIAL_INTENTS
נועד לספק פעולות נוספות שהמשתמשים יכולים לבצע במשותף
תוכן. לדוגמה, משתמש משתף תמונות ו-Intent.EXTRA_INITIAL_INTENTS
משמש
במקום זאת, אפשר לתת להם לשלוח קישור. דוגמה נפוצה הולמת להוספת Intent.EXTRA_CHOOSER_TARGETS
היא להציג אנשים או מכשירים רלוונטיים שהאפליקציה שלכם מספקת.
החרגת יעדים ספציפיים לפי רכיב
כדי להחריג יעדים ספציפיים, אפשר לציין Intent.EXTRA_EXCLUDE_COMPONENTS
.
עשו זאת רק כדי להסיר יעדים שיש לכם שליטה עליהם. אחד התרחישים הנפוצים ביותר הוא להסתיר את
יעדי השיתוף של האפליקציה כשהמשתמשים משתפים מתוך האפליקציה, כי סביר שהכוונה שלהם לשתף
מחוץ לאפליקציה.
צריך להוסיף את Intent.EXTRA_EXCLUDE_COMPONENTS
ל-Intent אחרי ההפעלה של Intent.createChooser()
:
Kotlin
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
Java
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
קבלת מידע על שיתוף
כדאי לדעת מתי המשתמשים משתפים ואיזה יעד הם בוחרים.
גיליון שיתוף של Android מאפשר לך לקבל את המידע הזה על ידי מתן ComponentName
שמטרגט את המשתמשים שלך באמצעות IntentSender
.
קודם עליך ליצור PendingIntent
עבור BroadcastReceiver
ולספק את
IntentSender
ב-Intent.createChooser()
:
Kotlin
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender)
Java
Intent share = new Intent(ACTION_SEND); ... PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode, new Intent(myContext, MyBroadcastReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
אפשר לקבל את הקריאה החוזרת בעוד MyBroadcastReceiver
ולבדוק
Intent.EXTRA_CHOSEN_COMPONENT
:
Kotlin
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
Java
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
הוספת פעולות מותאמות אישית לגיליון השיתוף
ב-Android מגרסה 14 (API ברמה 34) ואילך, אפליקציות יכולות להוסיף פעולות מותאמות אישית לגיליון השיתוף של Android.
יצירת ChooserAction
עם
ChooserAction.Builder
.
אפשר לציין PendingIntent
כפעולה שמופעלת כשלוחצים על הסמל. הוספת פרטי חיוב
מערך שמכיל את כל הפעולות המותאמות אישית ומציינים אותו כך:
EXTRA_CHOOSER_CUSTOM_ACTIONS
מהנתח Intent
.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
שימוש במקודד Intent של Android
מומלץ להשתמש במקודד Intent ב-Android כששולחים נתונים לאפליקציה אחרת, כחלק מתהליך מוגדר היטב של משימה.
כדי להשתמש במקודד Intent של Android, צריך ליצור Intent ולהוסיף תוספות כפי שמוסיפים כדי להתקשר
הקובץ לשיתוף של Android. עם זאת, לא לקרוא
Intent.createChooser()
.
אם מותקנות מספר אפליקציות עם מסננים שתואמים
ACTION_SEND
ובסוג MIME, המערכת מציגה תיבת דו-שיח של הבהרה שנקראת מקודד מקודד
שמאפשר למשתמש לבחור יעד לשיתוף. אם מדובר באפליקציה אחת
תואם, הוא פועל.
הנה דוגמה לשימוש במקודד Intent של Android כדי לשלוח טקסט:
Kotlin
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
Java
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
מידע נוסף
למידע נוסף על שליחת נתונים, אפשר לעיין במאמר מסנני Intent ומסנני Intent.