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

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

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