מערכת Android משתמשת בכוונות ובתוספות שלהם כדי לאפשר למשתמשים לשתף מידע במהירות להשתמש בקלות באפליקציות שהם אוהבים.
ב-Android יש שתי דרכים שבהן משתמשים יכולים לשתף נתונים בין אפליקציות:
- חלונית השיתוף של Android מיועדת בעיקר לשליחת תוכן מחוץ לאפליקציה ו/או ישירות למשתמש אחר. לדוגמה, שיתוף כתובת URL עם חבר.
- פותר הכוונות של Android מתאים במיוחד להעברת נתונים לשלב הבא של משימה מוגדרת היטב. לדוגמה, פתיחת קובץ PDF מהאפליקציה ומתן הרשאה למשתמשים לבחור את הצופה המועדף.
כשיוצרים Intent, מציינים את הפעולה שרוצים שהכוונה תבצע.
מערכת Android משתמשת בפעולה ACTION_SEND
כדי לשלוח נתונים מפעילות אחת לאחרת, גם מעבר לגבולות התהליך. צריך לציין
בין הנתונים לבין הסוג שלהם. המערכת מזהה באופן אוטומטי את הפעילויות התואמות שיכולות לקבל את הנתונים ומציגה אותן למשתמש. במקרה של פותר הכוונה, אם רק פעילות אחת יכולה לטפל בכוונה, הפעילות הזו מתחילה מיד.
למה כדאי להשתמש בקובץ לשיתוף ב-Android

מומלץ מאוד להשתמש בחלונית השיתוף של Android כדי ליצור עקביות למשתמשים בין האפליקציות. אין להציג רשימה משלכם של יעדי שיתוף באפליקציה או ליצור וריאציות משלכם של חלונית השיתוף.
הקובץ לשיתוף של Android מאפשר למשתמשים לשתף מידע עם האדם הנכון, בעזרת הצעות רלוונטיות לאפליקציות, והכול בהקשה אחת. ה-Sharesheet יכול להציע יעדים שאינם זמינים לפתרונות מותאמים אישית, ומשתמש בדירוג עקבי. הסיבה לכך היא שה-Sharesheet יכול להביא בחשבון מידע על פעילות האפליקציה והפעילות של המשתמשים. והוא זמין רק למערכת.
ל-Android Sharesheet יש גם תכונות שימושיות רבות למפתחים. לדוגמה, אפשר: לבצע את הפעולות הבאות:
- איך בודקים מתי המשתמשים משתפים קבצים ואיפה הם משתפים אותם
- הוספת יעד
ChooserTarget
ויעד אפליקציה בהתאמה אישית - הצגת תצוגה מקדימה של תוכן טקסט עשיר, החל מ-Android 10 (רמת API 29)
- החרגת יעדים שתואמים לשמות רכיבים ספציפיים
שימוש בקובץ לשיתוף ב-Android
לכל סוגי השיתוף, יוצרים כוונה ומגדירים את הפעולה שלה בתור Intent.ACTION_SEND
.
כדי להציג את חלונית השיתוף של Android, צריך להפעיל את Intent.createChooser()
ולהעביר אליה את האובייקט Intent
.
הוא מחזיר גרסה של הכוונה שבה תמיד מוצגת חלונית השיתוף של Android.
שליחת תוכן טקסט
השימוש הישיר והנפוץ ביותר ב-Sharesheet של Android הוא לשלוח תוכן טקסט בין פעילות אחת לפעילות אחרת. לדוגמה, ברוב הדפדפנים אפשר לשתף את כתובת ה-URL של הדף המוצג כרגע כטקסט עם אפליקציה אחרת. כך אפשר לשתף מאמר או אתר עם חברים באימייל או ברשתות חברתיות. דוגמה לאופן שבו עושים זאת:
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)
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
, כפי שמתואר בדוגמה הבאה.
בדרך כלל משתמשים בשיטה הזו כדי לשתף תמונה, אבל אפשר גם לשתף כל סוג של תוכן בינארי.
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))
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/*"
כדי להתאים לפעילות שמטפלת בכל סוג של תמונה. אפשר לשתף שילוב של סוגים, אבל אנחנו לא ממליצים על כך, כי לא ברור לנמען מה הוא אמור לקבל. אם יש צורך לשלוח מספר סוגים, השתמשו
"*/*"
תלוי באפליקציה המקבלת
ולעבד את הנתונים שלכם. הנה דוגמה:
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))
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
.
הנה דוגמה:
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)
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.
ב-Android מגרסה 14 (API ברמה 34) ואילך, אפליקציות יכולות להוסיף פעולות מותאמות אישית לגיליון השיתוף של Android.
הפעולות בהתאמה אישית מוצגות כסמלי פעולה קטנים בחלק העליון של חלונית השיתוף ב-Android, והאפליקציות יכולות לציין כל Intent
כפעולה שתופעל כשלוחצים על הסמל.
כדי להוסיף פעולות בהתאמה אישית לחלונית השיתוף של Android, קודם צריך ליצור ChooserAction
באמצעות ChooserAction.Builder
.
אפשר לציין את הערך PendingIntent
כפעולה שתתבצע כשלוחצים על הסמל. הוספת פרטי חיוב
מערך שמכיל את כל הפעולות המותאמות אישית ומציינים אותו כך:
EXTRA_CHOOSER_CUSTOM_ACTIONS
מהנתח Intent
.
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)
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 של השיתוף אחרי שמפעילים את Intent.createChooser()
:
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
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.createChooser()
:
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) }
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()
:
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)
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
:
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
@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
.
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)
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);
שימוש בפותר הכוונות של Android

צילום מסך של מקודד Intent של ACTION_SEND
.
הדרך הטובה ביותר להשתמש במקודד Intent של Android היא לשלוח נתונים לאפליקציה אחרת, כחלק מתהליך מוגדר היטב של משימה.
כדי להשתמש במקודד Intent של Android, צריך ליצור Intent ולהוסיף תוספות כפי שהיית רוצה להפעיל
הקובץ לשיתוף של Android. עם זאת, אין להתקשר למספר Intent.createChooser()
.
אם מותקנות מספר אפליקציות עם מסננים שתואמים
ACTION_SEND
ובסוג MIME, המערכת מציגה תיבת דו-שיח של הבהרה שנקראת מקודד מקודד
שמאפשר למשתמש לבחור יעד לשיתוף. אם אפליקציה אחת תואמת, היא מופעלת.
הנה דוגמה לשימוש במקודד Intent של Android כדי לשלוח טקסט:
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
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);
מידע נוסף
מידע נוסף על שליחת נתונים זמין במאמר כוונות ומסנני כוונות.