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

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

عندما يحاول تطبيق آخر مشاركة أي من هذه الأشياء عن طريق إنشاء النية وتمريره إلى startActivity()، تطبيقك تم إدراجها كخيار في "قائمة مشاركة البيانات" في 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