تلقّي بيانات بسيطة من تطبيقات أخرى

كما يمكن لأحد التطبيقات إرسال بيانات إلى تطبيقات أخرى، يمكنه أيضًا تلقّي بيانات من تطبيقات أخرى. فكِّر في كيفية تفاعل المستخدمين مع تطبيقك وأنواع البيانات التي تريد تلقّيها من التطبيقات الأخرى. على سبيل المثال، قد يكون أحد تطبيقات التواصل الاجتماعي مهتمًا بتلقّي محتوى نصي، مثل عنوان URL مثير للاهتمام على الويب، من تطبيق آخر.

يرسل مستخدمو التطبيقات الأخرى بشكل متكرر بيانات إلى تطبيقك من خلال قائمة مشاركة البيانات من Android أو أداة حلّ الأهداف. يجب أن تضبط التطبيقات التي ترسل بيانات إلى تطبيقك نوع 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

راجِع السجلّ الرسمي لأنواع وسائط MIME التابع لهيئة IANA.

إنشاء أهداف مشاركة رائعة

عندما ينقر المستخدم على هدف مشاركة مرتبط بنشاط معيّن، يجب أن يكون بإمكانه تأكيد المحتوى المشترَك وتعديله قبل استخدامه. ويكتسب ذلك أهمية خاصة بالنسبة إلى البيانات النصية.

تلقّي البيانات باستخدام نشاط

يتضمّن تلقّي البيانات باستخدام نشاط تعديل البيان والتعامل مع المحتوى الوارد والتأكّد من أنّ المستخدم يتعرّف على تطبيقك.

تعديل البيان

تُعلم فلاتر الأهداف النظام بالأهداف التي يقبلها أحد مكوّنات التطبيق. على غرار طريقة إنشاء هدف باستخدام إجراء ACTION_SEND في الدرس إرسال بيانات بسيطة إلى تطبيقات أخرى ، يمكنك إنشاء فلاتر أهداف لتلقّي الأهداف باستخدام هذا الإجراء. يمكنك تحديد intent filter في البيان باستخدام العنصر <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>

عندما يحاول تطبيق آخر مشاركة أي من هذه العناصر من خلال إنشاء intent وتمريره إلى startActivity()، يتم إدراج تطبيقك كخيار في قائمة مشاركة البيانات من Android أو أداة حلّ الأهداف. إذا اختار المستخدم تطبيقك، يبدأ النشاط المقابل (.ui.MyActivity في المثال السابق). بعد ذلك، يعود إليك أمر التعامل مع المحتوى بشكل مناسب في التعليمات البرمجية وواجهة المستخدم.

التعامل مع المحتوى الوارد

للتعامل مع المحتوى الذي يتم تسليمه بواسطة Intent، عليك استدعاء getIntent() للحصول على عنصر Intent. بعد الحصول على العنصر، يمكنك فحص محتوياته لتحديد الإجراء التالي. إذا كان من الممكن بدء هذا النشاط من أجزاء أخرى من النظام (مثل مشغّل التطبيقات)، عليك أخذ ذلك في الاعتبار عند فحص الهدف.

عليك توخي الحذر الشديد عند التحقّق من البيانات الواردة، إذ لا يمكنك معرفة ما قد يرسله إليك تطبيق آخر. على سبيل المثال، قد يتم ضبط نوع MIME غير صحيح، أو قد تكون الصورة التي يتم إرسالها كبيرة جدًا. عليك أيضًا معالجة البيانات الثنائية في سلسلة محادثات منفصلة بدلاً من سلسلة المحادثات الرئيسية ("واجهة المستخدم").

@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
    }
}

يمكن أن يكون تعديل واجهة المستخدم بعد تلقّي البيانات بسيطًا مثل ملء EditText، أو يمكن أن يكون أكثر تعقيدًا مثل تطبيق فلتر صور مثير للاهتمام على صورة. يعود إلى تطبيقك تحديد الإجراء التالي.

مشاركة عنوان URL للقطة شاشة

عند أخذ لقطة شاشة، يمكنك مشاركتها وأي عنوان URL مرتبط بها. يوفّر ذلك تجربة مستخدم أفضل. عند تلقّي عنوان URL، احرص على الحصول على الحقل EXTRA_TEXT من الهدف، كما هو موضّح في المثال التالي:

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
}

التأكّد من أنّ المستخدمين يتعرّفون على تطبيقك

يتم تمثيل تطبيقك من خلال الرمز و التصنيف في قائمة مشاركة البيانات من Android وأداة حلّ الأهداف. يتم تحديد كليهما في البيان. يمكنك ضبط تصنيفات النشاط أو فلتر الأهداف لتوفير المزيد من السياق.

اعتبارًا من Android 10 (مستوى واجهة برمجة التطبيقات 29)، لا تستخدم قائمة مشاركة البيانات من Android سوى الرموز التي تم ضبطها في البيان على علامة application. يتجاهل Android الرموز التي تم ضبطها على علامتَي intent-filter وactivity.