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

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

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