مقاصد مشترک

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

وقتی شما startActivity() یا startActivityForResult() را فراخوانی می‌کنید و یک intent ضمنی به آن منتقل می‌کنید، سیستم intent را به برنامه‌ای که می‌تواند intent را مدیریت کند، منتقل می‌کند و Activity مربوطه را اجرا می‌کند. اگر بیش از یک برنامه وجود داشته باشد که می‌تواند intent را مدیریت کند، سیستم یک پنجره محاوره‌ای به کاربر نشان می‌دهد تا برنامه مورد نظر خود را انتخاب کند.

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

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

اگر با نحوه ایجاد intentها یا فیلترهای intent آشنا نیستید، ابتدا Intentها و Intent Filterها را مطالعه کنید.

برای یادگیری نحوه‌ی فعال کردن intent های لیست شده در این صفحه از میزبان توسعه‌ی خود، به بخش «تأیید intent ها با Android Debug Bridge» مراجعه کنید.

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

اقدامات صوتی گوگل برخی از اهداف ذکر شده در این صفحه را در پاسخ به دستورات صوتی اجرا می‌کند. برای اطلاعات بیشتر، به بخش «شروع به کار با اقدامات صوتی سیستم» مراجعه کنید.

ساعت زنگ دار

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

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

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

  • «ساعت ۷ صبح را تنظیم کن»

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

توجه: فقط گزینه‌های ساعت، دقیقه و پیام در اندروید ۲.۳ (سطح API ۹) و پایین‌تر در دسترس هستند. سایر موارد اضافی در نسخه‌های بالاتر پلتفرم موجود هستند.

اکشن
ACTION_SET_ALARM
آدرس داده
هیچکدام
نوع MIME
هیچکدام
موارد اضافی
EXTRA_HOUR
ساعت برای زنگ هشدار.
EXTRA_MINUTES
دقیقه برای زنگ هشدار.
EXTRA_MESSAGE
یک پیام سفارشی برای شناسایی زنگ هشدار.
EXTRA_DAYS
یک ArrayList شامل هر روز هفته که این زنگ هشدار در آن تکرار می‌شود. هر روز باید با یک عدد صحیح از کلاس Calendar ، مانند MONDAY ، تعریف شود.

برای آلارم‌های یک‌بار مصرف، این مورد اضافی را مشخص نکنید.

EXTRA_RINGTONE
یک content: آدرس اینترنتی (URI) که آهنگ زنگ مورد استفاده با زنگ هشدار را مشخص می‌کند، یا VALUE_RINGTONE_SILENT برای عدم وجود آهنگ زنگ.

برای استفاده از آهنگ زنگ پیش‌فرض، این مورد اضافی را مشخص نکنید.

EXTRA_VIBRATE
یک مقدار بولی که مشخص می‌کند آیا برای این هشدار لرزش ایجاد شود یا خیر.
EXTRA_SKIP_UI
یک مقدار بولی که مشخص می‌کند آیا برنامه‌ی پاسخ‌دهنده هنگام تنظیم زنگ هشدار باید از رابط کاربری خود صرف‌نظر کند یا خیر. اگر درست باشد، برنامه باید هرگونه رابط کاربری تأیید را نادیده گرفته و زنگ هشدار مشخص‌شده را تنظیم کند.

مثال قصد:

کاتلین

fun createAlarm(message: String, hour: Int, minutes: Int) {
    val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_HOUR, hour)
        putExtra(AlarmClock.EXTRA_MINUTES, minutes)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

جاوا

public void createAlarm(String message, int hour, int minutes) {
    Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_HOUR, hour)
            .putExtra(AlarmClock.EXTRA_MINUTES, minutes);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
توجه:

برای فراخوانی تابع ACTION_SET_ALARM ، برنامه شما باید مجوز SET_ALARM را داشته باشد:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

مثال فیلتر هدف:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SET_ALARM" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

ایجاد تایمر

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

  • «تنظیم تایمر برای ۵ دقیقه»

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

نکته: این intent در اندروید ۴.۴ (سطح API 19) و بالاتر موجود است.

اکشن
ACTION_SET_TIMER
آدرس داده
هیچکدام
نوع 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 استفاده کنید.

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

نکته: این intent در اندروید ۴.۴ (سطح API 19) و بالاتر موجود است.

اکشن
ACTION_SHOW_ALARMS
آدرس داده
هیچکدام
نوع MIME
هیچکدام

مثال فیلتر هدف:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SHOW_ALARMS" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

تقویم

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

افزودن رویداد تقویم

برای افزودن یک رویداد جدید به تقویم کاربر، از اکشن ACTION_INSERT استفاده کنید و URI داده را با استفاده از Events.CONTENT_URI مشخص کنید. سپس می‌توانید جزئیات مختلف رویداد را با استفاده از موارد اضافی زیر مشخص کنید.

اکشن
ACTION_INSERT
آدرس داده
Events.CONTENT_URI
نوع MIME
"vnd.android.cursor.dir/event"
موارد اضافی
EXTRA_EVENT_ALL_DAY
یک مقدار بولی که مشخص می‌کند آیا این یک رویداد تمام روز است یا خیر.
EXTRA_EVENT_BEGIN_TIME
زمان شروع رویداد (میلی ثانیه از زمان شروع).
EXTRA_EVENT_END_TIME
زمان پایان رویداد (میلی ثانیه از زمان شروع).
TITLE
عنوان رویداد.
DESCRIPTION
شرح رویداد.
EVENT_LOCATION
مکان رویداد.
EXTRA_EMAIL
فهرستی از آدرس‌های ایمیل که با کاما از هم جدا شده‌اند و دعوت‌شدگان را مشخص می‌کنند.

جزئیات رویدادهای بسیار بیشتری را می‌توان با استفاده از ثابت‌های تعریف‌شده در کلاس CalendarContract.EventsColumns مشخص کرد.

مثال قصد:

کاتلین

fun addEvent(title: String, location: String, begin: Long, end: Long) {
    val intent = Intent(Intent.ACTION_INSERT).apply {
        data = Events.CONTENT_URI
        putExtra(Events.TITLE, title)
        putExtra(Events.EVENT_LOCATION, location)
        putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
        putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

جاوا

public void addEvent(String title, String location, long begin, long end) {
    Intent intent = new Intent(Intent.ACTION_INSERT)
            .setData(Events.CONTENT_URI)
            .putExtra(Events.TITLE, title)
            .putExtra(Events.EVENT_LOCATION, location)
            .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
            .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

مثال فیلتر هدف:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.INSERT" />
        <data android:mimeType="vnd.android.cursor.dir/event" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

دوربین

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

عکس یا فیلم بگیرید و برگردانید

برای باز کردن برنامه دوربین و دریافت عکس یا ویدیوی حاصل، از اکشن‌های ACTION_IMAGE_CAPTURE یا ACTION_VIDEO_CAPTURE استفاده کنید. همچنین در EXTRA_OUTPUT extra، محل URI که می‌خواهید دوربین عکس یا ویدیو را در آن ذخیره کند را مشخص کنید.

اکشن
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.
        ...
    }
}

برای انجام این کار هنگام کار بر روی اندروید ۱۲ (سطح 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>

برای اطلاعات بیشتر در مورد نحوه استفاده از این intent برای گرفتن عکس، از جمله نحوه ایجاد یک Uri مناسب برای محل خروجی، بخش های Take photos یا Take videos را مطالعه کنید.

مثال فیلتر هدف:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

هنگام مدیریت این intent، activity خود را طوری تنظیم کنید که EXTRA_OUTPUT extra در Intent ورودی را بررسی کند، سپس تصویر یا ویدیوی گرفته شده را در مکانی که توسط آن extra مشخص شده است ذخیره کند و setResult() را با یک Intent که شامل یک تصویر کوچک فشرده شده در یک extra به نام "data" است، فراخوانی کند.

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

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

  • "عکس بگیر"

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

اکشن
INTENT_ACTION_STILL_IMAGE_CAMERA
طرح URI داده
هیچکدام
نوع MIME
هیچکدام
موارد اضافی
هیچکدام

مثال قصد:

کاتلین

private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // Display error state to the user.
    }
}

جاوا

public void capturePhoto(String targetFilename) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.withAppendedPath(locationForPhotos, targetFilename));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

مثال فیلتر هدف:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.STILL_IMAGE_CAMERA" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

اجرای برنامه دوربین در حالت فیلم‌برداری

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

  • "ضبط ویدیو"

برای باز کردن برنامه دوربین در حالت ویدیو، از اکشن INTENT_ACTION_VIDEO_CAMERA استفاده کنید.

اکشن
INTENT_ACTION_VIDEO_CAMERA
طرح URI داده
هیچکدام
نوع MIME
هیچکدام
موارد اضافی
هیچکدام

مثال قصد:

کاتلین

fun capturePhoto() {
    val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA)
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)
    }
}

جاوا

public void capturePhoto() {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

مثال فیلتر هدف:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.VIDEO_CAMERA" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

برنامه مخاطبین/افراد

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

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

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

نتیجه‌ی Intent که به تابع فراخوانی onActivityResult() شما ارسال می‌شود، حاوی content: URI که به مخاطب انتخاب شده اشاره می‌کند. این پاسخ به برنامه‌ی شما مجوزهای موقت برای خواندن آن مخاطب با استفاده از API ارائه‌دهنده‌ی مخاطبین اعطا می‌کند، حتی اگر برنامه‌ی شما مجوز READ_CONTACTS را نداشته باشد.

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

اکشن
ACTION_PICK
طرح URI داده
هیچکدام
نوع MIME
Contacts.CONTENT_TYPE

مثال قصد:

کاتلین

const val REQUEST_SELECT_CONTACT = 1

fun selectContact() {
    val intent = Intent(Intent.ACTION_PICK).apply {
        type = ContactsContract.Contacts.CONTENT_TYPE
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_SELECT_CONTACT)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
        val contactUri: Uri = data.data
        // Do something with the selected contact at contactUri.
        //...
    }
}

جاوا

static final int REQUEST_SELECT_CONTACT = 1;

public void selectContact() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_CONTACT);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
        Uri contactUri = data.getData();
        // Do something with the selected contact at contactUri.
        ...
    }
}

برای کسب اطلاعات در مورد نحوه بازیابی اطلاعات تماس پس از داشتن URI مخاطب، بخش «بازیابی جزئیات یک مخاطب» را مطالعه کنید.

وقتی URI مخاطب را با استفاده از این intent بازیابی می‌کنید، معمولاً برای خواندن جزئیات اولیه آن مخاطب، مانند نام نمایشی و اینکه آیا مخاطب ستاره‌دار است یا خیر، به مجوز READ_CONTACTS نیاز ندارید. با این حال، اگر می‌خواهید داده‌های خاص‌تری درباره یک مخاطب خاص - مانند شماره تلفن یا آدرس ایمیل آنها - بخوانید ، به مجوز READ_CONTACTS نیاز دارید.

انتخاب اطلاعات تماس خاص

برای اینکه کاربر بتواند اطلاعات خاصی از یک مخاطب، مانند شماره تلفن، آدرس ایمیل یا نوع داده دیگری را انتخاب کند، از اکشن ACTION_PICK استفاده کنید و نوع MIME را به یکی از انواع محتوای زیر، مانند CommonDataKinds.Phone.CONTENT_TYPE برای دریافت شماره تلفن مخاطب، مشخص کنید.

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

اگر نیاز دارید فقط یک نوع داده را از یک مخاطب بازیابی کنید، این تکنیک با یک CONTENT_TYPE از کلاس‌های ContactsContract.CommonDataKinds کارآمدتر از استفاده از Contacts.CONTENT_TYPE است، همانطور که در بخش قبل نشان داده شده است. نتیجه، دسترسی مستقیم به داده‌های مورد نظر را بدون نیاز به انجام یک پرس‌وجوی پیچیده‌تر به Contacts Provider فراهم می‌کند.

نتیجه‌ی Intent که به تابع فراخوانی onActivityResult() شما ارسال می‌شود، حاوی content: URI که به داده‌های مخاطب انتخاب شده اشاره می‌کند. این پاسخ به برنامه‌ی شما مجوزهای موقت برای خواندن داده‌های مخاطب می‌دهد، حتی اگر برنامه‌ی شما مجوز READ_CONTACTS را نداشته باشد.

اکشن
ACTION_PICK
طرح URI داده
هیچکدام
نوع MIME
CommonDataKinds.Phone.CONTENT_TYPE
از مخاطبین دارای شماره تلفن انتخاب کنید.
CommonDataKinds.Email.CONTENT_TYPE
از مخاطبین دارای آدرس ایمیل انتخاب کنید.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
از بین مخاطبین دارای آدرس پستی انتخاب کنید.

یا یکی از مقادیر CONTENT_TYPE فراوان دیگر در زیر ContactsContract .

مثال قصد:

کاتلین

const val REQUEST_SELECT_PHONE_NUMBER = 1

fun selectContact() {
    // Start an activity for the user to pick a phone number from contacts.
    val intent = Intent(Intent.ACTION_PICK).apply {
        type = CommonDataKinds.Phone.CONTENT_TYPE
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) {
        // Get the URI and query the content provider for the phone number.
        val contactUri: Uri = data.data
        val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER)
        contentResolver.query(contactUri, projection, null, null, null).use { cursor ->
            // If the cursor returned is valid, get the phone number.
            if (cursor.moveToFirst()) {
                val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER)
                val number = cursor.getString(numberIndex)
                // Do something with the phone number.
                ...
            }
        }
    }
}

جاوا

static final int REQUEST_SELECT_PHONE_NUMBER = 1;

public void selectContact() {
    // Start an activity for the user to pick a phone number from contacts.
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) {
        // Get the URI and query the content provider for the phone number.
        Uri contactUri = data.getData();
        String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(contactUri, projection,
                null, null, null);
        // If the cursor returned is valid, get the phone number.
        if (cursor != null && cursor.moveToFirst()) {
            int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
            String number = cursor.getString(numberIndex);
            // Do something with the phone number.
            //...
        }
    }
}

مشاهده یک مخاطب

برای نمایش جزئیات یک مخاطب شناخته شده، از اکشن ACTION_VIEW استفاده کنید و مخاطب را با یک URL با content: مشخص کنید.

دو روش اصلی برای بازیابی اولیه 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 استفاده کنید، مخاطب را با یک URL با content: به عنوان داده‌ی intent مشخص کنید، و هرگونه اطلاعات مخاطب شناخته شده را در موارد اضافی مشخص شده توسط ثابت‌ها در 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);
    }
}

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

درج مخاطب

برای درج یک مخاطب جدید، از اکشن 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>

ذخیره‌سازی فایل

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

بازیابی نوع خاصی از فایل

برای درخواست از کاربر برای انتخاب فایلی مانند سند یا عکس و بازگرداندن ارجاع به برنامه شما، از اکشن ACTION_GET_CONTENT استفاده کنید و نوع MIME مورد نظر خود را مشخص کنید. ارجاع فایلی که به برنامه شما بازگردانده می‌شود، در چرخه حیات فعلی اکتیویتی شما گذرا است، بنابراین اگر می‌خواهید بعداً به آن دسترسی داشته باشید، باید یک کپی از آن را وارد کنید که بتوانید بعداً آن را بخوانید.

این intent همچنین به کاربر اجازه می‌دهد تا در این فرآیند یک فایل جدید ایجاد کند. برای مثال، به جای انتخاب یک عکس موجود، کاربر می‌تواند یک عکس جدید با دوربین ثبت کند.

هدف نتیجه‌ای که به متد onActivityResult() شما ارسال می‌شود، شامل داده‌هایی با یک URI است که به فایل اشاره می‌کند. URI می‌تواند هر چیزی باشد، مانند http: URI، file: URI یا content: URI. با این حال، اگر می‌خواهید فایل‌های قابل انتخاب را فقط به فایل‌هایی محدود کنید که از یک ارائه‌دهنده محتوا ( content: URI) قابل دسترسی هستند و به عنوان یک جریان فایل با openFileDescriptor() در دسترس هستند، دسته CATEGORY_OPENABLE را به هدف خود اضافه کنید.

در اندروید ۴.۳ (سطح 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 ، هنگام اجرا در اندروید ۴.۴ یا بالاتر، می‌توانید با استفاده از اکشن ACTION_OPEN_DOCUMENT و مشخص کردن نوع MIME، درخواست باز کردن فایلی را بدهید که توسط برنامه دیگری مدیریت می‌شود. همچنین برای اینکه به کاربر اجازه دهید یک سند جدید ایجاد کند که برنامه شما بتواند در آن بنویسد، از اکشن ACTION_CREATE_DOCUMENT استفاده کنید.

برای مثال، به جای انتخاب از اسناد PDF موجود، هدف ACTION_CREATE_DOCUMENT به کاربران اجازه می‌دهد تا مکانی را که می‌خواهند یک سند جدید ایجاد کنند، مثلاً در برنامه دیگری که فضای ذخیره‌سازی سند را مدیریت می‌کند، انتخاب کنند. سپس برنامه شما مکان URI جایی را که می‌تواند سند جدید را بنویسد، دریافت می‌کند.

در حالی که intent ارسالی به متد onActivityResult() شما از اکشن ACTION_GET_CONTENT ممکن است هر نوع URI را برگرداند، intent نتیجه از 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() برگردانده می‌شود، بازیابی کنید.

نکته: intent شما باید یک نوع MIME را مشخص کند و باید دسته CATEGORY_OPENABLE را اعلام کند. در صورت لزوم، می‌توانید با اضافه کردن آرایه‌ای از انواع MIME با EXTRA_MIME_TYPES extra بیش از یک نوع 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 به یک intent پاسخ دهند. در عوض، سیستم این intent را دریافت کرده و تمام فایل‌های موجود از برنامه‌های مختلف را در یک رابط کاربری یکپارچه نمایش می‌دهد.

برای ارائه فایل‌های برنامه خود در این رابط کاربری و اجازه دادن به برنامه‌های دیگر برای باز کردن آنها، باید یک DocumentsProvider پیاده‌سازی کنید و یک فیلتر intent برای 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>

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

اقدامات محلی

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

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

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

  • «برای من تاکسی بگیر»
  • «به من ماشین بگو»

(فقط سیستم عامل Wear OS)

برای تماس با تاکسی، از اکشن ACTION_RESERVE_TAXI_RESERVATION استفاده کنید.

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

اکشن
ACTION_RESERVE_TAXI_RESERVATION
آدرس داده
هیچکدام
نوع MIME
هیچکدام
موارد اضافی
هیچکدام

مثال قصد:

کاتلین

fun callCar() {
    val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

جاوا

public void callCar() {
    Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

مثال فیلتر هدف:

<activity ...>
    <intent-filter>
        <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

نقشه‌ها

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

نمایش یک مکان روی نقشه

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

اکشن
ACTION_VIEW
طرح URI داده
geo: latitude , longitude
نقشه را در طول و عرض جغرافیایی داده شده نشان دهید.

مثال: "geo:47.6,-122.3"

geo: latitude , longitude ?z= zoom
نقشه را در طول و عرض جغرافیایی داده شده در یک سطح زوم مشخص نشان دهید. سطح زوم ۱، کل زمین را نشان می‌دهد که مرکز آن در عرض جغرافیایی داده شده قرار دارد. بالاترین (نزدیک‌ترین) سطح زوم ۲۳ است.

مثال: "geo:47.6,-122.3?z=11"

geo:0,0?q=lat,lng(label)
نقشه را در طول و عرض جغرافیایی داده شده با برچسب رشته‌ای نمایش دهید.

مثال: "geo:0,0?q=34.99,-106.61(Treasure)"

geo:0,0?q=my+street+address
نمایش موقعیت مکانی برای عبارت «آدرس خیابان من» که می‌تواند یک آدرس یا موقعیت مکانی خاص باشد.

مثال: "geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"

نکته: تمام رشته‌های ارسالی در geo URI) باید کدگذاری شوند. برای مثال، رشته 1st & Pike, Seattle به 1st%20%26%20Pike%2C%20Seattle تبدیل می‌شود. فاصله‌ها (spaces) در رشته با %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>

موسیقی یا ویدیو

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

پخش یک فایل رسانه‌ای

برای پخش یک فایل موسیقی، از اکشن ACTION_VIEW استفاده کنید و مکان URI فایل را در داده‌های intent مشخص کنید.

اکشن
ACTION_VIEW
طرح URI داده
file: <URI>
content: <URI>
http: <URL>
نوع MIME
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
یا هر چیز دیگری که برنامه شما به آن نیاز دارد.

مثال قصد:

کاتلین

fun playMedia(file: Uri) {
    val intent = Intent(Intent.ACTION_VIEW).apply {
        data = file
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

جاوا

public void playMedia(Uri file) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(file);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

مثال فیلتر هدف:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:type="audio/*" />
        <data android:type="application/ogg" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

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

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

  • «بیلی جین مایکل جکسون را بازی کن»

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

در این intent، رشته EXTRA_MEDIA_FOCUS را وارد کنید که حالت جستجوی مورد نظر را مشخص می‌کند. برای مثال، حالت جستجو می‌تواند مشخص کند که آیا جستجو برای نام هنرمند یا نام آهنگ است.

اکشن
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
طرح URI داده
هیچکدام
نوع MIME
هیچکدام
موارد اضافی
MediaStore.EXTRA_MEDIA_FOCUS (الزامی)

حالت جستجو را نشان می‌دهد: اینکه آیا کاربر به دنبال یک هنرمند، آلبوم، آهنگ یا لیست پخش خاص است. اکثر حالت‌های جستجو، موارد اضافی را نیز در بر می‌گیرند. برای مثال، اگر کاربر علاقه‌مند به گوش دادن به یک آهنگ خاص باشد، اینتنت ممکن است سه مورد اضافی دیگر نیز داشته باشد: عنوان آهنگ، هنرمند و آلبوم. این اینتنت از حالت‌های جستجوی زیر برای هر مقدار EXTRA_MEDIA_FOCUS پشتیبانی می‌کند:

هر کدام - "vnd.android.cursor.item/*"

هر موسیقی‌ای را پخش کنید. برنامه‌ی گیرنده بر اساس یک انتخاب هوشمندانه، مثلاً آخرین لیست پخشی که کاربر به آن گوش داده است، موسیقی پخش می‌کند.

موارد اضافی:

  • QUERY (الزامی): یک رشته خالی. این مقدار اضافی همیشه برای سازگاری با نسخه‌های قبلی ارائه می‌شود. برنامه‌های موجودی که از حالت‌های جستجو اطلاعی ندارند، می‌توانند این intent را به عنوان یک جستجوی بدون ساختار پردازش کنند.

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

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

مثال قصد:

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

کاتلین

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>

هنگام مدیریت این intent در activity خود، مقدار EXTRA_MEDIA_FOCUS extra را در Intent ورودی بررسی کنید تا حالت جستجو را تعیین کنید. هنگامی که activity شما حالت جستجو را شناسایی کرد، مقادیر extraهای اضافی را برای آن حالت جستجوی خاص بخوانید. با این اطلاعات، برنامه شما می‌تواند جستجو را در فهرست خود انجام دهد تا محتوایی را که با عبارت جستجو مطابقت دارد، پخش کند. این در مثال زیر نشان داده شده است.

کاتلین

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);
        }
    }
}

یادداشت جدید

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

ایجاد یادداشت

برای ایجاد یک یادداشت جدید، از اکشن 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>

تلفن

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

شروع یک تماس تلفنی

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

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

  • «با شماره ۵۵۵-۵۵۵۵ تماس بگیرید»
  • «به باب زنگ بزن»
  • «تماس با پست صوتی»

برای برقراری تماس تلفنی مستقیم، از اکشن 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);
    }
}

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

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

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

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

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

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

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

اکشن
ACTION_WEB_SEARCH
طرح URI داده
هیچکدام
نوع MIME
هیچکدام
موارد اضافی
SearchManager.QUERY
رشته جستجو.

مثال قصد:

کاتلین

fun searchWeb(query: String) {
    val intent = Intent(Intent.ACTION_WEB_SEARCH).apply {
        putExtra(SearchManager.QUERY, query)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

جاوا

public void searchWeb(String query) {
    Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
    intent.putExtra(SearchManager.QUERY, query);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

تنظیمات

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

اکشن
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS

برای صفحات تنظیمات اضافی که در دسترس هستند، به مستندات Settings مراجعه کنید.

طرح URI داده
هیچکدام
نوع MIME
هیچکدام

مثال قصد:

کاتلین

fun openWifiSettings() {
    val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

جاوا

public void openWifiSettings() {
    Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

پیام رسانی متنی

نوشتن یک پیام SMS/MMS به همراه یک پیوست، یک اقدام رایج برای برنامه‌های پیام‌رسان متنی است. با استفاده از اطلاعات موجود در بخش زیر، یک فیلتر intent ایجاد کنید تا توانایی برنامه خود را برای انجام این اقدام تبلیغ کنید.

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

مرورگر وب

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

بارگذاری یک URL وب

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

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

برای باز کردن یک صفحه وب، از اکشن ACTION_VIEW استفاده کنید و آدرس وب را در داده‌های 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>

نکته: اگر برنامه اندروید شما عملکردی مشابه وب‌سایت شما ارائه می‌دهد، یک فیلتر intent برای URLهایی که به وب‌سایت شما اشاره می‌کنند، قرار دهید. سپس، اگر کاربران برنامه شما را نصب کرده باشند، لینک‌هایی از ایمیل‌ها یا سایر صفحات وب که به وب‌سایت شما اشاره می‌کنند، به جای صفحه وب، برنامه اندروید شما را باز می‌کنند. برای اطلاعات بیشتر به مدیریت لینک‌های برنامه اندروید مراجعه کنید .

از اندروید ۱۲ (سطح API 31)، یک web intent عمومی فقط در صورتی به یک activity در برنامه شما resolve می‌شود که برنامه شما برای دامنه خاص موجود در آن web intent تأیید شده باشد. اگر برنامه شما برای دامنه تأیید نشده باشد، web intent به جای آن به برنامه مرورگر پیش‌فرض کاربر resolve می‌شود.

تأیید اهداف با Android Debug Bridge

برای تأیید اینکه برنامه شما به intent هایی که می خواهید پشتیبانی کنید پاسخ می دهد، می توانید با انجام موارد زیر از ابزار adb برای اجرای intent های خاص استفاده کنید:

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

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