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

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

<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()، يتم إدراج تطبيقك كخيار في "لوحة المشاركة" أو أداة حلّ intents في 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 وحلّ مهام التطبيقات. ويتم تحديد كلاهما في البيان. يمكنك ضبط تصنيفات فلاتر الأنشطة أو الأهداف لتقديم المزيد من السياق.

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