یک intent به شما امکان میدهد یک فعالیت را در یک برنامه دیگر با توصیف عملکردی که میخواهید انجام دهید، مانند "مشاهده نقشه" یا "عکس گرفتن" در یک شی Intent
، شروع کنید. به این نوع intent، intent ضمنی می گویند زیرا مؤلفه برنامه را برای شروع مشخص نمی کند، بلکه در عوض یک عمل را مشخص می کند و داده هایی را برای انجام عمل ارائه می دهد.
هنگامی که شما startActivity()
یا startActivityForResult()
را فرا می خوانید و آن را یک intent ضمنی ارسال می کنید، سیستم intent را به برنامه ای که می تواند intent را مدیریت کند حل می کند و Activity
مربوطه خود را شروع می کند. اگر بیش از یک برنامه وجود داشته باشد که بتواند هدف را مدیریت کند، سیستم به کاربر یک گفتگو ارائه می دهد تا برنامه مورد نظر را انتخاب کند.
این صفحه چندین هدف ضمنی را توصیف می کند که می توانید از آنها برای انجام اقدامات معمول استفاده کنید، که بر اساس نوع برنامه ای که هدف را مدیریت می کند، سازماندهی شده اند. هر بخش همچنین نشان می دهد که چگونه می توانید یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام عمل تبلیغ کنید.
احتیاط: اگر هیچ برنامهای در دستگاه وجود نداشته باشد که بتواند یک هدف ضمنی دریافت کند، برنامه با فراخوانی startActivity()
از کار میافتد. برای اینکه ابتدا تأیید کنید که برنامه ای برای دریافت intent وجود دارد، resolveActivity()
در شی Intent
خود فراخوانی کنید. اگر نتیجه غیر تهی باشد، حداقل یک برنامه وجود دارد که می تواند intent را مدیریت کند، و فراخوانی startActivity()
بی خطر است. اگر نتیجه صفر است، از intent استفاده نکنید و در صورت امکان، ویژگی را که intent را فراخوانی می کند غیرفعال کنید.
اگر با نحوه ایجاد intent یا فیلترهای هدف آشنا نیستید، ابتدا Intent و Intent Filters را بخوانید.
برای یادگیری نحوه فعال کردن اهداف لیست شده در این صفحه از میزبان توسعه خود، به بخش Verify intents with Android Debug Bridge مراجعه کنید.
Google Voice Actions
Google Voice Actions برخی از اهداف فهرست شده در این صفحه را در پاسخ به دستورات صوتی فعال می کند. برای اطلاعات بیشتر، شروع به کار با عملکردهای صوتی سیستم را ببینید.
ساعت زنگ دار
اقدامات زیر برای برنامه های ساعت زنگ دار، شامل اطلاعاتی است که برای ایجاد یک فیلتر هدف برای تبلیغ توانایی برنامه خود برای انجام هر عمل به آن نیاز دارید.
ایجاد زنگ هشدار
برای ایجاد زنگ هشدار جدید، از عملکرد ACTION_SET_ALARM
استفاده کنید و جزئیات زنگ هشدار مانند زمان و پیام را با استفاده از موارد اضافی زیر مشخص کنید.
توجه: فقط ساعت، دقیقه و پیام اضافی در Android نسخه 2.3 (سطح API 9) و پایینتر موجود است. سایر موارد اضافی در نسخه های بالاتر این پلت فرم موجود است.
- اقدام
-
ACTION_SET_ALARM
- URI داده
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
EXTRA_HOUR
- ساعت زنگ هشدار
-
EXTRA_MINUTES
- دقیقه برای زنگ.
-
EXTRA_MESSAGE
- یک پیام سفارشی برای شناسایی زنگ.
-
EXTRA_DAYS
-
ArrayList
شامل هر روز هفته که در آن زنگ هشدار تکرار می شود. هر روز باید با یک عدد صحیح از کلاسCalendar
مانندMONDAY
اعلان شود.برای یک زنگ هشدار یک بار، این اضافی را مشخص نکنید.
-
EXTRA_RINGTONE
- یک
content:
URI که آهنگ زنگی را برای استفاده با زنگ هشدار مشخص میکند، یاVALUE_RINGTONE_SILENT
بدون آهنگ زنگ.برای استفاده از آهنگ زنگ پیش فرض، این مورد اضافی را مشخص نکنید.
-
EXTRA_VIBRATE
- یک بولی که مشخص می کند آیا برای این زنگ لرزش باید انجام شود یا خیر.
-
EXTRA_SKIP_UI
- یک بولی که مشخص میکند آیا برنامه پاسخدهنده باید هنگام تنظیم زنگ، از رابط کاربری خود صرف نظر کند یا خیر. اگر درست باشد، برنامه باید هر رابط کاربری تأیید را دور بزند و زنگ هشدار مشخص شده را تنظیم کند.
-
قصد مثال:
کاتلین
fun createAlarm(message: String, hour: Int, minutes: Int) { val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_HOUR, hour) putExtra(AlarmClock.EXTRA_MINUTES, minutes) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void createAlarm(String message, int hour, int minutes) { Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_HOUR, hour) .putExtra(AlarmClock.EXTRA_MINUTES, minutes); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
برای فراخوانی هدف ACTION_SET_ALARM
، برنامه شما باید مجوز SET_ALARM
را داشته باشد:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
یک تایمر ایجاد کنید
برای ایجاد یک تایمر شمارش معکوس، از عملکرد ACTION_SET_TIMER
استفاده کنید و جزئیات تایمر مانند مدت زمان را با استفاده از موارد اضافی زیر مشخص کنید.
توجه: این هدف در اندروید 4.4 (سطح API 19) و بالاتر موجود است.
- اقدام
-
ACTION_SET_TIMER
- URI داده
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
EXTRA_LENGTH
- طول تایمر بر حسب ثانیه
-
EXTRA_MESSAGE
- یک پیام سفارشی برای شناسایی تایمر.
-
EXTRA_SKIP_UI
- یک بولی که مشخص می کند آیا برنامه پاسخ دهنده باید هنگام تنظیم تایمر از رابط کاربری خود صرف نظر کند یا خیر. اگر درست باشد، برنامه باید هر رابط کاربری تأیید را دور بزند و تایمر مشخص شده را شروع کند.
-
قصد مثال:
کاتلین
fun startTimer(message: String, seconds: Int) { val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_LENGTH, seconds) putExtra(AlarmClock.EXTRA_SKIP_UI, true) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void startTimer(String message, int seconds) { Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
برای فراخوانی هدف ACTION_SET_TIMER
، برنامه شما باید مجوز SET_ALARM
را داشته باشد:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
نمایش همه آلارم ها
برای نمایش لیست هشدارها، از عملکرد ACTION_SHOW_ALARMS
استفاده کنید.
اگرچه بسیاری از برنامهها این هدف را احضار نمیکنند، زیرا عمدتاً توسط برنامههای سیستم استفاده میشود، هر برنامهای که به عنوان ساعت زنگ دار عمل میکند میتواند این فیلتر هدف را پیادهسازی کند و با نمایش لیست هشدارهای فعلی پاسخ دهد.
توجه: این هدف در اندروید 4.4 (سطح API 19) و بالاتر موجود است.
- اقدام
-
ACTION_SHOW_ALARMS
- URI داده
- هیچ کدام
- نوع MIME
- هیچ کدام
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
تقویم
افزودن رویداد یک اقدام رایج برای برنامههای تقویم است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک رویداد تقویم اضافه کنید
برای افزودن یک رویداد جدید به تقویم کاربر، از عملکرد ACTION_INSERT
استفاده کنید و URI داده را با استفاده از Events.CONTENT_URI
مشخص کنید.CONTENT_URI . سپس می توانید جزئیات رویدادهای مختلف را با استفاده از موارد اضافی زیر مشخص کنید.
- اقدام
-
ACTION_INSERT
- URI داده
-
Events.CONTENT_URI
- نوع MIME
-
"vnd.android.cursor.dir/event"
- موارد اضافی
-
EXTRA_EVENT_ALL_DAY
- یک بولی که مشخص می کند آیا این یک رویداد تمام روز است یا خیر.
-
EXTRA_EVENT_BEGIN_TIME
- زمان شروع رویداد (میلی ثانیه از زمان).
-
EXTRA_EVENT_END_TIME
- زمان پایان رویداد (میلی ثانیه از زمان).
-
TITLE
- عنوان رویداد.
-
DESCRIPTION
- شرح رویداد.
-
EVENT_LOCATION
- مکان رویداد.
-
EXTRA_EMAIL
- فهرستی از آدرسهای ایمیل جدا شده با کاما که دعوتشدگان را مشخص میکند.
بسیاری از جزئیات رویداد را می توان با استفاده از ثابت های تعریف شده در کلاس
CalendarContract.EventsColumns
مشخص کرد.-
قصد مثال:
کاتلین
fun addEvent(title: String, location: String, begin: Long, end: Long) { val intent = Intent(Intent.ACTION_INSERT).apply { data = Events.CONTENT_URI putExtra(Events.TITLE, title) putExtra(Events.EVENT_LOCATION, location) putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void addEvent(String title, String location, long begin, long end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.INSERT" /> <data android:mimeType="vnd.android.cursor.dir/event" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
دوربین
اقدامات زیر برای برنامههای دوربین، شامل اطلاعاتی است که برای ایجاد یک فیلتر قصد برای تبلیغ توانایی برنامهتان برای انجام هر عمل نیاز دارید.
یک عکس یا ویدیو بگیرید و آن را برگردانید
برای باز کردن یک برنامه دوربین و دریافت عکس یا ویدیوی حاصل، از عملکرد ACTION_IMAGE_CAPTURE
یا ACTION_VIDEO_CAPTURE
استفاده کنید. همچنین مکان URI را که میخواهید دوربین عکس یا ویدیو را در آن ذخیره کند، در EXTRA_OUTPUT
اضافه کنید.
- اقدام
-
ACTION_IMAGE_CAPTURE
یا
ACTION_VIDEO_CAPTURE
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
EXTRA_OUTPUT
- مکان URI که در آن برنامه دوربین فایل عکس یا ویدیو را (به عنوان یک شی
Uri
) ذخیره می کند.
-
هنگامی که برنامه دوربین با موفقیت فوکوس را به فعالیت شما برمی گرداند - به عبارت دیگر، برنامه شما پاسخ تماس onActivityResult()
دریافت می کند - می توانید در URI که با مقدار EXTRA_OUTPUT
مشخص کرده اید به عکس یا ویدیو دسترسی داشته باشید.
توجه: هنگامی که از ACTION_IMAGE_CAPTURE
برای گرفتن عکس استفاده میکنید، دوربین ممکن است یک کپی کوچک یا تصویر کوچک از عکس را در نتیجه Intent
که بهعنوان Bitmap
در یک فیلد اضافی به نام "data"
ذخیره شده است، برگرداند.
قصد مثال:
کاتلین
const val REQUEST_IMAGE_CAPTURE = 1 val locationForPhotos: Uri = ... fun capturePhoto(targetFilename: String) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)) } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") // Do other work with full size photo saved in locationForPhotos. ... } }
جاوا
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri locationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelableExtra("data"); // Do other work with full size photo saved in locationForPhotos. ... } }
برای انجام این کار هنگام کار بر روی Android 12 (سطح API 31) یا بالاتر، به مثال intent زیر مراجعه کنید.
قصد مثال:
کاتلین
val REQUEST_IMAGE_CAPTURE = 1 private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
جاوا
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } catch (ActivityNotFoundException e) { // Display error state to the user. } } </section></div>
برای اطلاعات بیشتر درباره نحوه استفاده از این هدف برای گرفتن عکس، از جمله نحوه ایجاد یک Uri
مناسب برای مکان خروجی، عکس گرفتن یا فیلم گرفتن را بخوانید.
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
هنگام مدیریت این intent، از فعالیت خود بخواهید EXTRA_OUTPUT
اضافی را در Intent
دریافتی بررسی کند، سپس تصویر یا ویدیوی گرفته شده را در مکان مشخص شده توسط آن اضافی ذخیره کنید و setResult()
با یک Intent
فراخوانی کنید که شامل یک تصویر کوچک فشرده شده با نام اضافی است "data"
.
یک برنامه دوربین را در حالت تصویر ثابت راه اندازی کنید
برای باز کردن یک برنامه دوربین در حالت تصویر ثابت، از عملکرد INTENT_ACTION_STILL_IMAGE_CAMERA
استفاده کنید.
- اقدام
-
INTENT_ACTION_STILL_IMAGE_CAMERA
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
- هیچ کدام
قصد مثال:
کاتلین
private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
جاوا
public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
یک برنامه دوربین را در حالت فیلم راه اندازی کنید
برای باز کردن یک برنامه دوربین در حالت ویدیو، از عملکرد INTENT_ACTION_VIDEO_CAMERA
استفاده کنید.
- اقدام
-
INTENT_ACTION_VIDEO_CAMERA
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
- هیچ کدام
قصد مثال:
کاتلین
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
جاوا
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
برنامه مخاطبین/افراد
اقدامات زیر برای برنامههای مدیریت مخاطبین، شامل اطلاعاتی است که برای ایجاد یک فیلتر هدف برای تبلیغ توانایی برنامهتان برای انجام هر عمل به آن نیاز دارید.
یک مخاطب را انتخاب کنید
برای اینکه کاربر یک مخاطب را انتخاب کند و برنامه شما به همه اطلاعات تماس دسترسی داشته باشد، از عملکرد ACTION_PICK
استفاده کنید و نوع MIME را در Contacts.CONTENT_TYPE
مشخص کنید.CONTENT_TYPE .
نتیجه Intent
تحویل داده شده به callback onActivityResult()
شما حاوی این content:
URI که به مخاطب انتخاب شده اشاره می کند. این پاسخ به برنامه شما اجازه موقت میدهد تا آن مخاطب را با استفاده از Contacts Provider API بخواند، حتی اگر برنامه شما شامل مجوز READ_CONTACTS
نباشد.
نکته: اگر فقط به یک بخش خاص از اطلاعات تماس مانند شماره تلفن یا آدرس ایمیل نیاز دارید، در عوض به بخش بعدی درباره نحوه انتخاب دادههای مخاطب خاص مراجعه کنید.
- اقدام
-
ACTION_PICK
- طرح داده URI
- هیچ کدام
- نوع MIME
-
Contacts.CONTENT_TYPE
قصد مثال:
کاتلین
const val REQUEST_SELECT_CONTACT = 1 fun selectContact() { val intent = Intent(Intent.ACTION_PICK).apply { type = ContactsContract.Contacts.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { val contactUri: Uri = data.data // Do something with the selected contact at contactUri. //... } }
جاوا
static final int REQUEST_SELECT_CONTACT = 1; public void selectContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); // Do something with the selected contact at contactUri. ... } }
برای کسب اطلاعات در مورد نحوه بازیابی اطلاعات تماس پس از داشتن URI مخاطب، بازیابی جزئیات مخاطب را بخوانید.
وقتی URI مخاطب را با استفاده از این هدف بازیابی میکنید، معمولاً برای خواندن جزئیات اصلی آن مخاطب، مانند نام نمایشی و ستارهدار بودن مخاطب، به مجوز READ_CONTACTS
نیاز ندارید. با این حال، اگر میخواهید دادههای خاصتری را درباره یک مخاطب خاص بخوانید - مانند شماره تلفن یا آدرس ایمیل آنها - به مجوز READ_CONTACTS
نیاز دارید.
داده های تماس خاص را انتخاب کنید
برای اینکه کاربر اطلاعات خاصی را از یک مخاطب انتخاب کند، مانند شماره تلفن، آدرس ایمیل، یا نوع داده دیگر، از عملکرد ACTION_PICK
استفاده کنید و نوع MIME را برای یکی از انواع محتوای زیر، مانند CommonDataKinds.Phone.CONTENT_TYPE
مشخص کنید. برای دریافت شماره تلفن مخاطب، CommonDataKinds.Phone.CONTENT_TYPE
.
توجه: در بسیاری از موارد، برنامه شما نیاز به مجوز READ_CONTACTS
برای مشاهده اطلاعات خاص در مورد یک مخاطب خاص دارد.
اگر نیاز به بازیابی تنها یک نوع داده از یک مخاطب دارید، این تکنیک با یک CONTENT_TYPE
از کلاس های ContactsContract.CommonDataKinds
کارآمدتر از استفاده از Contacts.CONTENT_TYPE
است، همانطور که در بخش قبل نشان داده شده است. نتیجه به شما امکان دسترسی مستقیم به داده های مورد نظر را بدون نیاز به انجام یک پرس و جو پیچیده تر به Contacts Provider می دهد.
نتیجه Intent
تحویل داده شده به پاسخ تماس onActivityResult()
شما حاوی این content:
URI که به داده های مخاطب انتخاب شده اشاره می کند. این پاسخ به برنامه شما مجوزهای موقت برای خواندن اطلاعات تماس می دهد حتی اگر برنامه شما شامل مجوز READ_CONTACTS
نباشد.
- اقدام
-
ACTION_PICK
- طرح داده URI
- هیچ کدام
- نوع MIME
-
CommonDataKinds.Phone.CONTENT_TYPE
- از مخاطبین دارای شماره تلفن انتخاب کنید.
-
CommonDataKinds.Email.CONTENT_TYPE
- از مخاطبین دارای آدرس ایمیل انتخاب کنید.
-
CommonDataKinds.StructuredPostal.CONTENT_TYPE
- از مخاطبین دارای آدرس پستی انتخاب کنید.
یا یکی از بسیاری از مقادیر
CONTENT_TYPE
دیگر تحتContactsContract
.-
قصد مثال:
کاتلین
const val REQUEST_SELECT_PHONE_NUMBER = 1 fun selectContact() { // Start an activity for the user to pick a phone number from contacts. val intent = Intent(Intent.ACTION_PICK).apply { type = CommonDataKinds.Phone.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) { // Get the URI and query the content provider for the phone number. val contactUri: Uri = data.data val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER) contentResolver.query(contactUri, projection, null, null, null).use { cursor -> // If the cursor returned is valid, get the phone number. if (cursor.moveToFirst()) { val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER) val number = cursor.getString(numberIndex) // Do something with the phone number. ... } } } }
جاوا
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // Start an activity for the user to pick a phone number from contacts. Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { // Get the URI and query the content provider for the phone number. Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // If the cursor returned is valid, get the phone number. if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // Do something with the phone number. //... } } }
مشاهده یک مخاطب
برای نمایش جزئیات یک مخاطب شناخته شده، از عملکرد ACTION_VIEW
استفاده کنید و مخاطب را با یک content:
URI به عنوان داده هدف.
دو راه اصلی برای بازیابی اولیه URI مخاطب وجود دارد:
- از URI تماسی که با عملکرد
ACTION_PICK
نشان داده شده در بخش قبل بازگردانده شده است استفاده کنید. این رویکرد به هیچ گونه مجوز برنامه نیاز ندارد. - همانطور که در بازیابی لیست مخاطبین توضیح داده شده است، مستقیماً به لیست همه مخاطبین دسترسی داشته باشید. این رویکرد به مجوز
READ_CONTACTS
نیاز دارد.
- اقدام
-
ACTION_VIEW
- طرح داده URI
-
content:<URI>
- نوع MIME
- هیچ کدام نوع از URI تماس استنباط می شود.
قصد مثال:
کاتلین
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
یک مخاطب موجود را ویرایش کنید
برای ویرایش یک مخاطب شناخته شده، از عمل ACTION_EDIT
استفاده کنید، مخاطب را با یک content:
URI به عنوان داده هدف، و هر گونه اطلاعات تماس شناخته شده را در موارد اضافی مشخص شده توسط ثابت ها در ContactsContract.Intents.Insert
قرار دهید.
دو راه اصلی برای بازیابی اولیه URI مخاطب وجود دارد:
- از URI تماسی که با عملکرد
ACTION_PICK
نشان داده شده در بخش قبل بازگردانده شده است استفاده کنید. این رویکرد به هیچ گونه مجوز برنامه نیاز ندارد. - همانطور که در بازیابی لیست مخاطبین توضیح داده شده است، مستقیماً به لیست همه مخاطبین دسترسی داشته باشید. این رویکرد به مجوز
READ_CONTACTS
نیاز دارد.
- اقدام
-
ACTION_EDIT
- طرح داده URI
-
content:<URI>
- نوع MIME
- نوع از URI تماس استنباط می شود.
- موارد اضافی
- یک یا چند مورد اضافی تعریف شده در
ContactsContract.Intents.Insert
تا بتوانید فیلدهای جزئیات تماس را پر کنید.
قصد مثال:
کاتلین
fun editContact(contactUri: Uri, email: String) { val intent = Intent(Intent.ACTION_EDIT).apply { data = contactUri putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void editContact(Uri contactUri, String email) { Intent intent = new Intent(Intent.ACTION_EDIT); intent.setData(contactUri); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
برای اطلاعات بیشتر در مورد نحوه ویرایش مخاطب، اصلاح مخاطبین با استفاده از intent ها را بخوانید.
درج یک مخاطب
برای درج یک مخاطب جدید، از عملکرد ACTION_INSERT
استفاده کنید، Contacts.CONTENT_TYPE
به عنوان نوع MIME مشخص کنید، و هر گونه اطلاعات تماس شناخته شده را در موارد اضافی مشخص شده توسط ثابت ها در ContactsContract.Intents.Insert
قرار دهید.
- اقدام
-
ACTION_INSERT
- طرح داده URI
- هیچ کدام
- نوع MIME
-
Contacts.CONTENT_TYPE
- موارد اضافی
- یک یا چند مورد اضافی تعریف شده در
ContactsContract.Intents.Insert
.
قصد مثال:
کاتلین
fun insertContact(name: String, email: String) { val intent = Intent(Intent.ACTION_INSERT).apply { type = ContactsContract.Contacts.CONTENT_TYPE putExtra(ContactsContract.Intents.Insert.NAME, name) putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void insertContact(String name, String email) { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(Contacts.CONTENT_TYPE); intent.putExtra(Intents.Insert.NAME, name); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
برای اطلاعات بیشتر در مورد نحوه درج یک مخاطب، اصلاح مخاطبین با استفاده از intent ها را بخوانید.
ایمیل
نوشتن ایمیل با پیوست های اختیاری یک اقدام رایج برای برنامه های ایمیل است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک ایمیل با پیوست های اختیاری بنویسید
برای نوشتن ایمیل، از یکی از اقدامات زیر بر اساس اینکه آیا پیوستها را اضافه میکنید یا خیر، استفاده کنید و جزئیات ایمیل مانند گیرنده و موضوع را با استفاده از کلیدهای اضافی فهرست شده درج کنید.
- اقدام
-
ACTION_SENDTO
(بدون پیوست) یا
ACTION_SEND
(برای یک پیوست) یا
ACTION_SEND_MULTIPLE
(برای چندین پیوست) - طرح داده URI
- هیچ کدام
- نوع MIME
-
"text/plain"
"*/*"
-
- موارد اضافی
-
Intent.EXTRA_EMAIL
- یک آرایه رشته ای از تمام آدرس های ایمیل گیرنده "به".
-
Intent.EXTRA_CC
- یک آرایه رشته ای از تمام آدرس های ایمیل گیرنده "CC".
-
Intent.EXTRA_BCC
- یک آرایه رشته ای از تمام آدرس های ایمیل گیرنده "BCC".
-
Intent.EXTRA_SUBJECT
- یک رشته با موضوع ایمیل.
-
Intent.EXTRA_TEXT
- یک رشته با متن ایمیل.
-
Intent.EXTRA_STREAM
-
Uri
که به پیوست اشاره می کند. اگر از عملکردACTION_SEND_MULTIPLE
استفاده می کنید، در عوض یکArrayList
حاوی چندین شیUri
است.
-
قصد مثال:
کاتلین
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "*/*" putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
اگر میخواهید مطمئن شوید که هدف شما فقط توسط یک برنامه ایمیل مدیریت میشود و نه یک برنامه پیامک یا برنامه اجتماعی، از عملکرد ACTION_SENDTO
استفاده کنید و طرح داده "mailto:"
را همانطور که در مثال زیر نشان داده شده است وارد کنید:
کاتلین
fun composeEmail(addresses: Array<String>, subject: String) { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") // Only email apps handle this. putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // Only email apps handle this. intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
ذخیره سازی فایل
اقدامات زیر برای برنامههای ذخیرهسازی فایل، شامل اطلاعاتی است که برای ایجاد یک فیلتر قصد برای تبلیغ توانایی برنامهتان برای انجام هر عمل نیاز دارید.
نوع خاصی از فایل را بازیابی کنید
برای درخواست از کاربر که فایلی مانند سند یا عکس را انتخاب کند و مرجعی را به برنامه شما بازگرداند، از عملکرد ACTION_GET_CONTENT
استفاده کنید و نوع MIME مورد نظر خود را مشخص کنید. مرجع فایلی که به برنامه شما بازگردانده می شود برای چرخه حیات فعلی فعالیت شما گذرا است، بنابراین اگر می خواهید بعداً به آن دسترسی پیدا کنید، باید یک نسخه را وارد کنید که بتوانید بعداً بخوانید.
این هدف همچنین به کاربر اجازه می دهد تا یک فایل جدید در فرآیند ایجاد کند. به عنوان مثال، به جای انتخاب یک عکس موجود، کاربر می تواند یک عکس جدید با دوربین بگیرد.
هدف نتیجه تحویل داده شده به متد onActivityResult()
شما شامل داده هایی با یک URI است که به فایل اشاره می کند. URI می تواند هر چیزی باشد، مانند http:
URI، file:
URI، یا content:
URI. با این حال، اگر میخواهید فایلهای قابل انتخاب را فقط به آنهایی محدود کنید که از یک ارائهدهنده محتوا در دسترس هستند (یک content:
URI) و بهعنوان یک جریان فایل با openFileDescriptor()
در دسترس هستند، دسته CATEGORY_OPENABLE
را به هدف خود اضافه کنید.
در Android نسخه 4.3 (سطح API 18) و بالاتر، میتوانید با افزودن EXTRA_ALLOW_MULTIPLE
به intent که روی true
تنظیم شده است، به کاربر اجازه دهید چندین فایل را انتخاب کند. سپس می توانید به هر یک از فایل های انتخاب شده در یک شی ClipData
که توسط getClipData()
برگردانده شده است دسترسی داشته باشید.
- اقدام
-
ACTION_GET_CONTENT
- طرح داده URI
- هیچ کدام
- نوع MIME
- نوع MIME مربوط به نوع فایلی است که کاربر باید انتخاب کند.
- موارد اضافی
-
EXTRA_ALLOW_MULTIPLE
- یک بولین که اعلام می کند آیا کاربر می تواند همزمان بیش از یک فایل را انتخاب کند یا خیر.
-
EXTRA_LOCAL_ONLY
- یک بولی که اعلام می کند آیا فایل برگشتی باید مستقیماً از دستگاه در دسترس باشد، نه اینکه نیاز به دانلود از یک سرویس راه دور داشته باشد.
-
- دسته (اختیاری)
-
CATEGORY_OPENABLE
- برای برگرداندن فقط فایلهای «باز شدنی» که میتوانند به عنوان جریان فایل با
openFileDescriptor()
نمایش داده شوند.
-
نمونه ای از قصد گرفتن عکس:
کاتلین
const val REQUEST_IMAGE_GET = 1 fun selectImage() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") val fullPhotoUri: Uri = data.data // Do work with photo saved at fullPhotoUri. ... } }
جاوا
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri. ... } }
فیلتر قصد مثال برای برگرداندن عکس:
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
. --> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
نوع خاصی از فایل را باز کنید
به جای بازیابی یک کپی از فایلی که باید به برنامه خود وارد کنید، با استفاده از عملکرد ACTION_GET_CONTENT
، هنگام اجرا در Android نسخه 4.4 یا بالاتر، میتوانید با استفاده از عمل ACTION_OPEN_DOCUMENT
و مشخص کردن یک فایل درخواست باز کردن فایلی را که توسط برنامه دیگری مدیریت میشود نوع MIME همچنین برای اینکه به کاربر اجازه دهید سند جدیدی ایجاد کند که برنامه شما بتواند در آن بنویسد، به جای آن از عملکرد ACTION_CREATE_DOCUMENT
استفاده کنید.
به عنوان مثال، به جای انتخاب از اسناد PDF موجود، هدف ACTION_CREATE_DOCUMENT
به کاربران این امکان را می دهد تا جایی را که می خواهند یک سند جدید ایجاد کنند، مثلاً در برنامه دیگری که ذخیره سازی سند را مدیریت می کند، انتخاب کنند. سپس برنامه شما مکان URI را دریافت می کند که در آن می تواند سند جدید را بنویسد.
در حالی که intent تحویل داده شده به متد onActivityResult()
شما از عملکرد ACTION_GET_CONTENT
ممکن است یک URI از هر نوع را برگرداند، هدف نتیجه از ACTION_OPEN_DOCUMENT
و ACTION_CREATE_DOCUMENT
همیشه فایل انتخابی را به عنوان یک content:
URI که توسط یک DocumentsProvider
پشتیبانی می شود. میتوانید فایل را با openFileDescriptor()
باز کنید و جزئیات آن را با استفاده از ستونهایی از DocumentsContract.Document
جستجو کنید.
URI برگردانده شده به برنامه شما دسترسی خواندن طولانی مدت به فایل را می دهد، همچنین احتمالاً با دسترسی نوشتن. عمل ACTION_OPEN_DOCUMENT
مخصوصاً زمانی مفید است که میخواهید یک فایل موجود را بدون کپی کردن در برنامه خود بخوانید یا زمانی که میخواهید فایلی را در محل باز کرده و ویرایش کنید.
همچنین میتوانید با افزودن EXTRA_ALLOW_MULTIPLE
به intent، که روی true
تنظیم شده است، به کاربر اجازه دهید چندین فایل را انتخاب کند. اگر کاربر فقط یک آیتم را انتخاب کند، می توانید مورد را از getData()
بازیابی کنید. اگر کاربر بیش از یک آیتم را انتخاب کند، getData()
null را برمی گرداند و در عوض باید هر آیتم را از یک شی ClipData
که توسط getClipData()
برگردانده شده است بازیابی کنید.
توجه: هدف شما باید یک نوع MIME را مشخص کند و باید دسته CATEGORY_OPENABLE
را اعلام کند. در صورت لزوم، میتوانید با افزودن آرایهای از انواع MIME به همراه EXTRA_MIME_TYPES
بیش از یک نوع MIME را مشخص کنید—اگر این کار را انجام دهید، باید نوع MIME اصلی را در setType()
روی "*/*"
تنظیم کنید.
- اقدام
-
ACTION_OPEN_DOCUMENT
یا
ACTION_CREATE_DOCUMENT
- طرح داده URI
- هیچ کدام
- نوع MIME
- نوع MIME مربوط به نوع فایلی است که کاربر باید انتخاب کند.
- موارد اضافی
-
EXTRA_MIME_TYPES
- آرایه ای از انواع MIME مطابق با انواع فایل هایی که برنامه شما درخواست می کند. وقتی از این اضافی استفاده می کنید، باید نوع MIME اولیه را در
setType()
روی"*/*"
تنظیم کنید. -
EXTRA_ALLOW_MULTIPLE
- یک بولین که اعلام می کند آیا کاربر می تواند همزمان بیش از یک فایل را انتخاب کند یا خیر.
-
EXTRA_TITLE
- برای استفاده با
ACTION_CREATE_DOCUMENT
برای تعیین نام فایل اولیه. -
EXTRA_LOCAL_ONLY
- یک بولی که اعلام می کند آیا فایل برگشتی باید مستقیماً از دستگاه در دسترس باشد، نه اینکه نیاز به دانلود از یک سرویس راه دور داشته باشد.
-
- دسته بندی
-
CATEGORY_OPENABLE
- برای برگرداندن فقط فایلهای «باز شدنی» که میتوانند به عنوان جریان فایل با
openFileDescriptor()
نمایش داده شوند.
-
نمونه ای از قصد گرفتن عکس:
کاتلین
const val REQUEST_IMAGE_OPEN = 1 fun selectImage2() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) { val fullPhotoUri: Uri = data.data // Do work with full size photo saved at fullPhotoUri. ... } }
جاوا
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri. ... } }
برنامه های شخص ثالث نمی توانند با عملکرد ACTION_OPEN_DOCUMENT
به یک هدف پاسخ دهند. در عوض، سیستم این هدف را دریافت می کند و تمام فایل های موجود از برنامه های مختلف را در یک رابط کاربری یکپارچه نمایش می دهد.
برای ارائه فایلهای برنامه خود در این رابط کاربری و اجازه دادن به سایر برنامهها برای باز کردن آنها، باید یک DocumentsProvider
پیادهسازی کنید و یک فیلتر هدف برای PROVIDER_INTERFACE
( "android.content.action.DOCUMENTS_PROVIDER"
)، همانطور که در مثال زیر نشان داده شده است قرار دهید:
<provider ... android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider>
برای اطلاعات بیشتر درباره نحوه باز کردن فایلهای مدیریت شده توسط برنامهتان از سایر برنامهها، باز کردن فایلها با استفاده از چارچوب دسترسی به فضای ذخیرهسازی را بخوانید.
اقدامات محلی
تماس با ماشین یک اقدام محلی رایج است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
به ماشین زنگ بزن
برای تماس با تاکسی، از عملکرد ACTION_RESERVE_TAXI_RESERVATION
استفاده کنید.
توجه: برنامه ها قبل از انجام این عمل باید از کاربر تأییدیه بخواهند.
- اقدام
-
ACTION_RESERVE_TAXI_RESERVATION
- URI داده
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
- هیچ کدام
قصد مثال:
کاتلین
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
نقشه ها
نمایش یک مکان روی نقشه یک اقدام رایج برای برنامه های نقشه است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک مکان را روی نقشه نشان دهید
برای باز کردن نقشه، از عمل ACTION_VIEW
استفاده کنید و اطلاعات مکان را در دادههای هدف با یکی از طرحهای زیر مشخص کنید.
- اقدام
-
ACTION_VIEW
- طرح داده URI
-
geo: latitude , longitude
- نقشه را در طول و عرض جغرافیایی داده شده نشان دهید.
مثال:
"geo:47.6,-122.3"
-
geo: latitude , longitude ?z= zoom
- نقشه را در طول و عرض جغرافیایی داده شده در سطح بزرگنمایی مشخص نشان دهید. سطح زوم 1 کل زمین را با مرکز lat داده شده، lng نشان می دهد. بالاترین (نزدیک ترین) سطح زوم 23 است.
مثال:
"geo:47.6,-122.3?z=11"
-
geo:0,0?q=lat,lng(label)
- نقشه را در طول و عرض جغرافیایی داده شده با یک برچسب رشته نشان دهید.
مثال:
"geo:0,0?q=34.99,-106.61(Treasure)"
-
geo:0,0?q=my+street+address
- مکان «آدرس خیابان من» را نشان دهید، که میتواند یک آدرس خاص یا جستجوی مکان باشد.
مثال:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
توجه: تمام رشته های ارسال شده در URI
geo
باید کدگذاری شوند. به عنوان مثال، رشته1st & Pike, Seattle
تبدیل به1st%20%26%20Pike%2C%20Seattle
می شود. فاصله ها در رشته با%20
کدگذاری می شوند یا با علامت مثبت (+
) جایگزین می شوند.
-
- نوع MIME
- هیچ کدام
قصد مثال:
کاتلین
fun showMap(geoLocation: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = geoLocation } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void showMap(Uri geoLocation) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(geoLocation); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
موسیقی یا ویدیو
اقدامات زیر برای برنامههای موسیقی و ویدیو، شامل اطلاعاتی است که برای ایجاد یک فیلتر هدف برای تبلیغ توانایی برنامهتان برای انجام هر عمل به آن نیاز دارید.
پخش یک فایل رسانه ای
برای پخش یک فایل موسیقی، از عمل ACTION_VIEW
استفاده کنید و مکان URI فایل را در دادههای intent مشخص کنید.
- اقدام
-
ACTION_VIEW
- طرح داده URI
-
file: <URI>
content: <URI>
http: <URL>
-
- نوع MIME
-
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
- یا هر مورد دیگری که برنامه شما نیاز دارد.
-
قصد مثال:
کاتلین
fun playMedia(file: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = file } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void playMedia(Uri file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(file); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:type="audio/*" /> <data android:type="application/ogg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
پخش موسیقی بر اساس درخواست جستجو
برای پخش موسیقی بر اساس یک عبارت جستجو، از هدف INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
استفاده کنید. یک برنامه ممکن است این هدف را در پاسخ به فرمان صوتی کاربر برای پخش موسیقی اجرا کند. برنامه دریافت کننده برای این هدف، جستجویی را در موجودی خود انجام می دهد تا محتوای موجود را با درخواست داده شده مطابقت دهد و شروع به پخش آن محتوا می کند.
در این هدف، رشته اضافی EXTRA_MEDIA_FOCUS
را اضافه کنید، که حالت جستجوی مورد نظر را مشخص می کند. به عنوان مثال، حالت جستجو می تواند تعیین کند که آیا جستجو برای نام هنرمند یا نام آهنگ باشد.
- اقدام
-
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
MediaStore.EXTRA_MEDIA_FOCUS
(الزامی) حالت جستجو را نشان می دهد: آیا کاربر به دنبال هنرمند، آلبوم، آهنگ یا لیست پخش خاصی است. بیشتر حالتهای جستجو موارد اضافی اضافی را میطلبند. به عنوان مثال، اگر کاربر علاقه مند به گوش دادن به یک آهنگ خاص باشد، این هدف ممکن است دارای سه ویژگی اضافی باشد: عنوان آهنگ، هنرمند و آلبوم. این هدف از حالت های جستجوی زیر برای هر مقدار
EXTRA_MEDIA_FOCUS
پشتیبانی می کند:هر -
"vnd.android.cursor.item/*"
هر موسیقی را پخش کنید. برنامه دریافت کننده برخی از موسیقی ها را بر اساس یک انتخاب هوشمندانه پخش می کند، مانند آخرین لیست پخشی که کاربر به آن گوش داده است.
موارد اضافی:
-
QUERY
(الزامی): یک رشته خالی. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
بدون ساختار -
"vnd.android.cursor.item/*"
یک آهنگ، آلبوم یا ژانر خاص را از یک عبارت جستجوی بدون ساختار پخش کنید. وقتی برنامهها نمیتوانند نوع محتوایی را که کاربر میخواهد به آن گوش دهد را شناسایی کنند، میتوانند با این حالت جستجو یک هدف تولید کنند. در صورت امکان از حالت های جستجوی خاص تر استفاده کنید.
موارد اضافی:
-
QUERY
(الزامی): رشتهای که حاوی ترکیبی از هنرمند، آلبوم، نام آهنگ یا ژانر است.
-
پخش موسیقی از یک سبک خاص.
موارد اضافی:
-
"android.intent.extra.genre"
(الزامی) - ژانر. -
QUERY
(الزامی): ژانر. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
هنرمند -
Audio.Artists.ENTRY_CONTENT_TYPE
پخش موسیقی از یک هنرمند خاص.
موارد اضافی:
-
EXTRA_MEDIA_ARTIST
(الزامی): هنرمند. -
"android.intent.extra.genre"
: ژانر. -
QUERY
(الزامی): رشته ای که حاوی هر ترکیبی از هنرمند یا ژانر است. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
آلبوم -
Audio.Albums.ENTRY_CONTENT_TYPE
پخش موسیقی از یک آلبوم خاص.
موارد اضافی:
-
EXTRA_MEDIA_ALBUM
(الزامی): آلبوم. -
EXTRA_MEDIA_ARTIST
: هنرمند. -
"android.intent.extra.genre"
: ژانر. -
QUERY
(الزامی): رشته ای که حاوی هر ترکیبی از آلبوم یا هنرمند است. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
آهنگ -
"vnd.android.cursor.item/audio"
آهنگ خاصی را پخش کنید.
موارد اضافی:
-
EXTRA_MEDIA_ALBUM
: آلبوم. -
EXTRA_MEDIA_ARTIST
: هنرمند. -
"android.intent.extra.genre"
: ژانر. -
EXTRA_MEDIA_TITLE
(الزامی): نام آهنگ. -
QUERY
(الزامی): رشته ای که حاوی هر ترکیبی از آلبوم، هنرمند، ژانر یا عنوان است. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
لیست پخش -
Audio.Playlists.ENTRY_CONTENT_TYPE
یک لیست پخش خاص یا یک لیست پخش را پخش کنید که با برخی از معیارهای مشخص شده توسط موارد اضافی مطابقت دارد.
موارد اضافی:
-
EXTRA_MEDIA_ALBUM
: آلبوم. -
EXTRA_MEDIA_ARTIST
: هنرمند. -
"android.intent.extra.genre"
: ژانر. -
"android.intent.extra.playlist"
: لیست پخش. -
EXTRA_MEDIA_TITLE
: نام آهنگی که لیست پخش بر اساس آن است. -
QUERY
(الزامی): رشته ای که حاوی ترکیبی از آلبوم، هنرمند، ژانر، فهرست پخش یا عنوان است. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
-
قصد مثال:
اگر کاربر بخواهد از یک هنرمند خاص به موسیقی گوش دهد، یک برنامه جستجو ممکن است هدف زیر را ایجاد کند:
کاتلین
fun playSearchArtist(artist: String) { val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply { putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist) putExtra(SearchManager.QUERY, artist) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void playSearchArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); intent.putExtra(SearchManager.QUERY, artist); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
هنگام مدیریت این هدف در فعالیت خود، مقدار EXTRA_MEDIA_FOCUS
اضافی را در Intent
ورودی بررسی کنید تا حالت جستجو مشخص شود. هنگامی که فعالیت شما حالت جستجو را مشخص کرد، مقادیر اضافی اضافی را برای آن حالت جستجوی خاص بخوانید. با این اطلاعات، برنامه شما میتواند جستجو را در فهرست موجودی خود انجام دهد تا محتوایی را که با عبارت جستجو مطابقت دارد پخش کند. این در مثال زیر نشان داده شده است.
کاتلین
override fun onCreate(savedInstanceState: Bundle?) { ... if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS) val query: String? = intent.getStringExtra(SearchManager.QUERY) // Some of these extras might not be available depending on the search mode. val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM) val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST) val genre: String? = intent.getStringExtra("android.intent.extra.genre") val playlist: String? = intent.getStringExtra("android.intent.extra.playlist") val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE) // Determine the search mode and use the corresponding extras. when { mediaFocus == null -> { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query) } mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> { if (query?.isNotEmpty() == true) { // 'Unstructured' search mode. playUnstructuredSearch(query) } else { // 'Any' search mode. playResumeLastPlaylist() } } mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> { // 'Genre' search mode. playGenre(genre) } mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Artist' search mode. playArtist(artist, genre) } mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> { // 'Album' search mode. playAlbum(album, artist) } mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> { // 'Song' search mode. playSong(album, artist, genre, title) } mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title) } } } }
جاوا
protected void onCreate(Bundle savedInstanceState) { //... Intent intent = this.getIntent(); if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); String query = intent.getStringExtra(SearchManager.QUERY); // Some of these extras might not be available depending on the search mode. String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); String genre = intent.getStringExtra("android.intent.extra.genre"); String playlist = intent.getStringExtra("android.intent.extra.playlist"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // Determine the search mode and use the corresponding extras. if (mediaFocus == null) { // 'Unstructured' search mode (backward compatible). playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // 'Any' search mode. playResumeLastPlaylist(); } else { // 'Unstructured' search mode. playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { // 'Genre' search mode. playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // 'Artist' search mode. playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // 'Album' search mode. playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // 'Song' search mode. playSong(album, artist, genre, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title); } } }
یادداشت جدید
ایجاد یادداشت یک اقدام رایج برای برنامه های یادداشت برداری است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک یادداشت ایجاد کنید
برای ایجاد یک یادداشت جدید، از عملکرد ACTION_CREATE_NOTE
استفاده کنید و جزئیات یادداشت مانند موضوع و متن را با استفاده از موارد اضافی زیر مشخص کنید.
توجه: برنامه ها قبل از انجام این عمل باید از کاربر تأییدیه بخواهند.
- اقدام
-
ACTION_CREATE_NOTE
- طرح داده URI
- هیچ کدام
- نوع MIME
-
PLAIN_TEXT_TYPE
- "*/*"
- موارد اضافی
-
EXTRA_NAME
- رشته ای که عنوان یا موضوع یادداشت را نشان می دهد.
-
EXTRA_TEXT
- رشته ای که متن یادداشت را نشان می دهد.
-
- اقدام
-
ACTION_DIAL
- شماره گیر یا برنامه تلفن را باز می کند. -
ACTION_CALL
- تماس تلفنی برقرار می کند (نیاز به مجوزCALL_PHONE
دارد)
-
- طرح داده URI
-
tel:<phone-number>
-
voicemail:<phone-number>
-
- نوع MIME
- هیچ کدام
-
tel:2125551212
-
tel:(212) 555 1212
- اقدام
-
"com.google.android.gms.actions.SEARCH_ACTION"
- از عبارتهای جستجوی Google Voice Actions پشتیبانی کنید.
-
- موارد اضافی
-
QUERY
- رشته ای که شامل عبارت جستجو می شود.
-
- اقدام
-
ACTION_WEB_SEARCH
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
SearchManager.QUERY
- رشته جستجو
-
- اقدام
-
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS
برای صفحه تنظیمات اضافی موجود، به مستندات
Settings
مراجعه کنید. - طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- اقدام
-
ACTION_SENDTO
یا
ACTION_SEND
یا
ACTION_SEND_MULTIPLE
- طرح داده URI
-
sms: <phone_number>
smsto: <phone_number>
mms: <phone_number>
mmsto: <phone_number>
این طرح ها همه به یک شکل اداره می شوند.
-
- نوع MIME
-
"text/plain"
"image/*"
"video/*"
-
- موارد اضافی
-
"subject"
- یک رشته برای موضوع پیام (معمولاً فقط برای MMS).
-
"sms_body"
- یک رشته برای پیامک.
-
EXTRA_STREAM
- یک
Uri
که به تصویر یا ویدیو برای پیوست اشاره می کند. اگر از عملکردACTION_SEND_MULTIPLE
استفاده می کنید، این اضافی یکArrayList
از اشیاءUri
است که به تصاویر یا ویدیوهایی برای پیوست اشاره می کند.
-
- اقدام
-
ACTION_VIEW
- طرح داده URI
-
http: <URL>
https: <URL>
- نوع MIME
-
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
-
- یک دستگاه Android را برای توسعه تنظیم کنید یا از یک دستگاه مجازی استفاده کنید.
- نسخه ای از برنامه خود را نصب کنید که اهداف مورد نظر شما را پشتیبانی می کند.
- با استفاده از
adb
یک intent ایجاد کنید:adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \ -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
به عنوان مثال:
adb shell am start -a android.intent.action.DIAL \ -d tel:555-5555 -n org.example.MyApp/.MyActivity
- اگر فیلترهای هدف مورد نیاز را تعریف می کنید، intent را مدیریت کنید.
- اقدام
-
ACTION_SET_ALARM
- URI داده
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
EXTRA_HOUR
- ساعت زنگ هشدار
-
EXTRA_MINUTES
- دقیقه برای زنگ.
-
EXTRA_MESSAGE
- یک پیام سفارشی برای شناسایی زنگ.
-
EXTRA_DAYS
-
ArrayList
شامل هر روز هفته که در آن زنگ هشدار تکرار می شود. هر روز باید با یک عدد صحیح از کلاسCalendar
مانندMONDAY
اعلان شود.برای یک زنگ هشدار یک بار، این اضافی را مشخص نکنید.
-
EXTRA_RINGTONE
- یک
content:
URI که آهنگ زنگی را برای استفاده با زنگ هشدار مشخص میکند، یاVALUE_RINGTONE_SILENT
بدون آهنگ زنگ.برای استفاده از آهنگ زنگ پیش فرض، این مورد اضافی را مشخص نکنید.
-
EXTRA_VIBRATE
- یک بولی که مشخص می کند آیا برای این زنگ لرزش باید انجام شود یا خیر.
-
EXTRA_SKIP_UI
- یک بولی که مشخص میکند آیا برنامه پاسخدهنده باید هنگام تنظیم زنگ، از رابط کاربری خود صرف نظر کند یا خیر. اگر درست باشد، برنامه باید هر رابط کاربری تأیید را دور بزند و زنگ هشدار مشخص شده را تنظیم کند.
-
- اقدام
-
ACTION_SET_TIMER
- URI داده
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
EXTRA_LENGTH
- طول تایمر بر حسب ثانیه
-
EXTRA_MESSAGE
- یک پیام سفارشی برای شناسایی تایمر.
-
EXTRA_SKIP_UI
- یک بولی که مشخص می کند آیا برنامه پاسخ دهنده باید هنگام تنظیم تایمر از رابط کاربری خود صرف نظر کند یا خیر. اگر درست باشد، برنامه باید هر رابط کاربری تأیید را دور بزند و تایمر مشخص شده را شروع کند.
-
- اقدام
-
ACTION_SHOW_ALARMS
- URI داده
- هیچ کدام
- نوع MIME
- هیچ کدام
- اقدام
-
ACTION_INSERT
- URI داده
-
Events.CONTENT_URI
- نوع MIME
-
"vnd.android.cursor.dir/event"
- موارد اضافی
-
EXTRA_EVENT_ALL_DAY
- یک بولی که مشخص می کند آیا این یک رویداد تمام روز است یا خیر.
-
EXTRA_EVENT_BEGIN_TIME
- زمان شروع رویداد (میلی ثانیه از زمان).
-
EXTRA_EVENT_END_TIME
- زمان پایان رویداد (میلی ثانیه از زمان).
-
TITLE
- عنوان رویداد.
-
DESCRIPTION
- شرح رویداد.
-
EVENT_LOCATION
- مکان رویداد.
-
EXTRA_EMAIL
- فهرستی از آدرسهای ایمیل جدا شده با کاما که دعوتشدگان را مشخص میکند.
بسیاری از جزئیات رویداد را می توان با استفاده از ثابت های تعریف شده در کلاس
CalendarContract.EventsColumns
مشخص کرد.-
- اقدام
-
ACTION_IMAGE_CAPTURE
یا
ACTION_VIDEO_CAPTURE
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
EXTRA_OUTPUT
- مکان URI که در آن برنامه دوربین فایل عکس یا ویدیو را (به عنوان یک شی
Uri
) ذخیره می کند.
-
- اقدام
-
INTENT_ACTION_STILL_IMAGE_CAMERA
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
- هیچ کدام
- اقدام
-
INTENT_ACTION_VIDEO_CAMERA
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
- هیچ کدام
- اقدام
-
ACTION_PICK
- طرح داده URI
- هیچ کدام
- نوع MIME
-
Contacts.CONTENT_TYPE
- اقدام
-
ACTION_PICK
- طرح داده URI
- هیچ کدام
- نوع MIME
-
CommonDataKinds.Phone.CONTENT_TYPE
- از مخاطبین دارای شماره تلفن انتخاب کنید.
-
CommonDataKinds.Email.CONTENT_TYPE
- از مخاطبین دارای آدرس ایمیل انتخاب کنید.
-
CommonDataKinds.StructuredPostal.CONTENT_TYPE
- از مخاطبین دارای آدرس پستی انتخاب کنید.
یا یکی از بسیاری از مقادیر
CONTENT_TYPE
دیگر تحتContactsContract
.-
- از URI تماسی که با عملکرد
ACTION_PICK
نشان داده شده در بخش قبل بازگردانده شده است استفاده کنید. این رویکرد به هیچ گونه مجوز برنامه نیاز ندارد. - همانطور که در بازیابی لیست مخاطبین توضیح داده شده است، مستقیماً به لیست همه مخاطبین دسترسی داشته باشید. این رویکرد به مجوز
READ_CONTACTS
نیاز دارد. - اقدام
-
ACTION_VIEW
- طرح داده URI
-
content:<URI>
- نوع MIME
- هیچ کدام نوع از URI تماس استنباط می شود.
- از URI تماسی که با عملکرد
ACTION_PICK
نشان داده شده در بخش قبل بازگردانده شده است استفاده کنید. این رویکرد به هیچ گونه مجوز برنامه نیاز ندارد. - همانطور که در بازیابی لیست مخاطبین توضیح داده شده است، مستقیماً به لیست همه مخاطبین دسترسی داشته باشید. این رویکرد به مجوز
READ_CONTACTS
نیاز دارد. - اقدام
-
ACTION_EDIT
- طرح داده URI
-
content:<URI>
- نوع MIME
- نوع از URI تماس استنباط می شود.
- موارد اضافی
- یک یا چند مورد اضافی تعریف شده در
ContactsContract.Intents.Insert
تا بتوانید فیلدهای جزئیات تماس را پر کنید. - اقدام
-
ACTION_INSERT
- طرح داده URI
- هیچ کدام
- نوع MIME
-
Contacts.CONTENT_TYPE
- موارد اضافی
- یک یا چند مورد اضافی تعریف شده در
ContactsContract.Intents.Insert
. - اقدام
-
ACTION_SENDTO
(بدون پیوست) یا
ACTION_SEND
(برای یک پیوست) یا
ACTION_SEND_MULTIPLE
(برای چندین پیوست) - طرح داده URI
- هیچ کدام
- نوع MIME
-
"text/plain"
"*/*"
-
- موارد اضافی
-
Intent.EXTRA_EMAIL
- یک آرایه رشته ای از تمام آدرس های ایمیل گیرنده "به".
-
Intent.EXTRA_CC
- یک آرایه رشته ای از تمام آدرس های ایمیل گیرنده "CC".
-
Intent.EXTRA_BCC
- یک آرایه رشته ای از تمام آدرس های ایمیل گیرنده "BCC".
-
Intent.EXTRA_SUBJECT
- یک رشته با موضوع ایمیل.
-
Intent.EXTRA_TEXT
- یک رشته با متن ایمیل.
-
Intent.EXTRA_STREAM
-
Uri
که به پیوست اشاره می کند. اگر از عملکردACTION_SEND_MULTIPLE
استفاده می کنید، در عوض یکArrayList
حاوی چندین شیUri
است.
-
- اقدام
-
ACTION_GET_CONTENT
- طرح داده URI
- هیچ کدام
- نوع MIME
- نوع MIME مربوط به نوع فایلی است که کاربر باید انتخاب کند.
- موارد اضافی
-
EXTRA_ALLOW_MULTIPLE
- یک بولین که اعلام می کند آیا کاربر می تواند همزمان بیش از یک فایل را انتخاب کند یا خیر.
-
EXTRA_LOCAL_ONLY
- یک بولی که اعلام می کند آیا فایل برگشتی باید مستقیماً از دستگاه در دسترس باشد، نه اینکه نیاز به دانلود از یک سرویس راه دور داشته باشد.
-
- دسته (اختیاری)
-
CATEGORY_OPENABLE
- برای برگرداندن فقط فایلهای «باز شدنی» که میتوانند به عنوان جریان فایل با
openFileDescriptor()
نمایش داده شوند.
-
- اقدام
-
ACTION_OPEN_DOCUMENT
یا
ACTION_CREATE_DOCUMENT
- طرح داده URI
- هیچ کدام
- نوع MIME
- نوع MIME مربوط به نوع فایلی است که کاربر باید انتخاب کند.
- موارد اضافی
-
EXTRA_MIME_TYPES
- آرایه ای از انواع MIME مطابق با انواع فایل هایی که برنامه شما درخواست می کند. وقتی از این اضافی استفاده می کنید، باید نوع MIME اولیه را در
setType()
روی"*/*"
تنظیم کنید. -
EXTRA_ALLOW_MULTIPLE
- یک بولین که اعلام می کند آیا کاربر می تواند همزمان بیش از یک فایل را انتخاب کند یا خیر.
-
EXTRA_TITLE
- برای استفاده با
ACTION_CREATE_DOCUMENT
برای تعیین نام فایل اولیه. -
EXTRA_LOCAL_ONLY
- یک بولی که اعلام می کند آیا فایل برگشتی باید مستقیماً از دستگاه در دسترس باشد، نه اینکه نیاز به دانلود از یک سرویس راه دور داشته باشد.
-
- دسته بندی
-
CATEGORY_OPENABLE
- برای برگرداندن فقط فایلهای «باز شدنی» که میتوانند به عنوان جریان فایل با
openFileDescriptor()
نمایش داده شوند.
-
- اقدام
-
ACTION_RESERVE_TAXI_RESERVATION
- URI داده
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
- هیچ کدام
- اقدام
-
ACTION_VIEW
- طرح داده URI
-
geo: latitude , longitude
- نقشه را در طول و عرض جغرافیایی داده شده نشان دهید.
مثال:
"geo:47.6,-122.3"
-
geo: latitude , longitude ?z= zoom
- نقشه را در طول و عرض جغرافیایی داده شده در سطح بزرگنمایی مشخص نشان دهید. سطح زوم 1 کل زمین را با مرکز lat داده شده، lng نشان می دهد. بالاترین (نزدیک ترین) سطح زوم 23 است.
مثال:
"geo:47.6,-122.3?z=11"
-
geo:0,0?q=lat,lng(label)
- نقشه را در طول و عرض جغرافیایی داده شده با یک برچسب رشته نشان دهید.
مثال:
"geo:0,0?q=34.99,-106.61(Treasure)"
-
geo:0,0?q=my+street+address
- مکان «آدرس خیابان من» را نشان دهید، که میتواند یک آدرس خاص یا جستجوی مکان باشد.
مثال:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
توجه: تمام رشته های ارسال شده در URI
geo
باید کدگذاری شوند. به عنوان مثال، رشته1st & Pike, Seattle
تبدیل به1st%20%26%20Pike%2C%20Seattle
می شود. فاصله ها در رشته با%20
کدگذاری می شوند یا با علامت مثبت (+
) جایگزین می شوند.
-
- نوع MIME
- هیچ کدام
- اقدام
-
ACTION_VIEW
- طرح داده URI
-
file: <URI>
content: <URI>
http: <URL>
-
- نوع MIME
-
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
- یا هر مورد دیگری که برنامه شما نیاز دارد.
-
- اقدام
-
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
MediaStore.EXTRA_MEDIA_FOCUS
(الزامی) حالت جستجو را نشان می دهد: آیا کاربر به دنبال هنرمند، آلبوم، آهنگ یا لیست پخش خاصی است. بیشتر حالتهای جستجو موارد اضافی اضافی را میطلبند. به عنوان مثال، اگر کاربر علاقه مند به گوش دادن به یک آهنگ خاص باشد، این هدف ممکن است دارای سه ویژگی اضافی باشد: عنوان آهنگ، هنرمند و آلبوم. این هدف از حالت های جستجوی زیر برای هر مقدار
EXTRA_MEDIA_FOCUS
پشتیبانی می کند:هر -
"vnd.android.cursor.item/*"
هر موسیقی را پخش کنید. برنامه دریافت کننده برخی از موسیقی ها را بر اساس یک انتخاب هوشمندانه پخش می کند، مانند آخرین لیست پخشی که کاربر به آن گوش داده است.
موارد اضافی:
-
QUERY
(الزامی): یک رشته خالی. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
بدون ساختار -
"vnd.android.cursor.item/*"
یک آهنگ، آلبوم یا ژانر خاص را از یک عبارت جستجوی بدون ساختار پخش کنید. وقتی برنامهها نمیتوانند نوع محتوایی را که کاربر میخواهد به آن گوش دهد را شناسایی کنند، میتوانند با این حالت جستجو یک هدف تولید کنند. در صورت امکان از حالت های جستجوی خاص تر استفاده کنید.
موارد اضافی:
-
QUERY
(الزامی): رشتهای که حاوی ترکیبی از هنرمند، آلبوم، نام آهنگ یا ژانر است.
-
پخش موسیقی از یک سبک خاص.
موارد اضافی:
-
"android.intent.extra.genre"
(الزامی) - ژانر. -
QUERY
(الزامی): ژانر. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
هنرمند -
Audio.Artists.ENTRY_CONTENT_TYPE
پخش موسیقی از یک هنرمند خاص.
موارد اضافی:
-
EXTRA_MEDIA_ARTIST
(الزامی): هنرمند. -
"android.intent.extra.genre"
: ژانر. -
QUERY
(الزامی): رشته ای که حاوی هر ترکیبی از هنرمند یا ژانر است. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
آلبوم -
Audio.Albums.ENTRY_CONTENT_TYPE
پخش موسیقی از یک آلبوم خاص.
موارد اضافی:
-
EXTRA_MEDIA_ALBUM
(الزامی): آلبوم. -
EXTRA_MEDIA_ARTIST
: هنرمند. -
"android.intent.extra.genre"
: ژانر. -
QUERY
(الزامی): رشته ای که حاوی هر ترکیبی از آلبوم یا هنرمند است. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
آهنگ -
"vnd.android.cursor.item/audio"
آهنگ خاصی را پخش کنید.
موارد اضافی:
-
EXTRA_MEDIA_ALBUM
: آلبوم. -
EXTRA_MEDIA_ARTIST
: هنرمند. -
"android.intent.extra.genre"
: ژانر. -
EXTRA_MEDIA_TITLE
(الزامی): نام آهنگ. -
QUERY
(الزامی): رشته ای که حاوی هر ترکیبی از آلبوم، هنرمند، ژانر یا عنوان است. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
لیست پخش -
Audio.Playlists.ENTRY_CONTENT_TYPE
یک لیست پخش خاص یا یک لیست پخش را پخش کنید که با برخی از معیارهای مشخص شده توسط موارد اضافی مطابقت دارد.
موارد اضافی:
-
EXTRA_MEDIA_ALBUM
: آلبوم. -
EXTRA_MEDIA_ARTIST
: هنرمند. -
"android.intent.extra.genre"
: ژانر. -
"android.intent.extra.playlist"
: لیست پخش. -
EXTRA_MEDIA_TITLE
: نام آهنگی که لیست پخش بر اساس آن است. -
QUERY
(الزامی): رشته ای که حاوی ترکیبی از آلبوم، هنرمند، ژانر، فهرست پخش یا عنوان است. این اضافی همیشه برای سازگاری با عقب ارائه می شود. برنامههای موجود که از حالتهای جستجو اطلاعی ندارند، میتوانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
-
- اقدام
-
ACTION_CREATE_NOTE
- طرح داده URI
- هیچ کدام
- نوع MIME
-
PLAIN_TEXT_TYPE
- "*/*"
- موارد اضافی
-
EXTRA_NAME
- رشته ای که عنوان یا موضوع یادداشت را نشان می دهد.
-
EXTRA_TEXT
- رشته ای که متن یادداشت را نشان می دهد.
-
- اقدام
-
ACTION_DIAL
- شماره گیر یا برنامه تلفن را باز می کند. -
ACTION_CALL
- تماس تلفنی برقرار می کند (نیاز به مجوزCALL_PHONE
دارد)
-
- طرح داده URI
-
tel:<phone-number>
-
voicemail:<phone-number>
-
- نوع MIME
- هیچ کدام
-
tel:2125551212
-
tel:(212) 555 1212
- اقدام
-
"com.google.android.gms.actions.SEARCH_ACTION"
- از عبارتهای جستجوی Google Voice Actions پشتیبانی کنید.
-
- موارد اضافی
-
QUERY
- رشته ای که شامل عبارت جستجو می شود.
-
- اقدام
-
ACTION_WEB_SEARCH
- طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
SearchManager.QUERY
- رشته جستجو
-
- اقدام
-
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS
برای صفحه تنظیمات اضافی موجود، به مستندات
Settings
مراجعه کنید. - طرح داده URI
- هیچ کدام
- نوع MIME
- هیچ کدام
- اقدام
-
ACTION_SENDTO
یا
ACTION_SEND
یا
ACTION_SEND_MULTIPLE
- طرح داده URI
-
sms: <phone_number>
smsto: <phone_number>
mms: <phone_number>
mmsto: <phone_number>
این طرح ها همه به یک شکل اداره می شوند.
-
- نوع MIME
-
"text/plain"
"image/*"
"video/*"
-
- موارد اضافی
-
"subject"
- یک رشته برای موضوع پیام (معمولاً فقط برای MMS).
-
"sms_body"
- یک رشته برای پیامک.
-
EXTRA_STREAM
- یک
Uri
که به تصویر یا ویدیو برای پیوست اشاره می کند. اگر از عملکردACTION_SEND_MULTIPLE
استفاده می کنید، این اضافی یکArrayList
از اشیاءUri
است که به تصاویر یا ویدیوهایی برای پیوست اشاره می کند.
-
- اقدام
-
ACTION_VIEW
- طرح داده URI
-
http: <URL>
https: <URL>
- نوع MIME
-
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
-
- یک دستگاه Android را برای توسعه تنظیم کنید یا از یک دستگاه مجازی استفاده کنید.
- نسخه ای از برنامه خود را نصب کنید که اهداف مورد نظر شما را پشتیبانی می کند.
- با استفاده از
adb
یک intent ایجاد کنید:adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \ -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
به عنوان مثال:
adb shell am start -a android.intent.action.DIAL \ -d tel:555-5555 -n org.example.MyApp/.MyActivity
- اگر فیلترهای هدف مورد نیاز را تعریف می کنید، intent را مدیریت کنید.
قصد مثال:
کاتلین
fun createNote(subject: String, text: String) { val intent = Intent(NoteIntents.ACTION_CREATE_NOTE).apply { putExtra(NoteIntents.EXTRA_NAME, subject) putExtra(NoteIntents.EXTRA_TEXT, text) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void createNote(String subject, String text) { Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE) .putExtra(NoteIntents.EXTRA_NAME, subject) .putExtra(NoteIntents.EXTRA_TEXT, text); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.CREATE_NOTE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </activity>
تلفن
برقراری تماس یک اقدام رایج برای برنامه های تلفن است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
تماس تلفنی را آغاز کنید
برای باز کردن برنامه تلفن و شماره گیری یک شماره تلفن، از عملکرد ACTION_DIAL
استفاده کنید و با استفاده از طرح URI زیر شماره تلفنی را مشخص کنید. هنگامی که برنامه تلفن باز می شود، شماره تلفن را نمایش می دهد و کاربر باید برای شروع تماس تلفنی روی دکمه تماس ضربه بزند.
برای برقراری تماس تلفنی مستقیم، از عملکرد ACTION_CALL
استفاده کنید و با استفاده از طرح URI زیر یک شماره تلفن مشخص کنید. هنگامی که برنامه تلفن باز می شود، تماس تلفنی را شروع می کند. کاربر نیازی به ضربه زدن روی دکمه تماس ندارد.
عمل ACTION_CALL
نیاز دارد که مجوز CALL_PHONE
را به فایل مانیفست خود اضافه کنید:
<uses-permission android:name="android.permission.CALL_PHONE" />
شماره تلفن های معتبر آنهایی هستند که در IETF RFC 3966 تعریف شده اند. نمونه های معتبر شامل موارد زیر است:
شماره گیر برنامه Phone در عادی سازی طرح ها مانند شماره تلفن ها خوب است. بنابراین طرح توصیف شده در روش Uri.parse()
به شدت مورد نیاز نیست. با این حال، اگر طرحی را امتحان نکردهاید یا مطمئن نیستید که میتوان آن را مدیریت کرد، به جای آن از متد Uri.fromParts()
استفاده کنید.
قصد مثال:
کاتلین
fun dialPhoneNumber(phoneNumber: String) { val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void dialPhoneNumber(String phoneNumber) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
جستجو کنید
اقدامات زیر برای برنامههای جستجو، شامل اطلاعاتی است که برای ایجاد یک فیلتر قصد برای تبلیغ توانایی برنامهتان برای انجام هر عمل نیاز دارید.
با استفاده از یک برنامه خاص جستجو کنید
برای پشتیبانی از جستجو در زمینه برنامه خود، همانطور که در مثال فیلتر قصد زیر نشان داده شده است، یک فیلتر هدف در برنامه خود با عملکرد SEARCH_ACTION
اعلام کنید.
توجه: استفاده از SEARCH_ACTION
را برای جستجوی برنامه توصیه نمیکنیم. در عوض، اقدام GET_THING
را برای استفاده از پشتیبانی داخلی دستیار Google برای جستجوی درون برنامه اجرا کنید. برای اطلاعات بیشتر، به مستندات Google Assistant App Actions مراجعه کنید.
فیلتر قصد مثال:
<activity android:name=".SearchActivity"> <intent-filter> <action android:name="com.google.android.gms.actions.SEARCH_ACTION"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
جستجوی وب را انجام دهید
برای شروع جستجوی وب، از عمل ACTION_WEB_SEARCH
استفاده کنید و رشته جستجو را در SearchManager.QUERY
اضافی مشخص کنید.
قصد مثال:
کاتلین
fun searchWeb(query: String) { val intent = Intent(Intent.ACTION_WEB_SEARCH).apply { putExtra(SearchManager.QUERY, query) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void searchWeb(String query) { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, query); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
تنظیمات
برای باز کردن صفحهای در برنامه تنظیمات سیستم وقتی برنامه شما از کاربر میخواهد چیزی را تغییر دهد، از یکی از اقدامات هدف زیر استفاده کنید:
قصد مثال:
کاتلین
fun openWifiSettings() { val intent = Intent(Settings.ACTION_WIFI_SETTINGS) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void openWifiSettings() { Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
پیامک
نوشتن یک پیام SMS/MMS با پیوست یک اقدام رایج برای برنامه های پیام متنی است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک پیام SMS/MMS با پیوست بنویسید
برای شروع یک پیام متنی SMS یا MMS، از یکی از اقدامات هدف زیر استفاده کنید و جزئیات پیام مانند شماره تلفن، موضوع و متن پیام را با استفاده از کلیدهای اضافی زیر مشخص کنید.
قصد مثال:
کاتلین
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SENDTO).apply { type = HTTP.PLAIN_TEXT_TYPE putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType(HTTP.PLAIN_TEXT_TYPE); intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
اگر میخواهید مطمئن شوید که هدف شما فقط توسط یک برنامه پیامرسان متنی مدیریت میشود، و نه دیگر برنامههای ایمیل یا اجتماعی، از عملکرد ACTION_SENDTO
استفاده کنید و طرح داده "smsto:"
را همانطور که در مثال زیر نشان داده شده است وارد کنید:
کاتلین
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { data = Uri.parse("smsto:") // Only SMS apps respond to this. putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("smsto:")); // Only SMS apps respond to this. intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="text/plain" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
توجه: اگر در حال توسعه یک برنامه پیامرسانی SMS/MMS هستید، باید فیلترهای هدف را برای چندین اقدام دیگر پیادهسازی کنید تا بهعنوان برنامه پیشفرض پیامک در Android نسخه 4.4 و بالاتر در دسترس باشید. برای اطلاعات بیشتر، به مستندات در Telephony
مراجعه کنید.
مرورگر وب
بارگیری یک URL وب یک اقدام رایج برای برنامه های مرورگر وب است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک URL وب را بارگیری کنید
برای باز کردن یک صفحه وب، از عملکرد ACTION_VIEW
استفاده کنید و URL وب را در دادههای intent مشخص کنید.
قصد مثال:
کاتلین
fun openWebPage(url: String) { val webpage: Uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, webpage) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void openWebPage(String url) { Uri webpage = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, webpage); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <!-- Include the host attribute if you want your app to respond only to URLs with your app's domain. --> <data android:scheme="http" android:host="www.example.com" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The BROWSABLE category is required to get links from web pages. --> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> </activity>
نکته: اگر برنامه Android شما عملکردی مشابه وب سایت شما ارائه می دهد، یک فیلتر هدف برای URL هایی که به وب سایت شما اشاره می کنند قرار دهید. سپس، اگر کاربران برنامه شما را نصب کرده باشند، پیوندهایی از ایمیل ها یا سایر صفحات وب که به وب سایت شما اشاره می کنند، برنامه اندروید شما را به جای صفحه وب شما باز می کنند. در مدیریت پیوندهای برنامه Android بیشتر بیاموزید.
با شروع در Android 12 (سطح API 31)، یک هدف وب عمومی تنها در صورتی به یک فعالیت در برنامه شما تبدیل میشود که برنامه شما برای دامنه خاص موجود در آن هدف وب تأیید شده باشد. اگر برنامه شما برای دامنه تأیید نشده باشد، هدف وب به برنامه مرورگر پیشفرض کاربر حل میشود.
با Android Debug Bridge، اهداف را تأیید کنید
برای تأیید اینکه برنامه شما به اهدافی که میخواهید پشتیبانی کنید پاسخ میدهد، میتوانید از ابزار adb
برای شلیک مقاصد خاص با انجام کارهای زیر استفاده کنید:
برای اطلاعات بیشتر، به صدور دستورات پوسته مراجعه کنید.
،یک intent به شما امکان میدهد یک فعالیت را در یک برنامه دیگر با توصیف عملکردی که میخواهید انجام دهید، مانند "مشاهده نقشه" یا "عکس گرفتن" در یک شی Intent
، شروع کنید. به این نوع intent، intent ضمنی می گویند زیرا مؤلفه برنامه را برای شروع مشخص نمی کند، بلکه در عوض یک عمل را مشخص می کند و داده هایی را برای انجام عمل ارائه می دهد.
هنگامی که شما startActivity()
یا startActivityForResult()
را فرا می خوانید و آن را یک intent ضمنی ارسال می کنید، سیستم intent را به برنامه ای که می تواند intent را مدیریت کند حل می کند و Activity
مربوطه خود را شروع می کند. اگر بیش از یک برنامه وجود داشته باشد که بتواند هدف را مدیریت کند، سیستم به کاربر یک گفتگو ارائه می دهد تا برنامه مورد نظر را انتخاب کند.
این صفحه چندین هدف ضمنی را توصیف می کند که می توانید از آنها برای انجام اقدامات معمول استفاده کنید، که بر اساس نوع برنامه ای که هدف را مدیریت می کند، سازماندهی شده اند. هر بخش همچنین نشان می دهد که چگونه می توانید یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام عمل تبلیغ کنید.
احتیاط: اگر هیچ برنامهای در دستگاه وجود نداشته باشد که بتواند یک هدف ضمنی دریافت کند، برنامه با فراخوانی startActivity()
از کار میافتد. برای اینکه ابتدا تأیید کنید که برنامه ای برای دریافت intent وجود دارد، resolveActivity()
در شی Intent
خود فراخوانی کنید. اگر نتیجه غیر تهی باشد، حداقل یک برنامه وجود دارد که می تواند intent را مدیریت کند، و فراخوانی startActivity()
بی خطر است. اگر نتیجه صفر است، از intent استفاده نکنید و در صورت امکان، ویژگی را که intent را فراخوانی می کند غیرفعال کنید.
اگر با نحوه ایجاد intent یا فیلترهای هدف آشنا نیستید، ابتدا Intent و Intent Filters را بخوانید.
برای یادگیری نحوه فعال کردن اهداف لیست شده در این صفحه از میزبان توسعه خود، به بخش Verify intents with Android Debug Bridge مراجعه کنید.
Google Voice Actions
Google Voice Actions برخی از اهداف فهرست شده در این صفحه را در پاسخ به دستورات صوتی فعال می کند. برای اطلاعات بیشتر، شروع به کار با عملکردهای صوتی سیستم را ببینید.
ساعت زنگ دار
اقدامات زیر برای برنامه های ساعت زنگ دار، شامل اطلاعاتی است که برای ایجاد یک فیلتر هدف برای تبلیغ توانایی برنامه خود برای انجام هر عمل به آن نیاز دارید.
ایجاد زنگ هشدار
برای ایجاد زنگ هشدار جدید، از عملکرد ACTION_SET_ALARM
استفاده کنید و جزئیات زنگ هشدار مانند زمان و پیام را با استفاده از موارد اضافی زیر مشخص کنید.
توجه: فقط ساعت، دقیقه و پیام اضافی در Android نسخه 2.3 (سطح API 9) و پایینتر موجود است. سایر موارد اضافی در نسخه های بالاتر این پلت فرم موجود است.
قصد مثال:
کاتلین
fun createAlarm(message: String, hour: Int, minutes: Int) { val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_HOUR, hour) putExtra(AlarmClock.EXTRA_MINUTES, minutes) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void createAlarm(String message, int hour, int minutes) { Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_HOUR, hour) .putExtra(AlarmClock.EXTRA_MINUTES, minutes); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
برای فراخوانی هدف ACTION_SET_ALARM
، برنامه شما باید مجوز SET_ALARM
را داشته باشد:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
یک تایمر ایجاد کنید
برای ایجاد یک تایمر شمارش معکوس، از عملکرد ACTION_SET_TIMER
استفاده کنید و جزئیات تایمر مانند مدت زمان را با استفاده از موارد اضافی زیر مشخص کنید.
توجه: این هدف در اندروید 4.4 (سطح API 19) و بالاتر موجود است.
قصد مثال:
کاتلین
fun startTimer(message: String, seconds: Int) { val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_LENGTH, seconds) putExtra(AlarmClock.EXTRA_SKIP_UI, true) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void startTimer(String message, int seconds) { Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
برای فراخوانی هدف ACTION_SET_TIMER
، برنامه شما باید مجوز SET_ALARM
را داشته باشد:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
نمایش همه آلارم ها
برای نمایش لیست هشدارها، از عملکرد ACTION_SHOW_ALARMS
استفاده کنید.
اگرچه بسیاری از برنامهها این هدف را احضار نمیکنند، زیرا عمدتاً توسط برنامههای سیستم استفاده میشود، هر برنامهای که به عنوان ساعت زنگ دار عمل میکند میتواند این فیلتر هدف را پیادهسازی کند و با نمایش لیست هشدارهای فعلی پاسخ دهد.
توجه: این هدف در اندروید 4.4 (سطح API 19) و بالاتر موجود است.
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
تقویم
افزودن رویداد یک اقدام رایج برای برنامههای تقویم است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک رویداد تقویم اضافه کنید
برای افزودن یک رویداد جدید به تقویم کاربر، از عملکرد ACTION_INSERT
استفاده کنید و URI داده را با استفاده از Events.CONTENT_URI
مشخص کنید.CONTENT_URI . سپس می توانید جزئیات رویدادهای مختلف را با استفاده از موارد اضافی زیر مشخص کنید.
قصد مثال:
کاتلین
fun addEvent(title: String, location: String, begin: Long, end: Long) { val intent = Intent(Intent.ACTION_INSERT).apply { data = Events.CONTENT_URI putExtra(Events.TITLE, title) putExtra(Events.EVENT_LOCATION, location) putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void addEvent(String title, String location, long begin, long end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.INSERT" /> <data android:mimeType="vnd.android.cursor.dir/event" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
دوربین
اقدامات زیر برای برنامههای دوربین، شامل اطلاعاتی است که برای ایجاد یک فیلتر قصد برای تبلیغ توانایی برنامهتان برای انجام هر عمل نیاز دارید.
یک عکس یا ویدیو بگیرید و آن را برگردانید
برای باز کردن یک برنامه دوربین و دریافت عکس یا ویدیوی حاصل، از عملکرد ACTION_IMAGE_CAPTURE
یا ACTION_VIDEO_CAPTURE
استفاده کنید. همچنین مکان URI را که میخواهید دوربین عکس یا ویدیو را در آن ذخیره کند، در EXTRA_OUTPUT
اضافه کنید.
هنگامی که برنامه دوربین با موفقیت فوکوس را به فعالیت شما برمی گرداند - به عبارت دیگر، برنامه شما پاسخ تماس onActivityResult()
دریافت می کند - می توانید در URI که با مقدار EXTRA_OUTPUT
مشخص کرده اید به عکس یا ویدیو دسترسی داشته باشید.
توجه: هنگامی که از ACTION_IMAGE_CAPTURE
برای گرفتن عکس استفاده میکنید، دوربین ممکن است یک کپی کوچک یا تصویر کوچک از عکس را در نتیجه Intent
که بهعنوان Bitmap
در یک فیلد اضافی به نام "data"
ذخیره شده است، برگرداند.
قصد مثال:
کاتلین
const val REQUEST_IMAGE_CAPTURE = 1 val locationForPhotos: Uri = ... fun capturePhoto(targetFilename: String) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)) } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") // Do other work with full size photo saved in locationForPhotos. ... } }
جاوا
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri locationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelableExtra("data"); // Do other work with full size photo saved in locationForPhotos. ... } }
برای انجام این کار هنگام کار بر روی Android 12 (سطح API 31) یا بالاتر، به مثال intent زیر مراجعه کنید.
قصد مثال:
کاتلین
val REQUEST_IMAGE_CAPTURE = 1 private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
جاوا
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } catch (ActivityNotFoundException e) { // Display error state to the user. } } </section></div>
برای اطلاعات بیشتر درباره نحوه استفاده از این هدف برای گرفتن عکس، از جمله نحوه ایجاد یک Uri
مناسب برای مکان خروجی، عکس گرفتن یا فیلم گرفتن را بخوانید.
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
هنگام مدیریت این intent، از فعالیت خود بخواهید EXTRA_OUTPUT
اضافی را در Intent
دریافتی بررسی کند، سپس تصویر یا ویدیوی گرفته شده را در مکان مشخص شده توسط آن اضافی ذخیره کنید و setResult()
با یک Intent
فراخوانی کنید که شامل یک تصویر کوچک فشرده شده با نام اضافی است "data"
.
یک برنامه دوربین را در حالت تصویر ثابت راه اندازی کنید
برای باز کردن یک برنامه دوربین در حالت تصویر ثابت، از عملکرد INTENT_ACTION_STILL_IMAGE_CAMERA
استفاده کنید.
قصد مثال:
کاتلین
private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
جاوا
public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
یک برنامه دوربین را در حالت فیلم راه اندازی کنید
برای باز کردن یک برنامه دوربین در حالت ویدیو، از عملکرد INTENT_ACTION_VIDEO_CAMERA
استفاده کنید.
قصد مثال:
کاتلین
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
جاوا
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
برنامه مخاطبین/افراد
اقدامات زیر برای برنامههای مدیریت مخاطبین، شامل اطلاعاتی است که برای ایجاد یک فیلتر هدف برای تبلیغ توانایی برنامهتان برای انجام هر عمل به آن نیاز دارید.
یک مخاطب را انتخاب کنید
برای اینکه کاربر یک مخاطب را انتخاب کند و برنامه شما به همه اطلاعات تماس دسترسی داشته باشد، از عملکرد ACTION_PICK
استفاده کنید و نوع MIME را در Contacts.CONTENT_TYPE
مشخص کنید.CONTENT_TYPE .
نتیجه Intent
تحویل داده شده به callback onActivityResult()
شما حاوی این content:
URI که به مخاطب انتخاب شده اشاره می کند. این پاسخ به برنامه شما اجازه موقت میدهد تا آن مخاطب را با استفاده از Contacts Provider API بخواند، حتی اگر برنامه شما شامل مجوز READ_CONTACTS
نباشد.
نکته: اگر فقط به یک بخش خاص از اطلاعات تماس مانند شماره تلفن یا آدرس ایمیل نیاز دارید، در عوض به بخش بعدی درباره نحوه انتخاب دادههای مخاطب خاص مراجعه کنید.
قصد مثال:
کاتلین
const val REQUEST_SELECT_CONTACT = 1 fun selectContact() { val intent = Intent(Intent.ACTION_PICK).apply { type = ContactsContract.Contacts.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { val contactUri: Uri = data.data // Do something with the selected contact at contactUri. //... } }
جاوا
static final int REQUEST_SELECT_CONTACT = 1; public void selectContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); // Do something with the selected contact at contactUri. ... } }
برای کسب اطلاعات در مورد نحوه بازیابی اطلاعات تماس پس از داشتن URI مخاطب، بازیابی جزئیات مخاطب را بخوانید.
وقتی URI مخاطب را با استفاده از این هدف بازیابی میکنید، معمولاً برای خواندن جزئیات اصلی آن مخاطب، مانند نام نمایشی و ستارهدار بودن مخاطب، به مجوز READ_CONTACTS
نیاز ندارید. با این حال، اگر میخواهید دادههای خاصتری را درباره یک مخاطب خاص بخوانید - مانند شماره تلفن یا آدرس ایمیل آنها - به مجوز READ_CONTACTS
نیاز دارید.
داده های تماس خاص را انتخاب کنید
برای اینکه کاربر اطلاعات خاصی را از یک مخاطب انتخاب کند، مانند شماره تلفن، آدرس ایمیل، یا نوع داده دیگر، از عملکرد ACTION_PICK
استفاده کنید و نوع MIME را برای یکی از انواع محتوای زیر، مانند CommonDataKinds.Phone.CONTENT_TYPE
مشخص کنید. برای دریافت شماره تلفن مخاطب، CommonDataKinds.Phone.CONTENT_TYPE
.
توجه: در بسیاری از موارد، برنامه شما نیاز به مجوز READ_CONTACTS
برای مشاهده اطلاعات خاص در مورد یک مخاطب خاص دارد.
اگر نیاز به بازیابی تنها یک نوع داده از یک مخاطب دارید، این تکنیک با یک CONTENT_TYPE
از کلاس های ContactsContract.CommonDataKinds
کارآمدتر از استفاده از Contacts.CONTENT_TYPE
است، همانطور که در بخش قبل نشان داده شده است. نتیجه به شما امکان دسترسی مستقیم به داده های مورد نظر را بدون نیاز به انجام یک پرس و جو پیچیده تر به Contacts Provider می دهد.
نتیجه Intent
تحویل داده شده به پاسخ تماس onActivityResult()
شما حاوی این content:
URI که به داده های مخاطب انتخاب شده اشاره می کند. این پاسخ به برنامه شما مجوزهای موقت برای خواندن اطلاعات تماس می دهد حتی اگر برنامه شما شامل مجوز READ_CONTACTS
نباشد.
قصد مثال:
کاتلین
const val REQUEST_SELECT_PHONE_NUMBER = 1 fun selectContact() { // Start an activity for the user to pick a phone number from contacts. val intent = Intent(Intent.ACTION_PICK).apply { type = CommonDataKinds.Phone.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) { // Get the URI and query the content provider for the phone number. val contactUri: Uri = data.data val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER) contentResolver.query(contactUri, projection, null, null, null).use { cursor -> // If the cursor returned is valid, get the phone number. if (cursor.moveToFirst()) { val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER) val number = cursor.getString(numberIndex) // Do something with the phone number. ... } } } }
جاوا
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // Start an activity for the user to pick a phone number from contacts. Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { // Get the URI and query the content provider for the phone number. Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // If the cursor returned is valid, get the phone number. if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // Do something with the phone number. //... } } }
مشاهده یک مخاطب
برای نمایش جزئیات یک مخاطب شناخته شده، از عملکرد ACTION_VIEW
استفاده کنید و مخاطب را با یک content:
URI به عنوان داده هدف.
دو راه اصلی برای بازیابی اولیه URI مخاطب وجود دارد:
قصد مثال:
کاتلین
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
یک مخاطب موجود را ویرایش کنید
برای ویرایش یک مخاطب شناخته شده، از عمل ACTION_EDIT
استفاده کنید، مخاطب را با یک content:
URI به عنوان داده هدف، و هر گونه اطلاعات تماس شناخته شده را در موارد اضافی مشخص شده توسط ثابت ها در ContactsContract.Intents.Insert
قرار دهید.
دو راه اصلی برای بازیابی اولیه URI مخاطب وجود دارد:
قصد مثال:
کاتلین
fun editContact(contactUri: Uri, email: String) { val intent = Intent(Intent.ACTION_EDIT).apply { data = contactUri putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void editContact(Uri contactUri, String email) { Intent intent = new Intent(Intent.ACTION_EDIT); intent.setData(contactUri); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
برای اطلاعات بیشتر در مورد نحوه ویرایش مخاطب، اصلاح مخاطبین با استفاده از intent ها را بخوانید.
درج یک مخاطب
برای درج یک مخاطب جدید، از عملکرد ACTION_INSERT
استفاده کنید، Contacts.CONTENT_TYPE
به عنوان نوع MIME مشخص کنید، و هر گونه اطلاعات تماس شناخته شده را در موارد اضافی مشخص شده توسط ثابت ها در ContactsContract.Intents.Insert
قرار دهید.
قصد مثال:
کاتلین
fun insertContact(name: String, email: String) { val intent = Intent(Intent.ACTION_INSERT).apply { type = ContactsContract.Contacts.CONTENT_TYPE putExtra(ContactsContract.Intents.Insert.NAME, name) putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void insertContact(String name, String email) { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(Contacts.CONTENT_TYPE); intent.putExtra(Intents.Insert.NAME, name); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
برای اطلاعات بیشتر در مورد نحوه درج یک مخاطب، اصلاح مخاطبین با استفاده از intent ها را بخوانید.
ایمیل
نوشتن ایمیل با پیوست های اختیاری یک اقدام رایج برای برنامه های ایمیل است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک ایمیل با پیوست های اختیاری بنویسید
برای نوشتن ایمیل، از یکی از اقدامات زیر بر اساس اینکه آیا پیوستها را اضافه میکنید یا خیر، استفاده کنید و جزئیات ایمیل مانند گیرنده و موضوع را با استفاده از کلیدهای اضافی فهرست شده درج کنید.
قصد مثال:
کاتلین
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "*/*" putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
اگر میخواهید مطمئن شوید که هدف شما فقط توسط یک برنامه ایمیل مدیریت میشود و نه یک برنامه پیامک یا برنامه اجتماعی، از عملکرد ACTION_SENDTO
استفاده کنید و طرح داده "mailto:"
را همانطور که در مثال زیر نشان داده شده است وارد کنید:
کاتلین
fun composeEmail(addresses: Array<String>, subject: String) { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") // Only email apps handle this. putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // Only email apps handle this. intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
ذخیره سازی فایل
اقدامات زیر برای برنامههای ذخیرهسازی فایل، شامل اطلاعاتی است که برای ایجاد یک فیلتر قصد برای تبلیغ توانایی برنامهتان برای انجام هر عمل نیاز دارید.
نوع خاصی از فایل را بازیابی کنید
برای درخواست از کاربر که فایلی مانند سند یا عکس را انتخاب کند و مرجعی را به برنامه شما بازگرداند، از عملکرد ACTION_GET_CONTENT
استفاده کنید و نوع MIME مورد نظر خود را مشخص کنید. مرجع فایلی که به برنامه شما بازگردانده می شود برای چرخه حیات فعلی فعالیت شما گذرا است، بنابراین اگر می خواهید بعداً به آن دسترسی پیدا کنید، باید یک نسخه را وارد کنید که بتوانید بعداً بخوانید.
این هدف همچنین به کاربر اجازه می دهد تا یک فایل جدید در فرآیند ایجاد کند. به عنوان مثال، به جای انتخاب یک عکس موجود، کاربر می تواند یک عکس جدید با دوربین بگیرد.
هدف نتیجه تحویل داده شده به متد onActivityResult()
شما شامل داده هایی با یک URI است که به فایل اشاره می کند. URI می تواند هر چیزی باشد، مانند http:
URI، file:
URI، یا content:
URI. با این حال، اگر میخواهید فایلهای قابل انتخاب را فقط به آنهایی محدود کنید که از یک ارائهدهنده محتوا در دسترس هستند (یک content:
URI) و بهعنوان یک جریان فایل با openFileDescriptor()
در دسترس هستند، دسته CATEGORY_OPENABLE
را به هدف خود اضافه کنید.
در Android نسخه 4.3 (سطح API 18) و بالاتر، میتوانید با افزودن EXTRA_ALLOW_MULTIPLE
به intent که روی true
تنظیم شده است، به کاربر اجازه دهید چندین فایل را انتخاب کند. سپس می توانید به هر یک از فایل های انتخاب شده در یک شی ClipData
که توسط getClipData()
برگردانده شده است دسترسی داشته باشید.
نمونه ای از قصد گرفتن عکس:
کاتلین
const val REQUEST_IMAGE_GET = 1 fun selectImage() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") val fullPhotoUri: Uri = data.data // Do work with photo saved at fullPhotoUri. ... } }
جاوا
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri. ... } }
فیلتر قصد مثال برای برگرداندن عکس:
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
. --> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
نوع خاصی از فایل را باز کنید
به جای بازیابی یک کپی از فایلی که باید به برنامه خود وارد کنید، با استفاده از عملکرد ACTION_GET_CONTENT
، هنگام اجرا در Android نسخه 4.4 یا بالاتر، میتوانید با استفاده از عمل ACTION_OPEN_DOCUMENT
و مشخص کردن یک فایل درخواست باز کردن فایلی را که توسط برنامه دیگری مدیریت میشود نوع MIME همچنین برای اینکه به کاربر اجازه دهید سند جدیدی ایجاد کند که برنامه شما بتواند در آن بنویسد، به جای آن از عملکرد ACTION_CREATE_DOCUMENT
استفاده کنید.
به عنوان مثال، به جای انتخاب از اسناد PDF موجود، هدف ACTION_CREATE_DOCUMENT
به کاربران این امکان را می دهد تا جایی را که می خواهند یک سند جدید ایجاد کنند، مثلاً در برنامه دیگری که ذخیره سازی سند را مدیریت می کند، انتخاب کنند. سپس برنامه شما مکان URI را دریافت می کند که در آن می تواند سند جدید را بنویسد.
در حالی که intent تحویل داده شده به متد onActivityResult()
شما از عملکرد ACTION_GET_CONTENT
ممکن است یک URI از هر نوع را برگرداند، هدف نتیجه از ACTION_OPEN_DOCUMENT
و ACTION_CREATE_DOCUMENT
همیشه فایل انتخابی را به عنوان یک content:
URI که توسط یک DocumentsProvider
پشتیبانی می شود. میتوانید فایل را با openFileDescriptor()
باز کنید و جزئیات آن را با استفاده از ستونهایی از DocumentsContract.Document
جستجو کنید.
URI برگردانده شده به برنامه شما دسترسی خواندن طولانی مدت به فایل را می دهد، همچنین احتمالاً با دسترسی نوشتن. عمل ACTION_OPEN_DOCUMENT
مخصوصاً زمانی مفید است که میخواهید یک فایل موجود را بدون کپی کردن در برنامه خود بخوانید یا زمانی که میخواهید فایلی را در محل باز کرده و ویرایش کنید.
همچنین میتوانید با افزودن EXTRA_ALLOW_MULTIPLE
به intent، که روی true
تنظیم شده است، به کاربر اجازه دهید چندین فایل را انتخاب کند. اگر کاربر فقط یک آیتم را انتخاب کند، می توانید مورد را از getData()
بازیابی کنید. اگر کاربر بیش از یک آیتم را انتخاب کند، getData()
null را برمی گرداند و در عوض باید هر آیتم را از یک شی ClipData
که توسط getClipData()
برگردانده شده است بازیابی کنید.
توجه: هدف شما باید یک نوع MIME را مشخص کند و باید دسته CATEGORY_OPENABLE
را اعلام کند. در صورت لزوم، میتوانید با افزودن آرایهای از انواع MIME به همراه EXTRA_MIME_TYPES
بیش از یک نوع MIME را مشخص کنید—اگر این کار را انجام دهید، باید نوع MIME اصلی را در setType()
روی "*/*"
تنظیم کنید.
نمونه ای از قصد گرفتن عکس:
کاتلین
const val REQUEST_IMAGE_OPEN = 1 fun selectImage2() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) { val fullPhotoUri: Uri = data.data // Do work with full size photo saved at fullPhotoUri. ... } }
جاوا
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri. ... } }
برنامه های شخص ثالث نمی توانند با عملکرد ACTION_OPEN_DOCUMENT
به یک هدف پاسخ دهند. در عوض، سیستم این هدف را دریافت می کند و تمام فایل های موجود از برنامه های مختلف را در یک رابط کاربری یکپارچه نمایش می دهد.
برای ارائه فایلهای برنامه خود در این رابط کاربری و اجازه دادن به سایر برنامهها برای باز کردن آنها، باید یک DocumentsProvider
پیادهسازی کنید و یک فیلتر هدف برای PROVIDER_INTERFACE
( "android.content.action.DOCUMENTS_PROVIDER"
)، همانطور که در مثال زیر نشان داده شده است قرار دهید:
<provider ... android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider>
برای اطلاعات بیشتر درباره نحوه باز کردن فایلهای مدیریت شده توسط برنامهتان از سایر برنامهها، باز کردن فایلها با استفاده از چارچوب دسترسی به فضای ذخیرهسازی را بخوانید.
اقدامات محلی
تماس با ماشین یک اقدام محلی رایج است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
به ماشین زنگ بزن
برای تماس با تاکسی، از عملکرد ACTION_RESERVE_TAXI_RESERVATION
استفاده کنید.
توجه: برنامه ها قبل از انجام این عمل باید از کاربر تأییدیه بخواهند.
قصد مثال:
کاتلین
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
نقشه ها
نمایش یک مکان روی نقشه یک اقدام رایج برای برنامه های نقشه است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک مکان را روی نقشه نشان دهید
برای باز کردن نقشه، از عمل ACTION_VIEW
استفاده کنید و اطلاعات مکان را در دادههای هدف با یکی از طرحهای زیر مشخص کنید.
قصد مثال:
کاتلین
fun showMap(geoLocation: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = geoLocation } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void showMap(Uri geoLocation) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(geoLocation); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
موسیقی یا ویدیو
اقدامات زیر برای برنامههای موسیقی و ویدیو، شامل اطلاعاتی است که برای ایجاد یک فیلتر هدف برای تبلیغ توانایی برنامهتان برای انجام هر عمل به آن نیاز دارید.
پخش یک فایل رسانه ای
برای پخش یک فایل موسیقی، از عمل ACTION_VIEW
استفاده کنید و مکان URI فایل را در دادههای intent مشخص کنید.
قصد مثال:
کاتلین
fun playMedia(file: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = file } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void playMedia(Uri file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(file); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:type="audio/*" /> <data android:type="application/ogg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
پخش موسیقی بر اساس درخواست جستجو
برای پخش موسیقی بر اساس یک عبارت جستجو، از هدف INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
استفاده کنید. یک برنامه ممکن است این هدف را در پاسخ به فرمان صوتی کاربر برای پخش موسیقی اجرا کند. برنامه دریافت کننده برای این هدف، جستجویی را در موجودی خود انجام می دهد تا محتوای موجود را با درخواست داده شده مطابقت دهد و شروع به پخش آن محتوا می کند.
در این هدف، رشته اضافی EXTRA_MEDIA_FOCUS
را اضافه کنید، که حالت جستجوی مورد نظر را مشخص می کند. به عنوان مثال، حالت جستجو می تواند تعیین کند که آیا جستجو برای نام هنرمند یا نام آهنگ باشد.
قصد مثال:
اگر کاربر بخواهد از یک هنرمند خاص به موسیقی گوش دهد، یک برنامه جستجو ممکن است هدف زیر را ایجاد کند:
کاتلین
fun playSearchArtist(artist: String) { val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply { putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist) putExtra(SearchManager.QUERY, artist) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void playSearchArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); intent.putExtra(SearchManager.QUERY, artist); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
هنگام مدیریت این هدف در فعالیت خود، مقدار EXTRA_MEDIA_FOCUS
اضافی را در Intent
ورودی بررسی کنید تا حالت جستجو مشخص شود. هنگامی که فعالیت شما حالت جستجو را مشخص کرد، مقادیر اضافی اضافی را برای آن حالت جستجوی خاص بخوانید. با این اطلاعات، برنامه شما میتواند جستجو را در فهرست موجودی خود انجام دهد تا محتوایی را که با عبارت جستجو مطابقت دارد پخش کند. این در مثال زیر نشان داده شده است.
کاتلین
override fun onCreate(savedInstanceState: Bundle?) { ... if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS) val query: String? = intent.getStringExtra(SearchManager.QUERY) // Some of these extras might not be available depending on the search mode. val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM) val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST) val genre: String? = intent.getStringExtra("android.intent.extra.genre") val playlist: String? = intent.getStringExtra("android.intent.extra.playlist") val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE) // Determine the search mode and use the corresponding extras. when { mediaFocus == null -> { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query) } mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> { if (query?.isNotEmpty() == true) { // 'Unstructured' search mode. playUnstructuredSearch(query) } else { // 'Any' search mode. playResumeLastPlaylist() } } mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> { // 'Genre' search mode. playGenre(genre) } mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Artist' search mode. playArtist(artist, genre) } mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> { // 'Album' search mode. playAlbum(album, artist) } mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> { // 'Song' search mode. playSong(album, artist, genre, title) } mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title) } } } }
جاوا
protected void onCreate(Bundle savedInstanceState) { //... Intent intent = this.getIntent(); if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); String query = intent.getStringExtra(SearchManager.QUERY); // Some of these extras might not be available depending on the search mode. String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); String genre = intent.getStringExtra("android.intent.extra.genre"); String playlist = intent.getStringExtra("android.intent.extra.playlist"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // Determine the search mode and use the corresponding extras. if (mediaFocus == null) { // 'Unstructured' search mode (backward compatible). playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // 'Any' search mode. playResumeLastPlaylist(); } else { // 'Unstructured' search mode. playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { // 'Genre' search mode. playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // 'Artist' search mode. playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // 'Album' search mode. playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // 'Song' search mode. playSong(album, artist, genre, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title); } } }
یادداشت جدید
ایجاد یادداشت یک اقدام رایج برای برنامه های یادداشت برداری است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک یادداشت ایجاد کنید
برای ایجاد یک یادداشت جدید، از عملکرد ACTION_CREATE_NOTE
استفاده کنید و جزئیات یادداشت مانند موضوع و متن را با استفاده از موارد اضافی زیر مشخص کنید.
توجه: برنامه ها قبل از انجام این عمل باید از کاربر تأییدیه بخواهند.
قصد مثال:
کاتلین
fun createNote(subject: String, text: String) { val intent = Intent(NoteIntents.ACTION_CREATE_NOTE).apply { putExtra(NoteIntents.EXTRA_NAME, subject) putExtra(NoteIntents.EXTRA_TEXT, text) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void createNote(String subject, String text) { Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE) .putExtra(NoteIntents.EXTRA_NAME, subject) .putExtra(NoteIntents.EXTRA_TEXT, text); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.CREATE_NOTE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </activity>
تلفن
برقراری تماس یک اقدام رایج برای برنامه های تلفن است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
تماس تلفنی را آغاز کنید
برای باز کردن برنامه تلفن و شماره گیری یک شماره تلفن، از عملکرد ACTION_DIAL
استفاده کنید و با استفاده از طرح URI زیر شماره تلفنی را مشخص کنید. هنگامی که برنامه تلفن باز می شود، شماره تلفن را نمایش می دهد و کاربر باید برای شروع تماس تلفنی روی دکمه تماس ضربه بزند.
برای برقراری تماس تلفنی مستقیم، از عملکرد ACTION_CALL
استفاده کنید و با استفاده از طرح URI زیر یک شماره تلفن مشخص کنید. هنگامی که برنامه تلفن باز می شود، تماس تلفنی را شروع می کند. کاربر نیازی به ضربه زدن روی دکمه تماس ندارد.
عمل ACTION_CALL
نیاز دارد که مجوز CALL_PHONE
را به فایل مانیفست خود اضافه کنید:
<uses-permission android:name="android.permission.CALL_PHONE" />
شماره تلفن های معتبر آنهایی هستند که در IETF RFC 3966 تعریف شده اند. نمونه های معتبر شامل موارد زیر است:
شماره گیر برنامه Phone در عادی سازی طرح ها مانند شماره تلفن ها خوب است. بنابراین طرح توصیف شده در روش Uri.parse()
به شدت مورد نیاز نیست. با این حال، اگر طرحی را امتحان نکردهاید یا مطمئن نیستید که میتوان آن را مدیریت کرد، به جای آن از متد Uri.fromParts()
استفاده کنید.
قصد مثال:
کاتلین
fun dialPhoneNumber(phoneNumber: String) { val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void dialPhoneNumber(String phoneNumber) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
جستجو کنید
اقدامات زیر برای برنامههای جستجو، شامل اطلاعاتی است که برای ایجاد یک فیلتر قصد برای تبلیغ توانایی برنامهتان برای انجام هر عمل نیاز دارید.
با استفاده از یک برنامه خاص جستجو کنید
برای پشتیبانی از جستجو در زمینه برنامه خود، همانطور که در مثال فیلتر قصد زیر نشان داده شده است، یک فیلتر هدف در برنامه خود با عملکرد SEARCH_ACTION
اعلام کنید.
توجه: استفاده از SEARCH_ACTION
را برای جستجوی برنامه توصیه نمیکنیم. در عوض، اقدام GET_THING
را برای استفاده از پشتیبانی داخلی دستیار Google برای جستجوی درون برنامه اجرا کنید. برای اطلاعات بیشتر، به مستندات Google Assistant App Actions مراجعه کنید.
فیلتر قصد مثال:
<activity android:name=".SearchActivity"> <intent-filter> <action android:name="com.google.android.gms.actions.SEARCH_ACTION"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
جستجوی وب را انجام دهید
برای شروع جستجوی وب، از عمل ACTION_WEB_SEARCH
استفاده کنید و رشته جستجو را در SearchManager.QUERY
اضافی مشخص کنید.
قصد مثال:
کاتلین
fun searchWeb(query: String) { val intent = Intent(Intent.ACTION_WEB_SEARCH).apply { putExtra(SearchManager.QUERY, query) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void searchWeb(String query) { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, query); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
تنظیمات
برای باز کردن صفحهای در برنامه تنظیمات سیستم وقتی برنامه شما از کاربر میخواهد چیزی را تغییر دهد، از یکی از اقدامات هدف زیر استفاده کنید:
قصد مثال:
کاتلین
fun openWifiSettings() { val intent = Intent(Settings.ACTION_WIFI_SETTINGS) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void openWifiSettings() { Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
پیامک
نوشتن یک پیام SMS/MMS با پیوست یک اقدام رایج برای برنامه های پیام متنی است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک پیام SMS/MMS با پیوست بنویسید
برای شروع یک پیام متنی SMS یا MMS، از یکی از اقدامات هدف زیر استفاده کنید و جزئیات پیام مانند شماره تلفن، موضوع و متن پیام را با استفاده از کلیدهای اضافی زیر مشخص کنید.
قصد مثال:
کاتلین
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SENDTO).apply { type = HTTP.PLAIN_TEXT_TYPE putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType(HTTP.PLAIN_TEXT_TYPE); intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
اگر میخواهید مطمئن شوید که هدف شما فقط توسط یک برنامه پیامرسان متنی مدیریت میشود، و نه دیگر برنامههای ایمیل یا اجتماعی، از عملکرد ACTION_SENDTO
استفاده کنید و طرح داده "smsto:"
را همانطور که در مثال زیر نشان داده شده است وارد کنید:
کاتلین
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { data = Uri.parse("smsto:") // Only SMS apps respond to this. putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("smsto:")); // Only SMS apps respond to this. intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="text/plain" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
توجه: اگر در حال توسعه یک برنامه پیامرسانی SMS/MMS هستید، باید فیلترهای هدف را برای چندین اقدام دیگر پیادهسازی کنید تا بهعنوان برنامه پیشفرض پیامک در Android نسخه 4.4 و بالاتر در دسترس باشید. برای اطلاعات بیشتر، به مستندات در Telephony
مراجعه کنید.
مرورگر وب
بارگیری یک URL وب یک اقدام رایج برای برنامه های مرورگر وب است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.
یک URL وب را بارگیری کنید
برای باز کردن یک صفحه وب، از عملکرد ACTION_VIEW
استفاده کنید و URL وب را در دادههای intent مشخص کنید.
قصد مثال:
کاتلین
fun openWebPage(url: String) { val webpage: Uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, webpage) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
جاوا
public void openWebPage(String url) { Uri webpage = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, webpage); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
فیلتر قصد مثال:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <!-- Include the host attribute if you want your app to respond only to URLs with your app's domain. --> <data android:scheme="http" android:host="www.example.com" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The BROWSABLE category is required to get links from web pages. --> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> </activity>
نکته: اگر برنامه Android شما عملکردی مشابه وب سایت شما ارائه می دهد، یک فیلتر هدف برای URL هایی که به وب سایت شما اشاره می کنند قرار دهید. سپس، اگر کاربران برنامه شما را نصب کرده باشند، پیوندهایی از ایمیل ها یا سایر صفحات وب که به وب سایت شما اشاره می کنند، برنامه اندروید شما را به جای صفحه وب شما باز می کنند. در مدیریت پیوندهای برنامه Android بیشتر بیاموزید.
با شروع در Android 12 (سطح API 31)، یک هدف وب عمومی تنها در صورتی به یک فعالیت در برنامه شما تبدیل میشود که برنامه شما برای دامنه خاص موجود در آن هدف وب تأیید شده باشد. اگر برنامه شما برای دامنه تأیید نشده باشد، هدف وب به برنامه مرورگر پیشفرض کاربر حل میشود.
با Android Debug Bridge، اهداف را تأیید کنید
برای تأیید اینکه برنامه شما به اهدافی که میخواهید پشتیبانی کنید پاسخ میدهد، میتوانید از ابزار adb
برای شلیک مقاصد خاص با انجام کارهای زیر استفاده کنید:
برای اطلاعات بیشتر، به صدور دستورات پوسته مراجعه کنید.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2024-12-11 بهوقت ساعت هماهنگ جهانی.