مقاصد مشترک

یک 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 برخی از اهداف فهرست شده در این صفحه را در پاسخ به دستورات صوتی فعال می کند. برای اطلاعات بیشتر، شروع به کار با عملکردهای صوتی سیستم را ببینید.

ساعت زنگ دار

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

ایجاد زنگ هشدار

Google Voice Actions

  • "زنگ ساعت 7 صبح را تنظیم کنید"

برای ایجاد زنگ هشدار جدید، از عملکرد 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>

یک تایمر ایجاد کنید

Google Voice Actions

  • "تنظیم تایمر برای 5 دقیقه"

برای ایجاد یک تایمر شمارش معکوس، از عملکرد 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" است.

یک برنامه دوربین را در حالت تصویر ثابت راه اندازی کنید

Google Voice Actions

  • "عکس بگیر"

برای باز کردن یک برنامه دوربین در حالت تصویر ثابت، از عملکرد 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>

یک برنامه دوربین را در حالت فیلم راه اندازی کنید

Google Voice Actions

  • "ضبط ویدئو"

برای باز کردن یک برنامه دوربین در حالت ویدیو، از عملکرد 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 supports OpenableColumns
             and ContentResolver.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>

برای اطلاعات بیشتر درباره نحوه باز کردن فایل‌های مدیریت شده توسط برنامه‌تان از سایر برنامه‌ها، باز کردن فایل‌ها با استفاده از چارچوب دسترسی به فضای ذخیره‌سازی را بخوانید.

اقدامات محلی

تماس با ماشین یک اقدام محلی رایج است. یک فیلتر قصد ایجاد کنید تا توانایی برنامه خود را برای انجام این عمل با استفاده از اطلاعات بخش زیر تبلیغ کنید.

به ماشین زنگ بزن

Google Voice Actions

  • "برام تاکسی بگیر"
  • "من را ماشین صدا کن"

(فقط Wear OS)

برای تماس با تاکسی، از عملکرد 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>

پخش موسیقی بر اساس درخواست جستجو

Google Voice Actions

  • "بازی مایکل جکسون بیلی جین"

برای پخش موسیقی بر اساس یک عبارت جستجو، از هدف 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 (الزامی): رشته‌ای که حاوی ترکیبی از هنرمند، آلبوم، نام آهنگ یا ژانر است.

ژانر - Audio.Genres.ENTRY_CONTENT_TYPE

پخش موسیقی از یک سبک خاص.

موارد اضافی:

  • "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
رشته ای که متن یادداشت را نشان می دهد.

قصد مثال:

کاتلین

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 زیر شماره تلفنی را مشخص کنید. هنگامی که برنامه تلفن باز می شود، شماره تلفن را نمایش می دهد و کاربر باید برای شروع تماس تلفنی روی دکمه تماس ضربه بزند.

Google Voice Actions

  • "تماس با 555-5555"
  • "باب را صدا کن"
  • "تماس با پست صوتی"

برای برقراری تماس تلفنی مستقیم، از عملکرد ACTION_CALL استفاده کنید و با استفاده از طرح URI زیر یک شماره تلفن مشخص کنید. هنگامی که برنامه تلفن باز می شود، تماس تلفنی را شروع می کند. کاربر نیازی به ضربه زدن روی دکمه تماس ندارد.

عمل ACTION_CALL نیاز دارد که مجوز CALL_PHONE به فایل مانیفست خود اضافه کنید:

<uses-permission android:name="android.permission.CALL_PHONE" />
اقدام
  • ACTION_DIAL - شماره گیر یا برنامه تلفن را باز می کند.
  • ACTION_CALL - تماس تلفنی برقرار می کند (نیاز به مجوز CALL_PHONE دارد)
طرح داده URI
  • tel:<phone-number>
  • voicemail:<phone-number>
نوع MIME
هیچ کدام

شماره تلفن های معتبر آنهایی هستند که در IETF RFC 3966 تعریف شده اند. نمونه های معتبر شامل موارد زیر است:

  • tel:2125551212
  • tel:(212) 555 1212

شماره گیر برنامه 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);
    }
}

اقدامات زیر برای برنامه‌های جستجو، شامل اطلاعاتی است که برای ایجاد یک فیلتر قصد برای تبلیغ توانایی برنامه‌تان برای انجام هر عمل نیاز دارید.

با استفاده از یک برنامه خاص جستجو کنید

Google Voice Actions

  • "جستجوی ویدیوهای گربه در myvideoapp"

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

توجه: استفاده از SEARCH_ACTION را برای جستجوی برنامه توصیه نمی‌کنیم. در عوض، اقدام GET_THING را برای استفاده از پشتیبانی داخلی دستیار Google برای جستجوی درون برنامه اجرا کنید. برای اطلاعات بیشتر، به مستندات Google Assistant App Actions مراجعه کنید.

اقدام
"com.google.android.gms.actions.SEARCH_ACTION"
از عبارت‌های جستجوی Google Voice Actions پشتیبانی کنید.
موارد اضافی
QUERY
رشته ای که شامل عبارت جستجو می شود.

فیلتر قصد مثال:

<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 اضافی مشخص کنید.

اقدام
ACTION_WEB_SEARCH
طرح داده URI
هیچ کدام
نوع MIME
هیچ کدام
موارد اضافی
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);
    }
}

تنظیمات

برای باز کردن صفحه‌ای در برنامه تنظیمات سیستم وقتی برنامه شما از کاربر می‌خواهد چیزی را تغییر دهد، از یکی از اقدامات هدف زیر استفاده کنید:

اقدام
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
هیچ کدام

قصد مثال:

کاتلین

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، از یکی از اقدامات هدف زیر استفاده کنید و جزئیات پیام مانند شماره تلفن، موضوع و متن پیام را با استفاده از کلیدهای اضافی زیر مشخص کنید.

اقدام
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 است که به تصاویر یا ویدیوهایی برای پیوست اشاره می کند.

قصد مثال:

کاتلین

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 وب را بارگیری کنید

Google Voice Actions

  • "باز کردن example.com"

برای باز کردن یک صفحه وب، از عملکرد ACTION_VIEW استفاده کنید و URL وب را در داده‌های intent مشخص کنید.

اقدام
ACTION_VIEW
طرح داده URI
http: <URL>
https: <URL>
نوع MIME
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

قصد مثال:

کاتلین

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 برای شلیک مقاصد خاص با انجام کارهای زیر استفاده کنید:

  1. یک دستگاه Android را برای توسعه تنظیم کنید یا از یک دستگاه مجازی استفاده کنید.
  2. نسخه ای از برنامه خود را نصب کنید که اهداف مورد نظر شما را پشتیبانی می کند.
  3. با استفاده از 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
    
  4. اگر فیلترهای هدف مورد نیاز را تعریف می کنید، intent را مدیریت کنید.

برای اطلاعات بیشتر، به صدور دستورات پوسته مراجعه کنید.

،

یک هدف به شما امکان می دهد با توصیف عملی که می خواهید انجام دهید ، مانند "مشاهده نقشه" یا "عکس گرفتن" در یک شیء Intent ، فعالیت خود را در یک برنامه دیگر شروع کنید. این نوع قصد یک هدف ضمنی نامیده می شود زیرا مؤلفه برنامه را برای شروع مشخص نمی کند ، اما در عوض یک عمل را مشخص می کند و برخی از داده ها را برای انجام عمل ارائه می دهد.

هنگامی که شما شروع به کار startActivity() یا startActivityForResult() می کنید و یک هدف ضمنی را منتقل می کنید ، سیستم قصد برنامه ای را که می تواند هدف را اداره کند و Activity مربوطه را شروع می کند ، حل می کند. اگر بیش از یک برنامه وجود داشته باشد که بتواند هدف را اداره کند ، سیستم گفتگو را به کاربر ارائه می دهد تا از کدام برنامه استفاده کند.

در این صفحه چندین هدف ضمنی توضیح داده شده است که می توانید از آنها برای انجام اقدامات مشترک استفاده کنید ، که بر اساس نوع برنامه ای که هدف را انجام می دهد ، سازماندهی شده است. هر بخش همچنین نشان می دهد که چگونه می توانید یک فیلتر قصد برای تبلیغ توانایی برنامه خود در انجام عمل ایجاد کنید.

احتیاط: اگر هیچ برنامه ای در دستگاه وجود نداشته باشد که بتواند قصد ضمنی را دریافت کند ، یک برنامه هنگام تماس با startActivity() خراب می شود. برای اولین بار تأیید کنید که یک برنامه برای دریافت هدف وجود دارد ، resolveActivity() در مورد Intent خود تماس بگیرید. اگر نتیجه غیر تهی باشد ، حداقل یک برنامه وجود دارد که می تواند هدف را اداره کند ، و به راحتی می توان از آن استفاده startActivity() . اگر نتیجه تهی است ، از قصد استفاده نکنید و در صورت امکان ویژگی ای را که از هدف استفاده می کند غیرفعال کنید.

اگر با نحوه ایجاد فیلترهای هدف یا قصد آشنا نیستید ، ابتدا اهداف و فیلترهای قصد را بخوانید.

برای یادگیری نحوه آتش سوزی اهداف ذکر شده در این صفحه از میزبان توسعه خود ، به بخش تأیید با بخش Bridge Android Debug Bridge مراجعه کنید.

اقدامات صوتی گوگل

Google Voice Actions برخی از اهداف ذکر شده در این صفحه را در پاسخ به دستورات صوتی شلیک می کند. برای اطلاعات بیشتر ، به شروع با اقدامات صوتی سیستم مراجعه کنید.

ساعت زنگ دار

موارد زیر اقدامات متداول برای برنامه های ساعت زنگ دار ، از جمله اطلاعات مورد نیاز برای ایجاد یک فیلتر قصد برای تبلیغ توانایی برنامه خود در انجام هر عمل است.

ایجاد زنگ هشدار

اقدامات صوتی گوگل

  • "زنگ هشدار را برای 7 صبح تنظیم کنید"

برای ایجاد هشدار جدید ، از عمل ACTION_SET_ALARM استفاده کنید و جزئیات زنگ مانند زمان و پیام را با استفاده از موارد اضافی زیر مشخص کنید.

توجه: فقط ساعت ، دقیقه و پیام های اضافی پیام در Android 2.3 (API سطح 9) و پایین تر در دسترس است. موارد اضافی دیگر در نسخه های بالاتر سکو موجود است.

اقدام
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 تأیید استفاده کند و زنگ مشخص را تنظیم کند.

هدف مثال:

کاتلین

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>

یک تایمر ایجاد کنید

اقدامات صوتی گوگل

  • "تایمر را به مدت 5 دقیقه تنظیم کنید"

برای ایجاد تایمر شمارش معکوس ، از عمل ACTION_SET_TIMER استفاده کرده و جزئیات تایمر مانند مدت زمان را با استفاده از موارد اضافی زیر مشخص کنید.

توجه: این هدف در Android 4.4 (API سطح 19) و بالاتر موجود است.

اقدام
ACTION_SET_TIMER
داده ها
هیچ کدام
نوع MIME
هیچ کدام
موارد اضافی
EXTRA_LENGTH
طول تایمر در ثانیه.
EXTRA_MESSAGE
یک پیام سفارشی برای شناسایی تایمر.
EXTRA_SKIP_UI
بولی که مشخص می کند آیا برنامه پاسخ دهنده باید هنگام تنظیم تایمر از رابط کاربری خود استفاده کند. در صورت صحت ، برنامه باید از هرگونه 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 Action استفاده کنید.

اگرچه بسیاری از برنامه ها از این هدف استفاده نمی کنند ، زیرا در درجه اول توسط برنامه های سیستم استفاده می شود ، هر برنامه ای که به عنوان یک ساعت زنگ دار رفتار می کند می تواند این فیلتر هدف را پیاده سازی کرده و با نشان دادن لیست زنگ های فعلی پاسخ دهد.

توجه: این هدف در Android 4.4 (API سطح 19) و بالاتر موجود است.

اقدام
ACTION_SHOW_ALARMS
داده ها
هیچ کدام
نوع MIME
هیچ کدام

مثال فیلتر قصد:

<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 مشخص کنید. سپس می توانید جزئیات مختلف رویداد را با استفاده از موارد اضافی زیر مشخص کنید.

اقدام
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 مشخص کرد.

هدف مثال:

کاتلین

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) یا بالاتر ، به مثال هدف زیر مراجعه کنید.

هدف مثال:

کاتلین

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 استفاده کنید.

اقدام
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 Action استفاده کنید و نوع MIME را به Contacts.CONTENT_TYPE مشخص کنید. content_type.

نتیجه Intent به onActivityResult() پاسخ داده شده شامل content: URI با اشاره به تماس انتخاب شده. پاسخ به برنامه شما اجازه می دهد تا با استفاده از 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 ، 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 شامل نشود.

اقدام
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 Action استفاده کرده و تماس با یک 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 Action استفاده کنید ، تماس با یک 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);
    }
}

برای کسب اطلاعات بیشتر در مورد نحوه ویرایش مخاطب ، مخاطبین را با استفاده از اهداف اصلاح کنید.

یک مخاطب وارد کنید

برای وارد ContactsContract.Intents.Insert یک مخاطب جدید ، از ACTION_INSERT Action استفاده کنید ، Contacts.CONTENT_TYPE مشخص کنید.

اقدام
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);
    }
}

برای کسب اطلاعات بیشتر در مورد نحوه وارد کردن مخاطب ، مخاطبین را با استفاده از اهداف اصلاح کنید.

ایمیل

آهنگسازی یک ایمیل با پیوست های اختیاری یک اقدام مشترک برای برنامه های ایمیل است. برای تبلیغ توانایی برنامه خود در انجام این عمل با استفاده از اطلاعات در بخش زیر ، یک فیلتر قصد ایجاد کنید.

یک ایمیل با پیوست های اختیاری ایجاد کنید

برای تهیه یک ایمیل ، از یکی از اقدامات زیر بر اساس اینکه ضمیمه ها را شامل می شوید یا خیر ، استفاده کنید و جزئیات ایمیل مانند گیرنده و موضوع را با استفاده از کلیدهای اضافی ذکر شده درج کنید.

اقدام
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 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() برگشته است ، دسترسی پیدا کنید.

اقدام
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 supports OpenableColumns
             and ContentResolver.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() روی "*/*" تنظیم کنید.

اقدام
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 به هدف پاسخ دهند. در عوض ، سیستم این هدف را دریافت می کند و تمام پرونده های موجود از برنامه های مختلف را در یک رابط کاربری یکپارچه نشان می دهد.

برای ارائه پرونده های برنامه خود در این 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 استفاده کنید.

توجه: برنامه ها قبل از انجام این عمل باید از کاربر تأیید کنند.

اقدام
ACTION_RESERVE_TAXI_RESERVATION
داده ها
هیچ کدام
نوع 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 استفاده کرده و اطلاعات مکان را در داده های قصد با یکی از طرح های زیر مشخص کنید.

اقدام
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 باید رمزگذاری شوند. به عنوان مثال ، String 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 Action استفاده کرده و مکان URI پرونده را در داده های هدف مشخص کنید.

اقدام
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 Extra را درج کنید ، که حالت جستجوی در نظر گرفته شده را مشخص می کند. به عنوان مثال ، حالت جستجو می تواند مشخص کند که آیا جستجو برای نام هنرمند یا نام آهنگ است یا خیر.

اقدام
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 (مورد نیاز): رشته ای که شامل هر ترکیبی از هنرمند ، آلبوم ، نام آهنگ یا ژانر است.

ژانر - Audio.Genres.ENTRY_CONTENT_TYPE

موسیقی یک ژانر خاص را پخش کنید.

موارد اضافی اضافی:

  • "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 یا عنوان است. این اضافی همیشه برای سازگاری عقب مانده ارائه می شود. برنامه های موجود که در مورد حالت های جستجو آگاهی ندارند می توانند این هدف را به عنوان یک جستجوی بدون ساختار پردازش کنند.

هدف مثال:

اگر کاربر بخواهد از یک هنرمند خاص به موسیقی گوش کند ، یک برنامه جستجو ممکن است قصد زیر را ایجاد کند:

کاتلین

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 استفاده کرده و جزئیات یادداشت مانند موضوع و متن را با استفاده از موارد اضافی زیر مشخص کنید.

توجه: برنامه ها قبل از انجام این عمل باید از کاربر تأیید کنند.

اقدام
ACTION_CREATE_NOTE
طرح URI
هیچ کدام
نوع MIME
PLAIN_TEXT_TYPE
"*/*"
موارد اضافی
EXTRA_NAME
رشته ای که عنوان یا موضوع یادداشت را نشان می دهد.
EXTRA_TEXT
رشته ای که متن یادداشت را نشان می دهد.

هدف مثال:

کاتلین

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 زیر مشخص کنید. هنگامی که برنامه تلفن باز می شود ، شماره تلفن را نشان می دهد و کاربر برای شروع تماس تلفنی باید روی دکمه تماس ضربه بزند.

اقدامات صوتی گوگل

  • "با 555-5555 تماس بگیرید"
  • "با باب تماس بگیر"
  • "با پیام صوتی تماس بگیرید"

برای برقراری تماس تلفنی مستقیم ، از ACTION_CALL Action استفاده کرده و شماره تلفن را با استفاده از طرح URI زیر مشخص کنید. وقتی برنامه تلفن باز می شود ، تماس تلفنی را شروع می کند. کاربر نیازی به ضربه زدن به دکمه تماس ندارد.

عمل ACTION_CALL نیاز دارد که مجوز CALL_PHONE را به پرونده مانیفست خود اضافه کنید:

<uses-permission android:name="android.permission.CALL_PHONE" />
اقدام
  • ACTION_DIAL - شماره گیری یا برنامه تلفن را باز می کند.
  • ACTION_CALL - یک تماس تلفنی را انجام می دهد (به مجوز CALL_PHONE نیاز دارد)
طرح URI
  • tel:<phone-number>
  • voicemail:<phone-number>
نوع MIME
هیچ کدام

شماره تلفن های معتبر مواردی هستند که در IETF RFC 3966 تعریف شده اند. مثالهای معتبر شامل موارد زیر است:

  • tel:2125551212
  • tel:(212) 555 1212

شماره گیری برنامه تلفن در عادی سازی طرح ها مانند شماره تلفن خوب است. بنابراین طرح شرح داده شده کاملاً در روش 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);
    }
}

موارد زیر اقدامات متداول برای برنامه های جستجو است ، از جمله اطلاعات مورد نیاز برای ایجاد یک فیلتر قصد برای تبلیغ توانایی برنامه خود در انجام هر عمل.

با استفاده از یک برنامه خاص جستجو کنید

اقدامات صوتی گوگل

  • "جستجوی فیلم های گربه در MyVideoApp"

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

توجه: ما برای جستجوی برنامه از SEARCH_ACTION استفاده نمی کنیم. درعوض ، اقدام GET_THING را برای استفاده از پشتیبانی داخلی Google Assistant برای جستجوی درون برنامه اجرا کنید. برای اطلاعات بیشتر ، به مستندات اقدامات برنامه Google Assistant مراجعه کنید.

اقدام
"com.google.android.gms.actions.SEARCH_ACTION"
پشتیبانی از پرس و جوهای جستجو از اقدامات صوتی Google.
موارد اضافی
QUERY
رشته ای که شامل پرس و جو جستجو است.

مثال فیلتر قصد:

<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 مشخص کنید.

اقدام
ACTION_WEB_SEARCH
طرح URI
هیچ کدام
نوع MIME
هیچ کدام
موارد اضافی
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);
    }
}

تنظیمات

برای باز کردن صفحه در برنامه تنظیمات سیستم هنگامی که برنامه شما به کاربر نیاز دارد تا چیزی را تغییر دهد ، از یکی از اقدامات هدف زیر استفاده کنید:

اقدام
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
هیچ کدام

هدف مثال:

کاتلین

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 ، از یکی از اقدامات هدف زیر استفاده کنید و جزئیات پیام مانند شماره تلفن ، موضوع و بدن پیام را با استفاده از کلیدهای اضافی زیر مشخص کنید.

اقدام
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 است که به تصاویر یا فیلم ها برای ضمیمه اشاره می کنند.

هدف مثال:

کاتلین

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 وب را بارگیری کنید

اقدامات صوتی گوگل

  • "باز کردن مثال. com"

برای باز کردن یک صفحه وب ، از ACTION_VIEW Action استفاده کرده و URL وب را در داده های قصد مشخص کنید.

اقدام
ACTION_VIEW
طرح URI
http: <URL>
https: <URL>
نوع MIME
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

هدف مثال:

کاتلین

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 برای آتش زدن اهداف خاص استفاده کنید:

  1. یک دستگاه Android را برای توسعه تنظیم کنید یا از یک دستگاه مجازی استفاده کنید.
  2. نسخه ای از برنامه خود را نصب کنید که از اهداف مورد نظر برای پشتیبانی استفاده می کند.
  3. با استفاده از 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
    
  4. اگر فیلترهای هدف مورد نیاز را تعریف کردید ، قصد را انجام دهید.

برای اطلاعات بیشتر ، به دستورات صدور پوسته مراجعه کنید.