همانطور که یک برنامه می تواند داده ها را به برنامه های دیگر ارسال کند، می تواند داده ها را از برنامه های دیگر نیز دریافت کند. به نحوه تعامل کاربران با برنامه شما و نوع داده هایی که می خواهید از برنامه های دیگر دریافت کنید فکر کنید. به عنوان مثال، یک برنامه شبکه اجتماعی ممکن است علاقه مند به دریافت محتوای متنی، مانند یک URL وب جالب، از یک برنامه دیگر باشد.
کاربران سایر برنامهها اغلب دادهها را از طریق Sharesheet Android یا Intent Resolver به برنامه شما ارسال میکنند. برنامههایی که دادهها را به برنامه شما ارسال میکنند باید یک نوع MIME برای آن داده تنظیم کنند. برنامه شما می تواند داده های ارسال شده توسط برنامه دیگری را به روش های زیر دریافت کند:
- یک
Activity
با یک تگintent-filter
منطبق در مانیفست - میانبرهای به اشتراک گذاری منتشر شده توسط برنامه شما.
اهداف اشتراک مستقیم پیوندهای عمیق به یک فعالیت خاص در برنامه شما هستند. آنها اغلب نماینده یک شخص یا یک گروه هستند و اشتراکگذاری Android آنها را نشان میدهد. به عنوان مثال، یک برنامه پیام رسانی می تواند یک هدف اشتراک گذاری مستقیم برای شخصی فراهم کند که مستقیماً به مکالمه با آن شخص پیوند عمیق می دهد. برای دستورالعمل های دقیق به ارائه اهداف اشتراک مستقیم مراجعه کنید.
پشتیبانی از انواع MIME
در حالت ایده آل، یک برنامه باید بتواند وسیع ترین طیف ممکن از انواع MIME را دریافت کند. به عنوان مثال، یک برنامه پیام رسانی که برای ارسال متن، تصاویر و ویدیو طراحی شده است، به طور ایده آل از دریافت text/*
، image/*
و video/*
پشتیبانی می کند. در اینجا چند نوع MIME رایج برای ارسال و دریافت داده های ساده در اندروید آورده شده است.
گیرندگان برای ثبت نام می کنند | فرستنده ها ارسال می کنند |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
پسوند فایل های پشتیبانی شده | application/pdf |
به رجیستری رسمی IANA انواع رسانه های MIME مراجعه کنید.
اهداف سهم بزرگی را تعیین کنید
وقتی کاربر روی هدف اشتراک گذاری مرتبط با یک فعالیت خاص ضربه می زند، باید بتواند محتوای به اشتراک گذاشته شده را قبل از استفاده تأیید و ویرایش کند. این به ویژه برای داده های متنی مهم است.
دریافت داده با یک فعالیت
دریافت داده با یک فعالیت شامل بهروزرسانی مانیفست شما، مدیریت محتوای ورودی و اطمینان از اینکه کاربر برنامه شما را میشناسد.
مانیفست خود را به روز کنید
فیلترهای Intent به سیستم اطلاع می دهند که یک جزء برنامه کدام هدف را می پذیرد. مشابه نحوه ساخت intent با یک عمل 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>
هنگامی که برنامه دیگری سعی می کند هر یک از این موارد را با ساخت یک intent و ارسال آن به startActivity()
به اشتراک بگذارد، برنامه شما به عنوان یک گزینه در Sharesheet Android یا Intent Resolver فهرست می شود. اگر کاربر برنامه شما را انتخاب کند، فعالیت مربوطه را شروع میکند ( .ui.MyActivity
در مثال قبل). سپس این به شما بستگی دارد که محتوا را به طور مناسب در کد و UI خود مدیریت کنید.
محتوای ورودی را مدیریت کنید
برای مدیریت محتوای ارائه شده توسط یک Intent
، با getIntent()
تماس بگیرید تا شی Intent
را دریافت کنید. هنگامی که شیء را در اختیار دارید، می توانید محتویات آن را بررسی کنید تا مشخص کنید که در مرحله بعد چه کاری انجام دهید. اگر میتوان این فعالیت را از سایر بخشهای سیستم (مانند راهانداز) شروع کرد، هنگام بررسی هدف، این را در نظر بگیرید.
برای بررسی داده های دریافتی دقت بیشتری داشته باشید، هرگز نمی دانید برنامه های دیگری ممکن است برای شما چه ارسال کنند. به عنوان مثال، ممکن است نوع MIME اشتباهی تنظیم شده باشد، یا تصویر ارسال شده ممکن است بسیار بزرگ باشد. همچنین، به یاد داشته باشید که داده های باینری را به جای رشته اصلی ("UI") در یک رشته جداگانه پردازش کنید.
کاتلین
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 } }
جاوا
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 (سطح API 29)، اشتراکگذاری Android فقط از نمادهایی استفاده میکند که در مانیفست روی برچسب application
شما تنظیم شده است. اندروید آیکونهای تنظیمشده در intent-filter
و تگهای activity
را نادیده میگیرد.