Android از intent ها و امکانات اضافی مرتبط با آنها استفاده می کند تا به کاربران اجازه دهد اطلاعات را به سرعت و به راحتی با استفاده از برنامه های مورد علاقه خود به اشتراک بگذارند.
اندروید دو راه برای اشتراک گذاری داده ها بین برنامه ها در اختیار کاربران قرار می دهد:
- اشتراکگذاری Android اساساً برای ارسال محتوای خارج از برنامه شما و/یا مستقیماً برای کاربر دیگر طراحی شده است. به عنوان مثال، به اشتراک گذاری یک URL با یک دوست.
- حلکننده قصد Android برای انتقال دادهها به مرحله بعدی یک کار کاملاً تعریفشده مناسبتر است. به عنوان مثال، یک PDF را از برنامه خود باز کنید و به کاربران اجازه دهید بیننده دلخواه خود را انتخاب کنند.
هنگامی که یک intent را می سازید، عملی را که می خواهید قصد انجام دهد مشخص می کنید. Android از عملکرد ACTION_SEND
برای ارسال دادهها از یک فعالیت به فعالیت دیگر، حتی در فراسوی مرزهای فرآیند، استفاده میکند. باید داده ها و نوع آن را مشخص کنید. سیستم به طور خودکار فعالیت های سازگاری را که می توانند داده ها را دریافت کنند شناسایی کرده و به کاربر نمایش می دهد. در مورد حلکننده قصد، اگر فقط یک فعالیت بتواند هدف را مدیریت کند، آن فعالیت بلافاصله شروع میشود.
چرا باید از اشتراکگذاری اندروید استفاده کرد
ما قویاً توصیه میکنیم از اشتراکگذاری Android برای ایجاد یکپارچگی برای کاربران خود در سراسر برنامهها استفاده کنید. فهرست اهداف اشتراکگذاری برنامهتان را نمایش ندهید یا تغییرات Sharesheet خود را ایجاد نکنید.
اشتراکگذاری Android به کاربران امکان میدهد اطلاعات را با فرد مناسب، با پیشنهادات برنامههای مرتبط، با یک ضربه به اشتراک بگذارند. Sharesheet می تواند اهدافی را پیشنهاد کند که برای راه حل های سفارشی در دسترس نیستند و از یک رتبه بندی ثابت استفاده می کند. این به این دلیل است که Sharesheet میتواند اطلاعات مربوط به برنامه و فعالیت کاربر را که فقط در دسترس سیستم است، در نظر بگیرد.
اشتراکگذاری اندروید دارای ویژگیهای مفید بسیاری برای توسعهدهندگان است. به عنوان مثال، می توانید کارهای زیر را انجام دهید:
- ببینید کاربران شما چه زمانی اشتراک گذاری را تکمیل می کنند و به کجا می رسند
- یک
ChooserTarget
سفارشی و اهداف برنامه اضافه کنید - ارائه پیشنمایش محتوای متنی غنی، از Android 10 (سطح API 29)
- اهدافی را که با نام اجزای خاص مطابقت دارند حذف کنید
از اشتراکگذاری اندروید استفاده کنید
برای همه انواع اشتراکگذاری، یک intent ایجاد کنید و عملکرد آن را روی Intent.ACTION_SEND
تنظیم کنید.ACTION_SEND. برای نمایش اشتراکگذاری Android، Intent.createChooser()
را فراخوانی کنید و شی Intent
خود را ارسال کنید. نسخهای از قصد شما را برمیگرداند که همیشه برگه اشتراک Android را نمایش میدهد.
ارسال محتوای متنی
ساده ترین و رایج ترین استفاده از Sharesheet اندروید ارسال محتوای متنی از یک فعالیت به فعالیت دیگر است. به عنوان مثال، اکثر مرورگرها می توانند URL صفحه نمایش داده شده فعلی را به صورت متن با برنامه دیگری به اشتراک بگذارند. این برای به اشتراک گذاری یک مقاله یا وب سایت با دوستان از طریق ایمیل یا شبکه های اجتماعی مفید است. در اینجا مثالی از نحوه انجام این کار آورده شده است:
کاتلین
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent)
جاوا
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent);
به صورت اختیاری، میتوانید موارد اضافی را برای گنجاندن اطلاعات بیشتر اضافه کنید، مانند گیرندگان ایمیل ( EXTRA_EMAIL
، EXTRA_CC
، EXTRA_BCC
)، موضوع ایمیل ( EXTRA_SUBJECT
)، و غیره.
توجه: برخی از برنامههای ایمیل، مانند Gmail، برای موارد اضافی مانند EXTRA_EMAIL
و EXTRA_CC
انتظار دارند یک String[]
. از putExtra(String, String[])
برای اضافه کردن این موارد به قصد خود استفاده کنید.
ارسال محتوای باینری
داده های باینری را با استفاده از عملکرد ACTION_SEND
به اشتراک بگذارید. نوع MIME مناسب را تنظیم کنید و یک URI روی داده های موجود در EXTRA_STREAM
اضافی قرار دهید، همانطور که در مثال زیر نشان داده شده است. این معمولا برای به اشتراک گذاری یک تصویر استفاده می شود، اما می تواند برای اشتراک گذاری هر نوع محتوای باینری استفاده شود.
کاتلین
val shareIntent: Intent = Intent().apply { action = Intent.ACTION_SEND // Example: content://com.google.android.apps.photos.contentprovider/... putExtra(Intent.EXTRA_STREAM, uriToImage) type = "image/jpeg" } startActivity(Intent.createChooser(shareIntent, null))
جاوا
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); // Example: content://com.google.android.apps.photos.contentprovider/... shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, null));
برنامه دریافت کننده برای دسترسی به داده هایی که Uri
به آنها اشاره می کند به مجوز نیاز دارد. دو روش پیشنهادی برای انجام این کار وجود دارد:
- داده ها را در
ContentProvider
خود ذخیره کنید، مطمئن شوید که برنامه های دیگر مجوز صحیح دسترسی به ارائه دهنده شما را دارند. مکانیسم ترجیحی برای ارائه دسترسی استفاده از مجوزهای هر URI است که موقتی هستند و فقط به برنامه دریافت کننده دسترسی می دهند. یک راه آسان برای ایجاد یکContentProvider
مانند این، استفاده از کلاس کمکیFileProvider
است. - از سیستم
MediaStore
استفاده کنید.MediaStore
در درجه اول برای انواع MIME ویدئو، صدا و تصویر است. با این حال، با شروع Android 3.0 (سطح API 11)، می تواند انواع غیر رسانه ای را نیز ذخیره کند. برای اطلاعات بیشتر،MediaStore.Files
ببینید. فایلها را میتوان با استفاده ازscanFile()
درMediaStore
وارد کرد، پس از آن یکUri
به سبکcontent://
که برای اشتراکگذاری مناسب است به پاسخ تماسonScanCompleted()
ارسال میشود. توجه داشته باشید که پس از افزودن بهMediaStore
سیستم، محتوا برای هر برنامه موجود در دستگاه قابل دسترسی است.
از نوع MIME مناسب استفاده کنید
خاص ترین نوع MIME موجود را برای داده هایی که ارسال می کنید ارائه کنید. برای مثال، هنگام اشتراکگذاری متن ساده، از text/plain
استفاده کنید. در اینجا چند نوع MIME رایج هنگام ارسال داده های ساده در Android آورده شده است:
گیرندگان برای ثبت نام می کنند | فرستنده ها ارسال می کنند |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
پسوند فایل های پشتیبانی شده | application/pdf |
برای اطلاعات بیشتر در مورد انواع MIME، به رجیستری رسمی IANA انواع رسانه MIME مراجعه کنید.
برگه اشتراک Android بسته به نوع MIME ارائه شده ممکن است پیش نمایش محتوا را نشان دهد. برخی از ویژگی های پیش نمایش فقط برای انواع خاصی در دسترس هستند.
چند قسمت از محتوا را به اشتراک بگذارید
برای اشتراکگذاری چند قطعه محتوا، از عملکرد ACTION_SEND_MULTIPLE
همراه با فهرستی از URIهایی که به محتوا اشاره میکنند، استفاده کنید. نوع MIME با توجه به ترکیب محتوایی که به اشتراک می گذارید متفاوت است. برای مثال، اگر سه تصویر JPEG را به اشتراک بگذارید، از نوع "image/jpg"
استفاده می کنید. برای ترکیبی از انواع تصویر، از "image/*"
برای مطابقت با فعالیتی که هر نوع تصویری را مدیریت می کند، استفاده کنید. در حالی که امکان به اشتراک گذاشتن ترکیبی از انواع وجود دارد، ما به شدت از این امر خودداری می کنیم، زیرا برای گیرنده مشخص نیست که چه چیزی قرار است ارسال شود. اگر لازم است چندین نوع ارسال کنید، از "*/*"
استفاده کنید. تجزیه و پردازش داده های شما به برنامه دریافت کننده بستگی دارد. در اینجا یک مثال است:
کاتلین
val imageUris: ArrayList<Uri> = arrayListOf( // Add your image URIs here imageUri1, imageUri2 ) val shareIntent = Intent().apply { action = Intent.ACTION_SEND_MULTIPLE putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris) type = "image/*" } startActivity(Intent.createChooser(shareIntent, null))
جاوا
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, null));
مطمئن شوید که اشیاء Uri
ارائه شده به داده هایی اشاره می کنند که یک برنامه دریافت کننده می تواند به آنها دسترسی داشته باشد.
محتوای غنی را به پیش نمایش متن اضافه کنید
با شروع Android 10 (سطح API 29)، اشتراکگذاری Android پیشنمایشی از متن در حال اشتراکگذاری را نشان میدهد. در برخی موارد، درک متنی که به اشتراک گذاشته می شود دشوار است. به اشتراک گذاری یک URL پیچیده مانند https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4
در نظر بگیرید. یک پیشنمایش غنیتر میتواند به کاربران شما اطمینان دهد که چه چیزی به اشتراک گذاشته میشود.
اگر متن را پیشنمایش میکنید، میتوانید عنوان، تصویر کوچک یا هر دو را تنظیم کنید. قبل از فراخوانی Intent.createChooser()
یک توضیح به Intent.EXTRA_TITLE
اضافه کنید و یک تصویر کوچک مرتبط با استفاده از ClipData
اضافه کنید.
توجه: URI محتوای تصویر از یک FileProvider
، معمولاً از یک <cache-path>
پیکربندی شده ارائه میشود. برای اطلاعات بیشتر، به اشتراک گذاری فایل ها مراجعه کنید. مطمئن شوید که به Sharesheet مجوزهای مناسب برای خواندن هر تصویری که می خواهید به عنوان تصویر کوچک استفاده کنید، بدهید. برای اطلاعات بیشتر، Intent.FLAG_GRANT_READ_URI_PERMISSION
ببینید.
در اینجا یک مثال است:
کاتلین
val share = Intent.createChooser(Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/") // (Optional) Here you're setting the title of the content putExtra(Intent.EXTRA_TITLE, "Introducing content previews") // (Optional) Here you're passing a content URI to an image to be displayed data = contentUri flags = Intent.FLAG_GRANT_READ_URI_PERMISSION }, null) startActivity(share)
جاوا
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/"); // (Optional) Here you're setting the title of the content sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews"); // (Optional) Here you're passing a content URI to an image to be displayed sendIntent.setData(contentUri); sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Show the Sharesheet startActivity(Intent.createChooser(sendIntent, null));
پیش نمایش چیزی شبیه به این است:
اعمال سفارشی را به اشتراکگذاری اضافه کنید
در Android 14 (API Level 34) و بالاتر، برنامهها میتوانند اقدامات سفارشی را به اشتراکگذاری Android اضافه کنند. کنشهای سفارشی بهعنوان نمادهای اقدام کوچک در بالای اشتراکگذاری Android نشان داده میشوند، و برنامهها میتوانند هر Intent
بهعنوان عملی که هنگام کلیک روی نماد فراخوانی میشود، مشخص کنند.
برای افزودن کنشهای سفارشی در اشتراکگذاری Android، ابتدا یک ChooserAction
با ChooserAction.Builder
ایجاد کنید. میتوانید یک PendingIntent
بهعنوان عملی که هنگام کلیک روی نماد فراخوانی میشود، مشخص کنید. یک آرایه حاوی تمام کنشهای سفارشی خود ایجاد کنید و آن را بهعنوان EXTRA_CHOOSER_CUSTOM_ACTIONS
از Intent
اشتراکگذاری مشخص کنید.
کاتلین
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
جاوا
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
اهداف سفارشی را اضافه کنید
اشتراکگذاری Android به شما امکان میدهد حداکثر دو شی ChooserTarget
مشخص کنید که قبل از میانبرهای اشتراکگذاری و اهداف انتخابگر بارگیری شده از ChooserTargetServices
نشان داده میشوند. همچنین میتوانید حداکثر دو هدف را مشخص کنید که به فعالیتهایی اشاره میکنند که قبل از پیشنهادات برنامه فهرست شدهاند:
پس از فراخوانی Intent.createChooser()
Intent.EXTRA_CHOOSER_TARGETS
و Intent.EXTRA_INITIAL_INTENTS
را به Intent اشتراکی خود اضافه کنید:
کاتلین
val share = Intent.createChooser(myShareIntent, null).apply { putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray) putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray) }
جاوا
Intent shareIntent = Intent.createChooser(sendIntent, null); share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray); share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);
از این ویژگی با احتیاط استفاده کنید. هر Intent
و ChooserTarget
سفارشی که اضافه می کنید تعداد پیشنهادی سیستم را کاهش می دهد. ما به طور کلی از افزودن اهداف سفارشی خودداری می کنیم. یک مثال مناسب رایج از افزودن Intent.EXTRA_INITIAL_INTENTS
، ارائه اقدامات اضافی است که کاربران می توانند در مورد محتوای مشترک انجام دهند. برای مثال، یک کاربر تصاویر را به اشتراک میگذارد و Intent.EXTRA_INITIAL_INTENTS
استفاده میشود تا به او اجازه ارسال پیوند را بدهد. یک مثال مناسب رایج برای افزودن Intent.EXTRA_CHOOSER_TARGETS
نمایش افراد یا دستگاههای مرتبطی است که برنامه شما ارائه میکند.
حذف اهداف خاص بر اساس جزء
میتوانید با ارائه Intent.EXTRA_EXCLUDE_COMPONENTS
اهداف خاصی را حذف کنید. این کار را فقط برای حذف اهدافی که روی آنها کنترل دارید انجام دهید. یکی از موارد استفاده رایج این است که وقتی کاربران از داخل برنامه شما اشتراکگذاری میکنند، اهداف اشتراکگذاری برنامهتان را پنهان کنید، زیرا احتمالاً قصد آنها در خارج از برنامه شما اشتراکگذاری میشود.
پس از فراخوانی Intent.createChooser()
Intent.EXTRA_EXCLUDE_COMPONENTS
به intent خود اضافه کنید:
کاتلین
val share = Intent.createChooser(Intent(), null).apply { // Only use for components you have control over val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass")) putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames) }
جاوا
Intent shareIntent = Intent.createChooser(new Intent(), null); // Only use for components you have control over ComponentName[] excludedComponentNames = { new ComponentName("com.example.android", "ExampleClass") }; shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);
اطلاعاتی در مورد اشتراک گذاری دریافت کنید
دانستن اینکه کاربران شما چه زمانی به اشتراک می گذارند و چه هدفی را انتخاب می کنند می تواند مفید باشد. اشتراکگذاری Android به شما امکان میدهد با ارائه ComponentName
اهدافی که کاربرانتان با استفاده از IntentSender
انتخاب میکنند، این اطلاعات را دریافت کنید.
ابتدا یک PendingIntent
برای BroadcastReceiver
ایجاد کنید و IntentSender
آن را در Intent.createChooser()
عرضه کنید:
کاتلین
var share = Intent(Intent.ACTION_SEND) // ... val pi = PendingIntent.getBroadcast( myContext, requestCode, Intent(myContext, MyBroadcastReceiver::class.java), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) share = Intent.createChooser(share, null, pi.intentSender)
جاوا
Intent share = new Intent(ACTION_SEND); ... PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode, new Intent(myContext, MyBroadcastReceiver.class), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); share = Intent.createChooser(share, null, pi.getIntentSender());
پاسخ تماس را در MyBroadcastReceiver
دریافت کنید و به Intent.EXTRA_CHOSEN_COMPONENT
نگاه کنید.EXTRA_CHOSEN_COMPONENT:
کاتلین
override fun onReceive(context: Context, intent: Intent) { ... val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
جاوا
@Override public void onReceive(Context context, Intent intent) { ... ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT); }
اعمال سفارشی را به اشتراکگذاری اضافه کنید
در Android 14 (API Level 34) و بالاتر، برنامهها میتوانند اقدامات سفارشی را به اشتراکگذاری Android اضافه کنند. با ChooserAction.Builder
یک ChooserAction
ایجاد کنید. میتوانید یک PendingIntent
بهعنوان عملی که هنگام کلیک روی نماد فراخوانی میشود، مشخص کنید. یک آرایه حاوی تمام کنشهای سفارشی خود ایجاد کنید و آن را بهعنوان EXTRA_CHOOSER_CUSTOM_ACTIONS
از Intent
اشتراکگذاری مشخص کنید.
کاتلین
val sendIntent = Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, text) val shareIntent = Intent.createChooser(sendIntent, null) val customActions = arrayOf( ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT ) ).build() ) shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions) context.startActivity(shareIntent)
جاوا
Intent sendIntent = new Intent(Intent.ACTION_SEND) .setType("text.plain") .putExtra(Intent.EXTRA_TEXT, text); Intent shareIntent = Intent.createChooser(sendIntent, null); ChooserAction[] actions = new ChooserAction[]{ new ChooserAction.Builder( Icon.createWithResource(context, R.drawable.ic_custom_action), "Custom", PendingIntent.getBroadcast( context, 1, new Intent(Intent.ACTION_VIEW), PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT ) ).build() }; shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions); context.startActivity(shareIntent);
از Intent Resoler اندروید استفاده کنید
هنگام ارسال دادهها به برنامه دیگری به عنوان بخشی از یک جریان کار کاملاً تعریف شده، از حلکننده هدف Android بهترین استفاده است.
برای استفاده از Intent Recovery Android، یک intent ایجاد کنید و مانند آنچه که برای فراخوانی Sharesheet Android استفاده می کنید، موارد اضافی اضافه کنید. با این حال، Intent.createChooser()
را صدا نکنید .
اگر چندین برنامه نصب شده با فیلترهایی وجود داشته باشد که با ACTION_SEND
و نوع MIME مطابقت دارند، سیستم یک گفتگوی ابهامزدایی به نام حلکننده قصد را نمایش میدهد که به کاربر امکان میدهد هدفی را برای اشتراکگذاری انتخاب کند. اگر یک برنامه با هم مطابقت داشته باشد، اجرا می شود.
در اینجا مثالی از نحوه استفاده از Intent Resoler اندروید برای ارسال متن آورده شده است:
کاتلین
val sendIntent: Intent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, "This is my text to send.") type = "text/plain" } startActivity(sendIntent)
جاوا
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
بیشتر بدانید
برای اطلاعات بیشتر در مورد ارسال داده، به Intent و Intent Filters مراجعه کنید.