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

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

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

  • Activity يتضمّن علامة intent-filter مطابقة في البيان
  • اختصارات المشاركة التي نشرها تطبيقك

تستهدف ميزة "المشاركة المباشرة" الروابط لصفحات معيّنة في نشاط معيّن داخل تطبيقك، وهي غالبًا ما تمثّل شخصًا أو مجموعة، وتعرضها "ورقة المشاركة" في Android. على سبيل المثال، يمكن أن يوفّر تطبيق مراسلة هدفًا لميزة "المشاركة المباشرة" خاصًا بمستخدم معيّن، ما يؤدي إلى إنشاء رابط لصفحة معيّنة في التطبيق ينقل المستخدم مباشرةً إلى محادثة مع هذا المستخدم. راجِع مقالة توفير أهداف Direct Share للحصول على تعليمات مفصّلة.

أنواع 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. يتم تحديد كليهما في ملف البيان. يمكنك ضبط تصنيفات فلاتر الأنشطة أو الأهداف لتوفير المزيد من السياق.

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