שליחת נתונים פשוטים לאפליקציות אחרות

מערכת Android משתמשת בכוונות ובתוספות שלהם כדי לאפשר למשתמשים לשתף מידע במהירות להשתמש בקלות באפליקציות שהם אוהבים.

ב-Android יש למשתמשים שתי דרכים לשתף נתונים בין אפליקציות:

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

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

למה כדאי להשתמש בדף השיתוף של Android

מומלץ מאוד להשתמש בדף Sharesheet של Android כדי ליצור עקביות עבור המשתמשים באפליקציות. אסור להציג את רשימת יעדי השיתוף של האפליקציה שלך או ליצור רשימה משלך וריאציות של גיליון שיתוף.

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

לגיליון השיתוף של Android יש גם הרבה תכונות שימושיות למפתחים. לדוגמה, אפשר: לבצע את הפעולות הבאות:

שימוש בגיליון לשיתוף עם 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/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
סיומות קבצים נתמכות 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.

ב-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 של ACTION_SEND.

מומלץ להשתמש במקודד 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.