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

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

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

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

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

إتاحة أنواع 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.

أنشِئ أهدافًا رائعة للمشاركة

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

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

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

تعديل البيان

تُعلِم فلاتر الأهداف النظام بالأغراض التي يقبلها مكوِّن التطبيق. وتمامًا كما أنشأت غرضًا باستخدام الإجراء 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 غير صحيح، أو قد تكون الصورة التي يتم إرسالها كبيرة للغاية. تذكر أيضًا معالجة البيانات الثنائية في سلسلة منفصلة بدلاً من سلسلة ("UI") الرئيسية.

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 Sharesheet سوى الرموز المحدَّدة في البيان ضمن علامة application. ويتجاهل Android الرموز التي تم ضبطها على علامتَي intent-filter وactivity.