یک 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
تعیین کنید تا شماره تلفن مخاطب را دریافت کنید.
توجه: در بسیاری از موارد، برنامه شما نیاز به مجوز 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
- داده ها
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
EXTRA_HOUR
- ساعت زنگ هشدار.
-
EXTRA_MINUTES
- دقیقه برای زنگ هشدار.
-
EXTRA_MESSAGE
- یک پیام سفارشی برای شناسایی زنگ هشدار.
-
EXTRA_DAYS
- یک
ArrayList
شامل هر هفته که این زنگ هشدار در آن تکرار می شود. هر روز باید با یک عدد صحیح از کلاسCalendar
، مانندMONDAY
اعلام شود.برای یک زنگ هشدار ، این اضافی را مشخص نکنید.
-
EXTRA_RINGTONE
- یک
content:
URI مشخص کردن آهنگ زنگ برای استفاده با زنگ یاVALUE_RINGTONE_SILENT
برای بدون آهنگ زنگ.برای استفاده از آهنگ زنگ پیش فرض ، این موارد اضافی را مشخص نکنید.
-
EXTRA_VIBRATE
- بولی که مشخص می کند برای این زنگ هشدار ارتعاش می کند.
-
EXTRA_SKIP_UI
- بولی که مشخص می کند آیا برنامه پاسخ دهنده باید هنگام تنظیم زنگ ، از رابط کاربری خود استفاده کند. در صورت صحت ، برنامه باید از هرگونه UI تأیید استفاده کند و زنگ مشخص را تنظیم کند.
-
- اقدام
-
ACTION_SET_TIMER
- داده ها
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
-
EXTRA_LENGTH
- طول تایمر در ثانیه.
-
EXTRA_MESSAGE
- یک پیام سفارشی برای شناسایی تایمر.
-
EXTRA_SKIP_UI
- بولی که مشخص می کند آیا برنامه پاسخ دهنده باید هنگام تنظیم تایمر از رابط کاربری خود استفاده کند. در صورت صحت ، برنامه باید از هرگونه UI تأیید استفاده کند و تایمر مشخص شده را شروع کند.
-
- اقدام
-
ACTION_SHOW_ALARMS
- داده ها
- هیچ کدام
- نوع MIME
- هیچ کدام
- اقدام
-
ACTION_INSERT
- داده ها
-
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
- داده ها
- هیچ کدام
- نوع MIME
- هیچ کدام
- موارد اضافی
- هیچ کدام
- اقدام
-
ACTION_VIEW
- طرح URI
-
geo: latitude , longitude
- نقشه را در طول و عرض جغرافیایی داده شده نشان دهید.
مثال:
"geo:47.6,-122.3"
-
geo: latitude , longitude ?z= zoom
- نقشه را در طول و عرض جغرافیایی داده شده در سطح بزرگنمایی خاص نشان دهید. سطح بزرگنمایی 1 کل زمین را نشان می دهد ، با محوریت LNG ، 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"
توجه: تمام رشته های منتقل شده در
geo
Uri باید رمزگذاری شوند. به عنوان مثال ، String1st & 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
(مورد نیاز) حالت جستجو را نشان می دهد: آیا کاربر به دنبال یک هنرمند خاص ، آلبوم ، آهنگ یا لیست پخش است. بیشتر حالت های جستجو اضافی اضافی را می گیرند. به عنوان مثال ، اگر کاربر علاقه مند به گوش دادن به یک آهنگ خاص باشد ، ممکن است سه مورد اضافی دیگر نیز داشته باشد: عنوان آهنگ ، The Artist و آلبوم. این هدف از حالت های جستجوی زیر برای هر مقدار از
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
(مورد نیاز): رشته ای که شامل هر ترکیبی از آلبوم ، The Artist ، The Genre یا عنوان است. این اضافی همیشه برای سازگاری عقب مانده ارائه می شود. برنامه های موجود که در مورد حالت های جستجو آگاهی ندارند می توانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
لیست پخش -
Audio.Playlists.ENTRY_CONTENT_TYPE
یک لیست پخش خاص یا لیست پخش را بازی کنید که با برخی معیارهای مشخص شده توسط موارد اضافی اضافی مطابقت داشته باشد.
موارد اضافی اضافی:
-
EXTRA_MEDIA_ALBUM
: آلبوم. -
EXTRA_MEDIA_ARTIST
: هنرمند. -
"android.intent.extra.genre"
: ژانر. -
"android.intent.extra.playlist"
: لیست پخش. -
EXTRA_MEDIA_TITLE
: نام آهنگ که لیست پخش بر اساس آن ساخته شده است. -
QUERY
(مورد نیاز): رشته ای که شامل هر ترکیبی از آلبوم ، The Artist ، The Genre ، The Playlist یا عنوان است. این اضافی همیشه برای سازگاری عقب مانده ارائه می شود. برنامه های موجود که در مورد حالت های جستجو آگاهی ندارند می توانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.
-
-
- اقدام
-
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.
-
- موارد اضافی
-
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
قصد آتش سوزی را آتش بزنید: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
- اگر فیلترهای هدف مورد نیاز را تعریف کردید ، قصد را انجام دهید.
قصد مثال:
کاتلین
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
، فعالیت خود را در یک برنامه دیگر شروع کنید. این نوع قصد یک هدف ضمنی نامیده می شود زیرا مؤلفه برنامه را برای شروع مشخص نمی کند ، اما در عوض یک عمل را مشخص می کند و برخی از داده ها را برای انجام عمل ارائه می دهد.
هنگامی که شما شروع به کار startActivity()
یا startActivityForResult()
می کنید و یک هدف ضمنی را منتقل می کنید ، سیستم قصد برنامه ای را که می تواند هدف را اداره کند و Activity
مربوطه را شروع می کند ، حل می کند. اگر بیش از یک برنامه وجود داشته باشد که بتواند هدف را اداره کند ، سیستم گفتگو را به کاربر ارائه می دهد تا از کدام برنامه استفاده کند.
در این صفحه چندین هدف ضمنی توضیح داده شده است که می توانید از آنها برای انجام اقدامات مشترک استفاده کنید ، که بر اساس نوع برنامه ای که هدف را انجام می دهد ، سازماندهی شده است. هر بخش همچنین نشان می دهد که چگونه می توانید یک فیلتر قصد برای تبلیغ توانایی برنامه خود در انجام عمل ایجاد کنید.
احتیاط: اگر هیچ برنامه ای در دستگاه وجود نداشته باشد که بتواند قصد ضمنی را دریافت کند ، یک برنامه هنگام تماس با startActivity()
خراب می شود. برای اولین بار تأیید کنید که یک برنامه برای دریافت هدف وجود دارد ، resolveActivity()
در مورد Intent
خود تماس بگیرید. اگر نتیجه غیر تهی باشد ، حداقل یک برنامه وجود دارد که می تواند هدف را اداره کند ، و به راحتی می توان از آن استفاده startActivity()
. اگر نتیجه تهی است ، از قصد استفاده نکنید و در صورت امکان ویژگی ای را که از هدف استفاده می کند غیرفعال کنید.
اگر با نحوه ایجاد فیلترهای هدف یا قصد آشنا نیستید ، ابتدا اهداف و فیلترهای قصد را بخوانید.
برای یادگیری نحوه آتش سوزی اهداف ذکر شده در این صفحه از میزبان توسعه خود ، به بخش تأیید با بخش Bridge Android Debug Bridge مراجعه کنید.
اقدامات صوتی گوگل
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
استفاده کرده و جزئیات تایمر مانند مدت زمان را با استفاده از موارد اضافی زیر مشخص کنید.
توجه: این هدف در Android 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
Action استفاده کنید.
اگرچه بسیاری از برنامه ها از این هدف استفاده نمی کنند ، زیرا در درجه اول توسط برنامه های سیستم استفاده می شود ، هر برنامه ای که به عنوان یک ساعت زنگ دار رفتار می کند می تواند این فیلتر هدف را پیاده سازی کرده و با نشان دادن لیست زنگ های فعلی پاسخ دهد.
توجه: این هدف در Android 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
Action استفاده کرده و داده URI را با استفاده از Events.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) یا بالاتر ، به مثال هدف زیر مراجعه کنید.
هدف مثال:
کاتلین
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>
هنگام رسیدگی به این هدف ، فعالیت خود را برای EXTRA_OUTPUT
Extra در Intent
ورودی بررسی کنید ، سپس تصویر یا فیلم ضبط شده را در مکان مشخص شده توسط آن Extra و Call 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
Action استفاده کنید و نوع MIME را به Contacts.CONTENT_TYPE
مشخص کنید. content_type.
نتیجه Intent
به onActivityResult()
پاسخ داده شده شامل content:
URI با اشاره به تماس انتخاب شده. پاسخ به برنامه شما اجازه می دهد تا با استفاده از 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 ، REARIEVE DETROLS را برای یک تماس بخوانید.
هنگامی که URI تماس را با استفاده از این هدف بازیابی می کنید ، به طور کلی نیازی به مجوز READ_CONTACTS
برای خواندن جزئیات اساسی برای آن مخاطب ، مانند نام نمایش و اینکه آیا مخاطب نقش دارد ، ندارید. با این حال ، اگر می خواهید داده های خاص تری را در مورد یک تماس داده شده - مانند شماره تلفن یا آدرس ایمیل آنها - بخوانید - به اجازه READ_CONTACTS
نیاز دارید.
داده های تماس خاص را انتخاب کنید
برای اینکه کاربر اطلاعات خاصی را از یک مخاطب انتخاب کند ، مانند شماره تلفن ، آدرس ایمیل یا سایر نوع داده ها ، از ACTION_PICK
Action استفاده کرده و نوع MIME را به یکی از انواع محتوای زیر ، مانند CommonDataKinds.Phone.CONTENT_TYPE
مشخص کنید تا شماره تلفن مخاطب را دریافت کنید.
توجه: در بسیاری از موارد ، برنامه شما برای مشاهده اطلاعات خاص در مورد یک تماس خاص ، باید مجوز READ_CONTACTS
داشته باشد.
در صورت نیاز به بازیابی فقط یک نوع داده از یک مخاطب ، این تکنیک با یک CONTENT_TYPE
از کلاس های ContactsContract.CommonDataKinds
نسبت به استفاده Contacts.CONTENT_TYPE
کارآمدتر است. همانطور که در بخش قبلی نشان داده شده است. نتیجه دسترسی مستقیم به داده های مورد نظر را بدون نیاز به شما برای انجام یک پرس و جو پیچیده تر برای ارائه دهنده مخاطبین فراهم می کند.
نتیجه 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
Action استفاده کرده و تماس با یک 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
Action استفاده کنید ، تماس با یک 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); } }
برای کسب اطلاعات بیشتر در مورد نحوه ویرایش مخاطب ، مخاطبین را با استفاده از اهداف اصلاح کنید.
یک مخاطب وارد کنید
برای وارد ContactsContract.Intents.Insert
یک مخاطب جدید ، از ACTION_INSERT
Action استفاده کنید ، Contacts.CONTENT_TYPE
مشخص کنید.
هدف مثال:
کاتلین
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); } }
برای کسب اطلاعات بیشتر در مورد نحوه وارد کردن مخاطب ، مخاطبین را با استفاده از اهداف اصلاح کنید.
ایمیل
آهنگسازی یک ایمیل با پیوست های اختیاری یک اقدام مشترک برای برنامه های ایمیل است. برای تبلیغ توانایی برنامه خود در انجام این عمل با استفاده از اطلاعات در بخش زیر ، یک فیلتر قصد ایجاد کنید.
یک ایمیل با پیوست های اختیاری ایجاد کنید
برای تهیه یک ایمیل ، از یکی از اقدامات زیر بر اساس اینکه ضمیمه ها را شامل می شوید یا خیر ، استفاده کنید و جزئیات ایمیل مانند گیرنده و موضوع را با استفاده از کلیدهای اضافی ذکر شده درج کنید.
هدف مثال:
کاتلین
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
Action استفاده کنید و نوع MIME مورد نظر خود را مشخص کنید. مرجع پرونده بازگشت به برنامه شما به چرخه عمر فعلی فعالیت شما گذرا است ، بنابراین اگر می خواهید بعداً به آن دسترسی پیدا کنید ، باید نسخه ای را که بعداً می توانید بخوانید وارد کنید.
این هدف همچنین به کاربر اجازه می دهد تا یک پرونده جدید را در این فرآیند ایجاد کند. به عنوان مثال ، به جای انتخاب یک عکس موجود ، کاربر می تواند یک عکس جدید را با دوربین ضبط کند.
هدف نتیجه ای که به روش onActivityResult()
شما ارائه می شود شامل داده هایی با URI است که به پرونده اشاره می کند. URI می تواند هر چیزی باشد ، مانند http:
URI ، file:
URI یا content:
URI. با این حال ، اگر می خواهید پرونده های قابل انتخاب را فقط به مواردی که از یک ارائه دهنده محتوا ( content:
URI) در دسترس هستند محدود کنید و به عنوان جریان فایل با openFileDescriptor()
در دسترس هستند ، دسته CATEGORY_OPENABLE
را به هدف خود اضافه کنید.
در Android 4.3 (API سطح 18) و بالاتر ، همچنین می توانید به کاربر اجازه دهید چندین فایل را با اضافه کردن EXTRA_ALLOW_MULTIPLE
به قصد ، 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
Action ، هنگام اجرای Android 4.4 یا بالاتر ، به برنامه خود وارد کنید ، می توانید در عوض بخواهید با استفاده از اقدام ACTION_OPEN_DOCUMENT
و تعیین نوع MIME ، پرونده ای را که توسط یک برنامه دیگر مدیریت شده است ، باز کنید . همچنین به کاربر اجازه دهید یک سند جدید ایجاد کند که برنامه شما بتواند برای آن بنویسد ، به جای آن از عمل ACTION_CREATE_DOCUMENT
استفاده کنید.
به عنوان مثال ، به جای انتخاب از اسناد PDF موجود ، ACTION_CREATE_DOCUMENT
به کاربران این امکان را می دهد تا جایی را که دوست دارند یک سند جدید ایجاد کنند ، مانند برنامه دیگری که مدیریت ذخیره سند را انتخاب می کند ، انتخاب کنند. سپس برنامه شما محل URI را در جایی که می تواند سند جدید را بنویسد ، دریافت می کند.
در حالی که قصد تحویل شده به روش onActivityResult()
از عمل ACTION_GET_CONTENT
ممکن است URI از هر نوع را برگرداند ، نتیجه نتیجه از ACTION_OPEN_DOCUMENT
و ACTION_CREATE_DOCUMENT
همیشه پرونده انتخاب شده را به عنوان یک content:
URI که توسط یک DocumentsProvider
ارائه می شود. می توانید پرونده را با openFileDescriptor()
باز کنید و جزئیات آن را با استفاده از ستون های DocumentsContract.Document
پرس و جو کنید.
URI برگشتی به برنامه شما دسترسی طولانی مدت به پرونده ، همچنین احتمالاً با دسترسی به نوشتن اعطا می کند. عمل ACTION_OPEN_DOCUMENT
به ویژه هنگامی که می خواهید یک فایل موجود را بخوانید بدون ایجاد کپی در برنامه خود یا هنگامی که می خواهید یک پرونده را در محل خود باز و ویرایش کنید ، بسیار مفید است.
همچنین می توانید با اضافه کردن EXTRA_ALLOW_MULTIPLE
به 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
به هدف پاسخ دهند. در عوض ، سیستم این هدف را دریافت می کند و تمام پرونده های موجود از برنامه های مختلف را در یک رابط کاربری یکپارچه نشان می دهد.
برای ارائه پرونده های برنامه خود در این UI و اجازه دهید برنامه های دیگر آنها را باز کنید ، شما باید یک 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
Action استفاده کرده و اطلاعات مکان را در داده های قصد با یکی از طرح های زیر مشخص کنید.
هدف مثال:
کاتلین
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
Action استفاده کرده و مکان URI پرونده را در داده های هدف مشخص کنید.
هدف مثال:
کاتلین
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
Extra را درج کنید ، که حالت جستجوی در نظر گرفته شده را مشخص می کند. به عنوان مثال ، حالت جستجو می تواند مشخص کند که آیا جستجو برای نام هنرمند یا نام آهنگ است یا خیر.
هدف مثال:
اگر کاربر بخواهد از یک هنرمند خاص به موسیقی گوش کند ، یک برنامه جستجو ممکن است قصد زیر را ایجاد کند:
کاتلین
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
Extra را در 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 استفاده کرده و جزئیات یادداشت مانند موضوع و متن را با استفاده از موارد اضافی زیر مشخص کنید.
توجه: برنامه ها قبل از انجام این عمل باید از کاربر تأیید کنند.
هدف مثال:
کاتلین
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
Action استفاده کرده و شماره تلفن را با استفاده از طرح URI زیر مشخص کنید. هنگامی که برنامه تلفن باز می شود ، شماره تلفن را نشان می دهد و کاربر برای شروع تماس تلفنی باید روی دکمه تماس ضربه بزند.
برای برقراری تماس تلفنی مستقیم ، از ACTION_CALL
Action استفاده کرده و شماره تلفن را با استفاده از طرح URI زیر مشخص کنید. وقتی برنامه تلفن باز می شود ، تماس تلفنی را شروع می کند. کاربر نیازی به ضربه زدن به دکمه تماس ندارد.
عمل ACTION_CALL
نیاز دارد که مجوز CALL_PHONE
را به پرونده مانیفست خود اضافه کنید:
<uses-permission android:name="android.permission.CALL_PHONE" />
شماره تلفن های معتبر مواردی هستند که در IETF RFC 3966 تعریف شده اند. مثالهای معتبر شامل موارد زیر است:
شماره گیری برنامه تلفن در عادی سازی طرح ها مانند شماره تلفن خوب است. بنابراین طرح شرح داده شده کاملاً در روش 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 Assistant برای جستجوی درون برنامه اجرا کنید. برای اطلاعات بیشتر ، به مستندات اقدامات برنامه Google Assistant مراجعه کنید.
مثال فیلتر قصد:
<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
Action استفاده کنید و رشته جستجو را در SearchManager.QUERY
Extra مشخص کنید.
هدف مثال:
کاتلین
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); } }
پیامک
آهنگسازی پیام پیام کوتاه/MMS با پیوست یک اقدام مشترک برای برنامه های پیام رسانی است. برای تبلیغ توانایی برنامه خود در انجام این عمل با استفاده از اطلاعات در بخش زیر ، یک فیلتر قصد ایجاد کنید.
پیام پیامکی/MMS را با پیوست تشکیل دهید
برای شروع پیام متنی پیام کوتاه یا 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
Action استفاده کرده و URL وب را در داده های قصد مشخص کنید.
هدف مثال:
کاتلین
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 بیشتر بیاموزید.
با شروع در Android 12 (API سطح 31) ، یک هدف وب عمومی فقط در صورتی که برنامه شما برای دامنه خاص موجود در آن قصد وب تأیید شود ، به فعالیتی در برنامه شما برطرف می شود. اگر برنامه شما برای دامنه تأیید نشده باشد ، به جای آن ، هدف وب به برنامه مرورگر پیش فرض کاربر برطرف می شود.
اهداف را با پل اشکال زدایی اندرویدی تأیید کنید
برای تأیید اینکه برنامه شما به نیتی که می خواهید از آنها پشتیبانی کنید پاسخ می دهد ، می توانید با انجام موارد زیر از ابزار adb
برای آتش زدن اهداف خاص استفاده کنید:
برای اطلاعات بیشتر ، به دستورات صدور پوسته مراجعه کنید.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-06-11 بهوقت ساعت هماهنگ جهانی.