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

בדיוק כמו שאפליקציה יכולה לשלוח נתונים לאפליקציות אחרות, היא יכולה גם לקבל נתונים אפליקציות גם כן. מומלץ לחשוב על האינטראקציה של המשתמשים עם האפליקציה ועל הנתונים שרוצים לקבל מאפליקציות אחרות. לדוגמה, רשת חברתית עשויים להיות מעוניינים לקבל תוכן טקסט, למשל כתובת URL מעניינת באינטרנט, מאפליקציה אחרת.

משתמשים של אפליקציות אחרות שולחים נתונים לאפליקציה שלך לעיתים קרובות דרך מכשיר Android קובץ שיתוף או מקודד Intent. אפליקציות ששולחות נתונים לאפליקציה שלך חייבות להגדיר סוג ה-MIME לנתונים האלה. האפליקציה שלך יכולה לקבל נתונים שנשלחו על ידי אפליקציה אחרת ב בדרכים הבאות:

  • Activity עם תג intent-filter תואם במניפסט
  • שיתוף קיצורי דרך שפורסמו על ידי האפליקציה שלך.

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

תמיכה בסוגי MIME

במצב אידיאלי, אפליקציה צריכה להיות מסוגלת לקבל את המגוון הרחב ביותר של סוגי MIME. לדוגמה, אפליקציית הודעות שמיועדת לשלוח טקסט, תמונות וסרטונים תומך באופן אידיאלי בקבלת text/*, image/* ו-video/*. הנה כמה סוגי 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

כדאי לעיין במרשם הרשמי של IANA לפרסום סוגי מדיה MIME.

יוצרים יעדי שיתוף מעולים

כשמשתמש מקיש על יעד שיתוף שמשויך לפעילות ספציפית הוא להיות מסוגל לאשר ולערוך את התוכן המשותף לפני השימוש בו. הדבר שחשוב מאוד לנתוני טקסט.

קבלת נתונים עם פעילות

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

עדכון המניפסט

מסנני Intent מודיעים למערכת אילו כוונות מקבלת רכיב אפליקציה. דומה לאופן שבו יצרת כוונה עם הפעולה ACTION_SEND בשדה שליחת נתונים פשוטים לאפליקציות אחרות עליך ליצור מסנני Intent כדי לקבל כוונות באמצעות הפעולה הזו. שלך להגדיר מסנן 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 או במקודד Intent ב-Android. אם המשתמש בוחר את האפליקציה שלך, תתחיל הפעילות המתאימה (.ui.MyActivity ב- בדוגמה שלמעלה). אז זו האחריות שלך לטפל בתוכן בצורה המתאימה בקוד ובממשק המשתמש.

טיפול בתוכן הנכנס

כדי לטפל בתוכן שמועבר על ידי Intent, צריך להתקשר getIntent() כדי לקבל את האובייקט Intent. אחרי שמקבלים את האובייקט, אפשר לבדוק את התוכן שלו כדי להחליט מה לעשות עכשיו. אם הפעילות הזו יכולה להיות מופעל מחלקים אחרים של המערכת (כמו מרכז האפליקציות), צריך לקחת את זה במהלך בחינת הכוונה.

שים לב במיוחד לבדיקת הנתונים הנכנסים, אף פעם לא ידוע לך אילו פרטים אחרים עשויה לשלוח אליך. לדוגמה, ייתכן שהוגדר סוג MIME שגוי, או יכול להיות שהתמונה שנשלחת גדולה מאוד. כמו כן, חשוב לזכור לעבד נתונים בינאריים בשרשור נפרד ולא בשרשור הראשי ('ממשק משתמש').

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    when {
        intent?.action == Intent.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 == Intent.ACTION_SEND_MULTIPLE
                && intent.type?.startsWith("image/") == true -> {
                handleSendMultipleImages(intent) // Handle multiple images being sent
        }
        else -> {
            // Handle other intents, such as being started from the home screen
        }
    }
    ...
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI to reflect text being shared
    }
}

private fun handleSendImage(intent: Intent) {
    (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
        // Update UI to reflect image being shared
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let {
        // Update UI to reflect multiple images being shared
    }
}

Java

void onCreate (Bundle savedInstanceState) {
    ...
    // Get intent, action and MIME type
    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/plain".equals(type)) {
            handleSendText(intent); // Handle text being sent
        } else if (type.startsWith("image/")) {
            handleSendImage(intent); // Handle single image being sent
        }
    } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
        if (type.startsWith("image/")) {
            handleSendMultipleImages(intent); // Handle multiple images being sent
        }
    } else {
        // Handle other intents, such as being started from the home screen
    }
    ...
}

void handleSendText(Intent intent) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    if (sharedText != null) {
        // Update UI to reflect text being shared
    }
}

void handleSendImage(Intent intent) {
    Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
    if (imageUri != null) {
        // Update UI to reflect image being shared
    }
}

void handleSendMultipleImages(Intent intent) {
    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    if (imageUris != null) {
        // Update UI to reflect multiple images being shared
    }
}

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

איך לוודא שהמשתמשים מזהים את האפליקציה שלך

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

החל מ-Android 10 (רמת API 29), ב-Sharesheet של Android נעשה שימוש רק בסמלים שמוגדרים המניפסט שבתג application. מערכת Android מתעלמת מסמלים שהוגדרו ב- intent-filter ו-activity תגים.