مقاصد مشترک

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

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