دریافت داده‌های ساده از برنامه‌های دیگر

همان‌طور که یک برنامه می‌تواند داده‌ها را به برنامه‌های دیگر ارسال کند، می‌تواند داده‌ها را از برنامه‌های دیگر نیز دریافت کند. به نحوه تعامل کاربران با برنامه‌تان و انواع داده‌هایی که می‌خواهید از برنامه‌های دیگر دریافت کنید فکر کنید. برای مثال، یک برنامه شبکه اجتماعی ممکن است علاقه‌مند به دریافت محتوای نوشتاری، مانند نشانی وب جالب، از برنامه دیگری باشد.

در برنامه‌ای که از «ناوبری آهنگ‌سازی» استفاده می‌کند، دریافت داده‌های ارسالی از برنامه دیگر یک فرایند دو مرحله‌ای است:

  1. اعلام <intent-filter> در مانیفست: همچنان باید فیلتر هدفی را به «فعالیت» خود در فایل AndroidManifest.xml اضافه کنید. این کار به سیستم عامل Android می‌گوید که برنامه شما می‌تواند کنش‌های خاص (مثل ACTION_SEND) و انواع MIME (مثل text/plain) را دریافت کند.

  2. در نمودار «پیمایش Compose» یک navDeepLink تعریف کنید: به‌جای رهگیری و تجزیه دستی «هدف» در روش‌های onCreate یا onNewIntent «فعالیت»، از پشتیبانی پیوند عمیق «پیمایش Compose» استفاده کنید. یک navDeepLink که با کنش و نوع MIME مطابقت دارد مستقیماً به مقصد ترکیبی که باید محتوا را نمایش دهد پیوست کنید. ‫NavController به‌طور خودکار «قصد» را رهگیری می‌کند و کاربر را مستقیماً به آن صفحه هدایت می‌کند.

هدف‌های «هم‌رسانی مستقیم» پیوندهای عمیق به «فعالیت» خاصی در برنامه‌تان هستند. این هدف‌ها اغلب نشان‌دهنده فرد یا گروهی هستند و «برگ هم‌رسانی 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 اشتباه تنظیم شده باشد یا تصویر ارسالی بسیار بزرگ باشد. همچنین به‌یاد داشته باشید که داده‌های باینری را در رشته‌ای جداگانه به‌جای رشته اصلی («واسط کاربر») پردازش کنید.

@Composable
fun SharesheetHandler() {
    val activity = LocalActivity.current
    val intent = activity?.intent

    when (intent?.action) {
        Intent.ACTION_SEND -> {
            if (intent.type == "text/plain") {
                handleSendText(intent) // Handle text being sent
            } else if (intent.type?.startsWith("image/") == true) {
                handleSendImage(intent) // Handle single image being sent
            }
        }

        Intent.ACTION_SEND_MULTIPLE -> {
            if (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 state with the shared text
    }
}

private fun handleSendImage(intent: Intent) {
    val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUri?.let {
        // Update UI state with the shared image
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    val imageUris =
        IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUris?.let {
        // Update UI state with the shared images
    }
}

به‌روزرسانی واسط کاربر پس‌از دریافت داده‌ها می‌تواند به سادگی پر کردن TextField باشد، یا می‌تواند پیچیده‌تر باشد، مثلاً اعمال فیلتر عکس جالب روی تصویر. این به برنامه شما بستگی دارد که در ادامه چه اتفاقی بیفتد.

هم‌رسانی نشانی وب نماگرفت

هنگام گرفتن نماگرفت، می‌توانید نماگرفت و هر نشانی وب مرتبط را هم‌رسانی کنید. این کار تجربه کاربری غنی‌تری را فراهم می‌کند. هنگام دریافت نشانی وب، مطمئن شوید که فیلد EXTRA_TEXT را از هدف دریافت کنید، همان‌طور که در مثال زیر نشان داده شده است:

IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
    // Handle the EXTRA_TEXT as well
    val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
    // Update UI state with the shared image and the EXTRA_TEXT if available
}

مطمئن شوید که کاربران برنامه‌تان را تشخیص می‌دهند

برنامه شما با نماد و برچسب در «کاربرگ هم‌رسانی» و حل‌وفصل‌کننده قصد Android نشان داده می‌شود. هر دو در مانیفست تعریف شده‌اند. می‌توانید برچسب‌های فیلتر فعالیت یا هدف را تنظیم کنید تا زمینه بیشتری ارائه دهید.

از Android 10 (سطح API‏ ۲۹)، «برگ هم‌رسانی Android» فقط از نمادهای تنظیم‌شده در مانیفست در برچسب application استفاده می‌کند. ‫Android نمادهای تنظیم‌شده در intent-filter و activity برچسب‌ها را نادیده می‌گیرد.