Intent umum

Intent memungkinkan Anda memulai aktivitas di aplikasi lain dengan menjelaskan tindakan yang ingin Anda lakukan, seperti "melihat peta" atau "ambil gambar," dalam objek Intent. Jenis intent ini disebut intent implisit karena tidak menetapkan aplikasi untuk memulai, tetapi menentukan tindakan dan memberikan beberapa data yang akan digunakan untuk melakukan tindakan.

Saat Anda menelepon startActivity() atau startActivityForResult() dan meneruskan intent implisit ke sistem, menyelesaikan intent ke aplikasi yang dapat menangani intent tersebut dan memulai Activity yang sesuai. Jika ada lebih dari satu aplikasi yang bisa menangani intent tersebut, sistem akan menyajikan dialog kepada pengguna memilih aplikasi yang akan digunakan.

Halaman ini menjelaskan beberapa intent implisit yang bisa Anda gunakan untuk melakukan tindakan umum, yang disusun menurut jenis aplikasi yang menangani intent. Masing-masing juga menunjukkan cara membuat intent filter untuk memberitahukan kemampuan aplikasi Anda dalam melakukan tindakan tersebut.

Perhatian: Jika tidak ada aplikasi di perangkat yang dapat menerima intent implisit, aplikasi akan error saat memanggil startActivity(). Untuk memverifikasi terlebih dahulu bahwa aplikasi tersedia untuk menerima intent, panggil resolveActivity() pada objek Intent Anda. Jika hasilnya bukan {i>null<i}, setidaknya satu aplikasi yang dapat menangani intent, dan aman untuk memanggil startActivity(). Jika hasilnya adalah null, jangan gunakan intent tersebut dan, jika memungkinkan, nonaktifkan fitur yang memanggil intent tersebut.

Jika Anda tidak memahami cara membuat intent atau filter intent, baca Intent dan Intent terlebih dahulu Filter.

Untuk mempelajari cara mengaktifkan intent yang tercantum pada halaman ini dari pengembangan Anda lihat dokumentasi Memverifikasi intent dengan Android Debug Jembatan.

Google Voice Actions

Google Voice Tindakan mengaktifkan beberapa intent yang tercantum di halaman ini sebagai respons terhadap perintah suara. Untuk informasi selengkapnya, lihat Mulai Menggunakan Voice Actions Sistem.

Jam alarm

Berikut adalah tindakan umum untuk aplikasi jam alarm, termasuk informasi yang Anda perlukan untuk membuat filter intent guna memberitahukan kemampuan aplikasi Anda dalam melakukan setiap tindakan.

Membuat alarm

Google Voice Actions

  • "setel alarm untuk jam 7 pagi"

Untuk membuat alarm baru, gunakan ACTION_SET_ALARM dan menetapkan detail alarm seperti waktu dan pesan menggunakan tambahan berikut.

Catatan: Hanya tambahan jam, menit, dan pesan yang tersedia di Android 2.3 (API level 9) dan yang lebih rendah. Tambahan lainnya tersedia dalam versi yang lebih tinggi dari terkelola sepenuhnya.

Tindakan
ACTION_SET_ALARM
URI Data
Tidak ada
Jenis MIME
Tidak ada
Tambahan
EXTRA_HOUR
Jam untuk alarm.
EXTRA_MINUTES
Menit untuk alarm.
EXTRA_MESSAGE
Pesan khusus untuk mengidentifikasi alarm.
EXTRA_DAYS
ArrayList termasuk setiap hari kerja saat alarm ini berulang. Setiap hari harus dideklarasikan dengan bilangan bulat dari Calendar , seperti MONDAY.

Untuk alarm satu kali, jangan tentukan tambahan ini.

EXTRA_RINGTONE
URI content: yang menentukan nada dering yang akan digunakan dengan alarm, atau VALUE_RINGTONE_SILENT jika tidak ada nada dering.

Untuk menggunakan nada dering default, jangan tetapkan tambahan ini.

EXTRA_VIBRATE
Boolean yang menentukan apakah akan bergetar untuk alarm ini.
EXTRA_SKIP_UI
Boolean yang menentukan apakah aplikasi yang merespons harus melewati UI-nya saat menyetel alarm. Jika benar, aplikasi harus mengabaikan UI konfirmasi dan menyetel alarm yang ditentukan.

Contoh intent:

Kotlin

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

Java

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

Untuk memanggil intent ACTION_SET_ALARM, aplikasi Anda harus memiliki Izin SET_ALARM:

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

Contoh filter intent:

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

Membuat timer

Google Voice Actions

  • "setel timer selama 5 menit"

Untuk membuat penghitung mundur, gunakan tindakan ACTION_SET_TIMER dan tentukan timer detail seperti durasi menggunakan tambahan berikut.

Catatan: Intent ini tersedia di Android 4.4 (level API 19) dan yang lebih tinggi.

Tindakan
ACTION_SET_TIMER
URI Data
Tidak ada
Jenis MIME
Tidak ada
Tambahan
EXTRA_LENGTH
Durasi timer dalam detik.
EXTRA_MESSAGE
Pesan kustom untuk mengidentifikasi timer.
EXTRA_SKIP_UI
Boolean yang menentukan apakah aplikasi yang merespons harus melewati UI-nya saat menyetel timer. Jika true (benar), aplikasi harus mengabaikan UI konfirmasi dan memulai timer yang ditentukan.

Contoh intent:

Kotlin

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

Java

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

Untuk memanggil intent ACTION_SET_TIMER, aplikasi Anda harus memiliki Izin SET_ALARM:

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

Contoh filter intent:

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

Menampilkan semua alarm

Untuk menampilkan daftar alarm, gunakan ACTION_SHOW_ALARMS tindakan.

Meskipun tidak banyak aplikasi yang memanggil intent ini, karena terutama digunakan oleh aplikasi sistem, aplikasi apa pun yang berperilaku sebagai jam alarm dapat mengimplementasikan filter intent ini dan merespons dengan menampilkan daftar alarm saat ini.

Catatan: Intent ini tersedia di Android 4.4 (level API 19) dan yang lebih tinggi.

Tindakan
ACTION_SHOW_ALARMS
URI Data
Tidak ada
Jenis MIME
Tidak ada

Contoh filter intent:

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

Kalender

Menambahkan acara adalah tindakan umum untuk aplikasi kalender. Buat filter intent untuk memberitahukan kemampuan aplikasi Anda dalam melakukan tindakan ini menggunakan informasi di bagian berikut.

Menambahkan kejadian kalender

Untuk menambahkan acara baru ke kalender pengguna, gunakan ACTION_INSERT dan tetapkan URI data menggunakan Events.CONTENT_URI. Kemudian Anda dapat menetapkan berbagai detail acara menggunakan tambahan berikut.

Tindakan
ACTION_INSERT
URI Data
Events.CONTENT_URI
Jenis MIME
"vnd.android.cursor.dir/event"
Tambahan
EXTRA_EVENT_ALL_DAY
Boolean yang menentukan apakah peristiwa ini berlangsung sepanjang hari.
EXTRA_EVENT_BEGIN_TIME
Waktu mulai peristiwa (milidetik sejak epoch).
EXTRA_EVENT_END_TIME
Waktu berakhir peristiwa (milidetik sejak epoch).
TITLE
Judul acara.
DESCRIPTION
Deskripsi acara.
EVENT_LOCATION
Lokasi acara.
EXTRA_EMAIL
Daftar alamat email yang dipisahkan koma untuk menentukan tamu undangan.

Banyak detail kejadian lainnya yang bisa ditetapkan dengan menggunakan konstanta yang didefinisikan dalam Class CalendarContract.EventsColumns.

Contoh intent:

Kotlin

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

Java

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

Contoh filter 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>

Kamera

Berikut adalah tindakan umum untuk aplikasi kamera, termasuk informasi yang Anda perlukan untuk membuat filter intent guna memberitahukan kemampuan aplikasi Anda dalam melakukan setiap tindakan.

Memotret atau merekam video dan mengembalikannya

Untuk membuka aplikasi kamera dan menerima foto atau video yang dihasilkan, gunakan tindakan ACTION_IMAGE_CAPTURE atau ACTION_VIDEO_CAPTURE. Tentukan juga lokasi URI tempat Anda akan seperti kamera untuk menyimpan foto atau video, di EXTRA_OUTPUT tambahan.

Tindakan
ACTION_IMAGE_CAPTURE atau
ACTION_VIDEO_CAPTURE
Skema URI Data
Tidak ada
Jenis MIME
Tidak ada
Tambahan
EXTRA_OUTPUT
Lokasi URI tempat aplikasi kamera menyimpan foto atau file video (sebagai objek Uri).

Saat aplikasi kamera berhasil ditampilkan berfokus pada aktivitas—dengan kata lain, aplikasi akan menerima callback onActivityResult()—Anda dapat mengakses foto atau video di URI yang Anda tentukan dengan nilai EXTRA_OUTPUT.

Catatan: Jika Anda menggunakan ACTION_IMAGE_CAPTURE untuk mengambil foto, kamera mungkin juga mengembalikan salinan atau thumbnail foto yang diperkecil dalam hasil Intent, yang disimpan sebagai Bitmap dalam kolom ekstra bernama "data".

Contoh intent:

Kotlin

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.
        ...
    }
}

Java

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.
        ...
    }
}

Untuk melakukannya saat menggunakan Android 12 (API level 31) atau yang lebih baru, lihat contoh intent berikut.

Contoh intent:

Kotlin

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.
    }
}

Java

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>

Untuk informasi selengkapnya tentang cara menggunakan intent ini untuk mengambil foto, termasuk cara membuat Uri yang sesuai untuk lokasi output, baca Ambil foto atau Ambil video.

Contoh filter intent:

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

Saat menangani intent ini, minta aktivitas Anda memeriksa tambahan EXTRA_OUTPUT dalam Intent yang masuk, lalu simpan gambar atau video yang diambil di lokasi yang ditentukan oleh tambahan tersebut, lalu panggil setResult() dengan Intent yang menyertakan thumbnail terkompresi dalam bernama "data".

Memulai aplikasi kamera dalam mode gambar diam

Google Voice Actions

  • "ambil foto"

Untuk membuka aplikasi kamera dalam mode gambar diam, gunakan tindakan INTENT_ACTION_STILL_IMAGE_CAMERA.

Tindakan
INTENT_ACTION_STILL_IMAGE_CAMERA
Skema URI Data
Tidak ada
Jenis MIME
Tidak ada
Tambahan
Tidak ada

Contoh intent:

Kotlin

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.
    }
}

Java

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

Contoh filter intent:

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

Memulai aplikasi kamera dalam mode video

Google Voice Actions

  • "rekam video"

Untuk membuka aplikasi kamera dalam mode video, gunakan tindakan INTENT_ACTION_VIDEO_CAMERA.

Tindakan
INTENT_ACTION_VIDEO_CAMERA
Skema URI Data
Tidak ada
Jenis MIME
Tidak ada
Tambahan
Tidak ada

Contoh intent:

Kotlin

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

Java

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

Contoh filter intent:

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

Aplikasi kontak/orang

Berikut adalah tindakan umum untuk aplikasi pengelolaan kontak, termasuk informasi yang Anda perlukan untuk membuat filter intent guna memberitahukan kemampuan aplikasi Anda dalam melakukan setiap tindakan.

Pilih kontak

Agar pengguna memilih kontak dan memberi aplikasi Anda akses ke semua informasi kontak, gunakan tindakan ACTION_PICK dan tetapkan jenis MIME untuk Contacts.CONTENT_TYPE.

Hasil Intent yang dikirimkan ke callback onActivityResult() berisi URI content: yang mengarah ke kontak yang dipilih. Respons memberikan izin sementara aplikasi Anda untuk membaca kontak tersebut menggunakan Contacts Provider API, meskipun aplikasi Anda tidak menyertakan izin READ_CONTACTS.

Tips: Jika Anda memerlukan akses hanya ke kontak tertentu seperti nomor telepon atau alamat email. Lihat bagian berikutnya tentang cara pilih data kontak tertentu.

Tindakan
ACTION_PICK
Skema URI Data
Tidak ada
Jenis MIME
Contacts.CONTENT_TYPE

Contoh intent:

Kotlin

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.
        //...
    }
}

Java

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.
        ...
    }
}

Untuk informasi tentang cara mengambil detail kontak setelah Anda memiliki URI kontak, baca Mengambil detail kontak.

Saat mengambil URI kontak menggunakan intent ini, Anda biasanya tidak memerlukan READ_CONTACTS izin akses untuk membaca detail dasar kontak tersebut, seperti nama tampilan dan apakah kontak berbintang. Namun, jika Anda mencoba membaca data yang lebih spesifik tentang kontak tertentu—seperti nomor telepon atau alamat email mereka—Anda memerlukan READ_CONTACTS izin akses.

Memilih data kontak tertentu

Untuk meminta pengguna memilih informasi tertentu dari kontak, seperti nomor telepon, alamat email, atau jenis data lainnya, gunakan Tindakan ACTION_PICK dan menentukan jenis MIME ke satu dari jenis konten berikut, seperti CommonDataKinds.Phone.CONTENT_TYPE untuk mendapatkan nomor telepon kontak.

Catatan: Dalam banyak kasus, aplikasi Anda harus memiliki READ_CONTACTS izin untuk melihat informasi khusus tentang kontak tertentu.

Jika Anda hanya perlu mengambil satu jenis data dari sebuah kontak, teknik ini dengan CONTENT_TYPE dari Class ContactsContract.CommonDataKinds lebih efisien daripada menggunakan Contacts.CONTENT_TYPE, seperti yang ditunjukkan di bagian sebelumnya. Hasilnya memberi Anda akses ke data yang diinginkan tanpa mengharuskan Anda melakukan kueri yang lebih kompleks ke Penyedia Kontak.

Hasil Intent yang dikirimkan ke callback onActivityResult() berisi URI content: yang mengarah ke data kontak yang dipilih. Respons memberikan aplikasi Anda akan memberikan izin sementara untuk membaca data kontak tersebut meskipun aplikasi tidak menyertakan izin READ_CONTACTS.

Tindakan
ACTION_PICK
Skema URI Data
Tidak ada
Jenis MIME
CommonDataKinds.Phone.CONTENT_TYPE
Pilih dari kontak dengan nomor telepon.
CommonDataKinds.Email.CONTENT_TYPE
Memilih dari kontak dengan alamat email.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
Pilih dari kontak dengan alamat pos.

Atau salah satu dari banyak nilai CONTENT_TYPE lainnya di bawah ContactsContract.

Contoh intent:

Kotlin

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.
                ...
            }
        }
    }
}

Java

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.
            //...
        }
    }
}

Melihat kontak

Untuk menampilkan detail kontak yang dikenal, gunakan ACTION_VIEW dan menetapkan kontak dengan URI content: sebagai data intent.

Ada dua cara utama untuk mengambil URI kontak terlebih dahulu:

  • Gunakan URI kontak yang ditampilkan oleh tindakan ACTION_PICK yang ditunjukkan di bagian sebelumnya. Pendekatan ini tidak memerlukan izin aplikasi apa pun.
  • Akses daftar semua kontak secara langsung, seperti yang dijelaskan dalam Mengambil daftar kontak. Pendekatan ini memerlukan READ_CONTACTS izin akses.
Tindakan
ACTION_VIEW
Skema URI Data
content:<URI>
Jenis MIME
Tidak ada. Jenis ini diambil dari URI kontak.

Contoh intent:

Kotlin

fun viewContact(contactUri: Uri) {
    val intent = Intent(Intent.ACTION_VIEW, contactUri)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void viewContact(Uri contactUri) {
    Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Mengedit kontak yang ada

Untuk mengedit kontak yang dikenal, gunakan ACTION_EDIT menentukan kontak dengan URI content: sebagai data maksud, dan menyertakan informasi kontak apa pun yang diketahui dalam tambahan yang ditetapkan oleh konstanta di ContactsContract.Intents.Insert.

Ada dua cara utama untuk mengambil URI kontak terlebih dahulu:

  • Gunakan URI kontak yang ditampilkan oleh tindakan ACTION_PICK yang ditunjukkan di bagian sebelumnya. Pendekatan ini tidak memerlukan izin aplikasi apa pun.
  • Akses daftar semua kontak secara langsung, seperti yang dijelaskan dalam Mengambil daftar kontak. Pendekatan ini memerlukan READ_CONTACTS izin akses.
Tindakan
ACTION_EDIT
Skema URI Data
content:<URI>
Jenis MIME
Jenis ini disimpulkan dari URI kontak.
Tambahan
Satu atau beberapa tambahan yang ditentukan di ContactsContract.Intents.Insert sehingga Anda dapat mengisi kolom detail kontak.

Contoh intent:

Kotlin

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

Java

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

Untuk informasi selengkapnya tentang cara mengedit kontak, baca Mengubah kontak kontak menggunakan intent.

Menyisipkan kontak

Untuk menyisipkan kontak baru, gunakan tindakan ACTION_INSERT, tentukan Contacts.CONTENT_TYPE sebagai jenis MIME, dan menyertakan semua informasi kontak yang diketahui dalam tambahan yang ditentukan oleh konstanta di ContactsContract.Intents.Insert.

Tindakan
ACTION_INSERT
Skema URI Data
Tidak ada
Jenis MIME
Contacts.CONTENT_TYPE
Tambahan
Satu atau beberapa tambahan yang ditentukan dalam ContactsContract.Intents.Insert.

Contoh intent:

Kotlin

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

Java

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

Untuk informasi selengkapnya tentang cara menyisipkan kontak, baca Mengubah kontak menggunakan intent.

Email

Menulis email dengan lampiran opsional adalah tindakan umum untuk aplikasi email. Buat filter intent untuk memberitahukan kemampuan aplikasi Anda dalam melakukan tindakan ini menggunakan informasi di bagian berikut.

Menulis email dengan lampiran opsional

Untuk menulis email, gunakan salah satu tindakan berikut berdasarkan apakah Anda akan menyertakan lampiran atau tidak, dan sertakan detail email, seperti penerima dan subjek, menggunakan kunci tambahan yang tercantum.

Tindakan
ACTION_SENDTO (jika tanpa lampiran) atau
ACTION_SEND (untuk satu lampiran) atau
ACTION_SEND_MULTIPLE (untuk beberapa lampiran)
Skema URI Data
Tidak ada
Jenis MIME
"text/plain"
"*/*"
Tambahan
Intent.EXTRA_EMAIL
Array string dari semua "To" alamat email penerima.
Intent.EXTRA_CC
Array string semua "CC" alamat email penerima.
Intent.EXTRA_BCC
Array string semua "BCC" alamat email penerima.
Intent.EXTRA_SUBJECT
String dengan subjek email.
Intent.EXTRA_TEXT
String dengan isi email.
Intent.EXTRA_STREAM
Uri yang mengarah ke lampiran. Jika menggunakan ACTION_SEND_MULTIPLE , ini adalah ArrayList berisi beberapa objek Uri.

Contoh intent:

Kotlin

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

Java

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

Jika Anda ingin memastikan bahwa intent Anda hanya ditangani oleh aplikasi email, dan bukan pesan teks atau aplikasi sosial, lalu gunakan tindakan ACTION_SENDTO dan sertakan skema data "mailto:" seperti yang ditunjukkan dalam contoh berikut:

Kotlin

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

Java

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

Contoh filter 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>

Penyimpanan file

Berikut adalah tindakan umum untuk aplikasi penyimpanan file, termasuk informasi yang Anda perlukan untuk membuat filter intent guna memberitahukan kemampuan aplikasi Anda dalam melakukan setiap tindakan.

Mengambil tipe file tertentu

Untuk meminta pengguna memilih file, seperti dokumen atau foto, dan menampilkan referensi aplikasi Anda, gunakan tindakan ACTION_GET_CONTENT dan tentukan Jenis MIME. Referensi file yang ditampilkan ke aplikasi Anda bersifat sementara dengan aktivitas saat ini {i>siklus proses<i}, jadi jika Anda ingin mengaksesnya nanti, Anda harus mengimpor salinan yang dapat Anda baca nanti.

Intent ini juga memungkinkan pengguna membuat file baru dalam prosesnya. Sebagai sebagai ganti memilih foto yang sudah ada, pengguna dapat mengambil foto baru dengan kamera.

Intent hasil yang dikirim ke metode onActivityResult() Anda menyertakan data dengan URI yang mengarah ke file tersebut. URI dapat berupa apa pun, seperti URI http:, URI file:, atau content: URI. Namun, jika Anda ingin membatasi file yang dapat dipilih hanya untuk file yang dapat diakses dari penyedia konten (URI content:) dan yang tersedia sebagai aliran file dengan openFileDescriptor(), tambahkan kategori CATEGORY_OPENABLE sesuai niat Anda.

Pada Android 4.3 (level API 18) dan yang lebih tinggi, Anda juga dapat memungkinkan pengguna memilih beberapa file dengan menambahkan EXTRA_ALLOW_MULTIPLE ke intent, ditetapkan ke true. Anda kemudian dapat mengakses setiap file yang dipilih di ClipData objek yang ditampilkan oleh getClipData().

Tindakan
ACTION_GET_CONTENT
Skema URI Data
Tidak ada
Jenis MIME
Jenis MIME yang sesuai dengan jenis file yang harus dipilih pengguna.
Tambahan
EXTRA_ALLOW_MULTIPLE
Boolean yang mendeklarasikan apakah pengguna dapat memilih lebih dari satu file sekaligus.
EXTRA_LOCAL_ONLY
Boolean yang mendeklarasikan apakah file yang ditampilkan harus tersedia langsung dari perangkat, daripada memerlukan download dari layanan jarak jauh.
Kategori (opsional)
CATEGORY_OPENABLE
Untuk menampilkan hanya "dapat dibuka" file yang dapat direpresentasikan sebagai aliran file dengan openFileDescriptor().

Contoh intent untuk mengambil foto:

Kotlin

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.
        ...
    }
}

Java

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.
        ...
    }
}

Contoh filter intent untuk menampilkan foto:

<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>

Membuka tipe file tertentu

Sebagai ganti mengambil salinan file yang harus Anda impor ke aplikasi, dengan menggunakan tindakan ACTION_GET_CONTENT, saat berjalan di Android 4.4 atau lebih tinggi, Anda dapat meminta untuk membuka file yang dikelola oleh aplikasi lain dengan menggunakan tindakan ACTION_OPEN_DOCUMENT dan menentukan jenis MIME. Agar pengguna juga dapat membuat dokumen baru yang dapat menjadi tujuan penulisan aplikasi Anda, gunakan tindakan ACTION_CREATE_DOCUMENT.

Misalnya, daripada memilih dari dokumen PDF yang sudah ada, ACTION_CREATE_DOCUMENT memungkinkan pengguna memilih tempat mereka ingin membuat dokumen baru, seperti dalam aplikasi lain yang mengelola penyimpanan dokumen. Aplikasi Anda kemudian menerima lokasi URI tempat dapat menulis dokumen baru.

Sedangkan intent dikirim ke onActivityResult() dari tindakan ACTION_GET_CONTENT mungkin menampilkan URI jenis apa pun, intent yang dihasilkan dari ACTION_OPEN_DOCUMENT dan ACTION_CREATE_DOCUMENT selalu menentukan file yang dipilih sebagai URI content: yang didukung oleh DocumentsProvider. Anda dapat membuka file dengan openFileDescriptor() dan membuat kueri detailnya menggunakan kolom dari DocumentsContract.Document.

URI yang ditampilkan memberi aplikasi Anda akses baca jangka panjang ke file tersebut, mungkin juga dengan akses tulis. Tindakan ACTION_OPEN_DOCUMENT adalah sangat berguna jika Anda ingin membaca file yang ada tanpa membuat salinan di dalam aplikasi atau saat Anda ingin membuka dan mengedit file di tempat.

Anda juga dapat memungkinkan pengguna memilih beberapa file dengan menambahkan EXTRA_ALLOW_MULTIPLE ke intent, ditetapkan ke true. Jika pengguna hanya memilih satu item, Anda dapat mengambil item tersebut dari getData(). Jika pengguna memilih lebih dari satu item, getData() akan menampilkan null dan Anda harus mengambil setiap item dari ClipData yang ditampilkan oleh getClipData().

Catatan: Intent Anda harus menetapkan jenis MIME dan harus mendeklarasikan kategori CATEGORY_OPENABLE. Jika sesuai, Anda bisa menetapkan lebih dari satu tipe MIME dengan menambahkan satu larik tipe MIME bersama EXTRA_MIME_TYPES tambahan. Jika melakukannya, Anda harus menyetel jenis MIME utama dalam setType() hingga "*/*".

Tindakan
ACTION_OPEN_DOCUMENT atau
ACTION_CREATE_DOCUMENT
Skema URI Data
Tidak ada
Jenis MIME
Jenis MIME yang sesuai dengan jenis file yang harus dipilih pengguna.
Tambahan
EXTRA_MIME_TYPES
Array jenis MIME yang sesuai dengan jenis file yang digunakan aplikasi Anda diminta. Bila Anda menggunakan tambahan ini, Anda harus menetapkan jenis MIME utama di setType() hingga "*/*".
EXTRA_ALLOW_MULTIPLE
Boolean yang mendeklarasikan apakah pengguna dapat memilih lebih dari satu file sekaligus.
EXTRA_TITLE
Untuk digunakan dengan ACTION_CREATE_DOCUMENT untuk menentukan nama file awal.
EXTRA_LOCAL_ONLY
Boolean yang mendeklarasikan apakah file yang ditampilkan harus tersedia langsung dari perangkat, daripada memerlukan download dari layanan jarak jauh.
Kategori
CATEGORY_OPENABLE
Untuk menampilkan hanya "dapat dibuka" file yang dapat direpresentasikan sebagai aliran file dengan openFileDescriptor().

Contoh intent untuk mengambil foto:

Kotlin

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.
        ...
    }
}

Java

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.
        ...
    }
}

Aplikasi pihak ketiga tidak dapat merespons intent dengan Tindakan ACTION_OPEN_DOCUMENT. Sebagai gantinya, sistem menerima ini dan menampilkan semua file yang tersedia dari berbagai aplikasi dalam satu antarmuka pengguna terpadu.

Untuk menyediakan file aplikasi di UI ini dan mengizinkan aplikasi lain membukanya, Anda harus mengimplementasikan DocumentsProvider dan menyertakan filter intent untuk PROVIDER_INTERFACE ("android.content.action.DOCUMENTS_PROVIDER"), seperti yang ditunjukkan dalam contoh berikut:

<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>

Untuk informasi selengkapnya tentang cara membuat file yang dikelola oleh aplikasi Anda dapat dibuka dari aplikasi lain, baca Membuka file menggunakan framework akses penyimpanan.

Tindakan lokal

Menelepon mobil merupakan tindakan setempat yang umum. Buat filter intent untuk mengiklankan kebutuhan aplikasi Anda kemampuan untuk melakukan tindakan ini menggunakan informasi di bagian berikutnya.

Panggil ojek

Google Voice Actions

  • "dapatkan taksi untuk saya"
  • "panggil aku mobil"

(Wear OS saja)

Untuk memanggil taksi, gunakan ACTION_RESERVE_TAXI_RESERVATION tindakan.

Catatan: Aplikasi harus meminta konfirmasi dari pengguna sebelum menyelesaikan tindakan ini.

Tindakan
ACTION_RESERVE_TAXI_RESERVATION
URI Data
Tidak ada
Jenis MIME
Tidak ada
Tambahan
Tidak ada

Contoh intent:

Kotlin

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

Java

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

Contoh filter 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>

Maps

Menampilkan lokasi pada peta adalah tindakan umum untuk aplikasi peta. Buat filter intent untuk memberitahukan kemampuan aplikasi Anda dalam melakukan tindakan ini menggunakan informasi di bagian berikut.

Menampilkan lokasi di peta

Untuk membuka peta, gunakan tindakan ACTION_VIEW dan tentukan informasi lokasi dalam data intent dengan salah satu skema berikut.

Tindakan
ACTION_VIEW
Skema URI Data
geo:latitude,longitude
Menampilkan peta pada garis bujur dan lintang yang diberikan.

Contoh: "geo:47.6,-122.3"

geo:latitude,longitude?z=zoom
Menampilkan peta pada garis bujur dan lintang yang diberikan pada tingkat zoom tertentu. Tingkat zoom 1 menunjukkan seluruh Bumi, yang berpusat pada lat,lng yang ditentukan. Tertinggi tingkat zoom (terdekat) adalah 23.

Contoh: "geo:47.6,-122.3?z=11"

geo:0,0?q=lat,lng(label)
Menampilkan peta pada garis bujur dan lintang yang diberikan dengan label string.

Contoh: "geo:0,0?q=34.99,-106.61(Treasure)"

geo:0,0?q=my+street+address
Menampilkan lokasi untuk "alamat jalan saya", yang dapat berupa kueri lokasi atau alamat tertentu.

Contoh: "geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"

Catatan: Semua string yang diteruskan dalam URI geo harus dienkode. Misalnya, string 1st & Pike, Seattle menjadi 1st%20%26%20Pike%2C%20Seattle. Spasi dalam string dienkode dengan %20 atau diganti dengan tanda plus (+).

Jenis MIME
Tidak ada

Contoh intent:

Kotlin

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

Java

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

Contoh filter 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>

Musik atau video

Berikut adalah tindakan umum untuk aplikasi musik dan video, termasuk informasi yang Anda perlukan untuk membuat filter intent guna memberitahukan kemampuan aplikasi Anda dalam melakukan setiap tindakan.

Memutar file media

Untuk memutar file musik, gunakan tindakan ACTION_VIEW dan menetapkan lokasi URI file dalam data intent.

Tindakan
ACTION_VIEW
Skema URI Data
file:<URI>
content:<URI>
http:<URL>
Jenis MIME
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
Atau apa pun yang diperlukan aplikasi Anda.

Contoh intent:

Kotlin

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

Java

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

Contoh filter 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>

Memutar musik berdasarkan kueri penelusuran

Google Voice Actions

  • "mainkan michael jackson billie jean"

Untuk memutar musik berdasarkan kueri penelusuran, gunakan INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH. Aplikasi mungkin diaktifkan intent ini sebagai respons terhadap perintah suara pengguna untuk memutar musik. Aplikasi penerima untuk data ini intent melakukan penelusuran di dalam inventarisnya untuk mencocokkan konten yang ada dengan kueri yang diberikan mulai memutar konten tersebut.

Dalam intent ini, sertakan string EXTRA_MEDIA_FOCUS tambahan, yang menentukan mode pencarian yang dimaksud. Misalnya, mode penelusuran dapat menentukan apakah pencariannya adalah untuk mencari nama artis atau judul lagu.

Tindakan
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
Skema URI Data
Tidak ada
Jenis MIME
Tidak ada
Tambahan
MediaStore.EXTRA_MEDIA_FOCUS (wajib diisi)

Menunjukkan mode penelusuran: apakah pengguna mencari artis, album, lagu tertentu, atau playlist. Kebanyakan mode penelusuran memerlukan ekstra tambahan. Misalnya, jika pengguna tertarik untuk mendengarkan lagu tertentu, intent tersebut mungkin memiliki tiga ekstra tambahan: judul lagu, artis, dan album. Intent ini mendukung mode pencarian untuk setiap nilai EXTRA_MEDIA_FOCUS:

Apa pun - "vnd.android.cursor.item/*"

Memutar musik apa saja. Aplikasi penerima memutar musik berdasarkan pilihan cerdas, seperti sebagai {i>playlist<i} terakhir yang didengarkan pengguna.

Ekstra tambahan:

  • QUERY (wajib): string kosong. Tambahan ini selalu yang disediakan untuk kompatibilitas mundur. Aplikasi yang ada yang tidak mengetahui mode penelusuran dapat memproses maksud ini sebagai penelusuran tak terstruktur.

Tidak terstruktur - "vnd.android.cursor.item/*"

Memutar lagu, album, atau genre tertentu dari kueri penelusuran tak terstruktur. Aplikasi dapat membuat intent dengan mode penelusuran ini saat mereka tidak bisa mengidentifikasi jenis konten yang ingin dilihat pengguna didengarkan. Gunakan mode penelusuran yang lebih spesifik jika memungkinkan.

Ekstra tambahan:

  • QUERY (wajib): string yang berisi kombinasi apa pun artis, album, judul lagu, atau genre.

Genre - Audio.Genres.ENTRY_CONTENT_TYPE

Memutar musik dari genre tertentu.

Ekstra tambahan:

  • "android.intent.extra.genre" (wajib diisi) - Genre.
  • QUERY (wajib diisi): genre. Tambahan ini selalu disediakan untuk kompatibilitas mundur. Aplikasi yang sudah ada yang tidak mengetahui mode penelusuran dapat memproses maksud ini sebagai penelusuran tidak terstruktur.

Artis - Audio.Artists.ENTRY_CONTENT_TYPE

Memutar musik dari artis tertentu.

Ekstra tambahan:

  • EXTRA_MEDIA_ARTIST (wajib diisi): artis.
  • "android.intent.extra.genre": genre.
  • QUERY (wajib): string yang berisi kombinasi apa pun dari artis atau genre. Tambahan ini selalu disediakan untuk kompatibilitas mundur. Aplikasi yang ada yang tidak mengetahui mode penelusuran dapat memproses intent ini sebagai intent tidak terstruktur cari.

Album - Audio.Albums.ENTRY_CONTENT_TYPE

Memutar musik dari album tertentu.

Ekstra tambahan:

  • EXTRA_MEDIA_ALBUM (wajib diisi): album.
  • EXTRA_MEDIA_ARTIST: artis.
  • "android.intent.extra.genre": genre.
  • QUERY (wajib): string yang berisi kombinasi apa pun dari album atau artis. Tambahan ini selalu disediakan untuk tindakan kompatibilitas mundur. Aplikasi yang ada yang tidak mengetahui mode penelusuran bisa memproses intent ini sebagai pencarian tak terstruktur.

Lagu - "vnd.android.cursor.item/audio"

Memutar lagu tertentu.

Ekstra tambahan:

  • EXTRA_MEDIA_ALBUM: album.
  • EXTRA_MEDIA_ARTIST: artis.
  • "android.intent.extra.genre": genre.
  • EXTRA_MEDIA_TITLE (wajib diisi): nama lagu.
  • QUERY (wajib): string yang berisi kombinasi apa pun dari album, artis, genre, atau judul. Tambahan ini selalu disediakan untuk kompatibilitas mundur. Aplikasi yang sudah ada yang tidak mengetahui mode penelusuran dapat memproses penelusuran ini intent sebagai penelusuran tak terstruktur.

Playlist - Audio.Playlists.ENTRY_CONTENT_TYPE

Memutar playlist tertentu atau playlist yang cocok dengan beberapa kriteria yang ditentukan dengan tambahan tambahan.

Ekstra tambahan:

  • EXTRA_MEDIA_ALBUM: album.
  • EXTRA_MEDIA_ARTIST: artis.
  • "android.intent.extra.genre": genre.
  • "android.intent.extra.playlist": playlist.
  • EXTRA_MEDIA_TITLE: judul lagu untuk playlist yang menjadi dasar.
  • QUERY (wajib): string yang berisi kombinasi apa pun album, artis, genre, playlist, atau judul. Tambahan ini selalu yang disediakan untuk kompatibilitas mundur. Aplikasi yang ada yang tidak mengetahui mode penelusuran dapat memproses maksud ini sebagai penelusuran tak terstruktur.

Contoh intent:

Jika pengguna ingin mendengarkan musik dari artis tertentu, aplikasi penelusuran dapat menghasilkan intent berikut:

Kotlin

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

Java

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

Contoh filter intent:

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

Saat menangani intent ini dalam aktivitas Anda, periksa nilai Tambahan EXTRA_MEDIA_FOCUS dalam panggilan masuk Intent untuk menentukan mode penelusuran. Setelah aktivitas Anda teridentifikasi mode pencarian, membaca nilai tambahan untuk mode pencarian itu. Dengan informasi ini, aplikasi Anda dapat melakukan penelusuran di dalam inventarisnya untuk memutar konten yang cocok dengan kueri penelusuran. Hal ini ditunjukkan dalam contoh berikut.

Kotlin

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

Java

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

Catatan baru

Membuat catatan adalah tindakan umum untuk aplikasi pencatat. Buat filter intent untuk memberitahukan kemampuan aplikasi Anda dalam melakukan tindakan ini menggunakan informasi di bagian berikut.

Membuat catatan

Untuk membuat catatan baru, gunakan ACTION_CREATE_NOTE dan tentukan detail catatan seperti subjek dan teks menggunakan tambahan berikut.

Catatan: Aplikasi harus meminta konfirmasi dari pengguna sebelum menyelesaikan tindakan ini.

Tindakan
ACTION_CREATE_NOTE
Skema URI Data
Tidak ada
Jenis MIME
PLAIN_TEXT_TYPE
"*/*"
Tambahan
EXTRA_NAME
String yang menunjukkan judul atau subjek catatan.
EXTRA_TEXT
String yang menunjukkan teks catatan.

Contoh intent:

Kotlin

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

Java

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

Contoh filter 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>

Ponsel

Memulai panggilan adalah tindakan umum untuk aplikasi ponsel. Buat filter intent untuk memberitahukan kemampuan aplikasi Anda dalam melakukan tindakan ini menggunakan informasi di bagian berikut.

Memulai panggilan telepon

Untuk membuka aplikasi telepon dan menghubungi nomor telepon, gunakan tindakan ACTION_DIAL dan tentukan nomor telepon menggunakan skema URI berikut. Saat aplikasi telepon terbuka, aplikasi akan menampilkan nomor telepon, dan pengguna harus mengetuk tombol Call untuk memulai panggilan telepon.

Google Voice Actions

  • "hubungi 555-5555"
  • "panggilan bob"
  • "telepon pesan suara"

Untuk melakukan panggilan telepon secara langsung, gunakan tindakan ACTION_CALL dan tentukan nomor telepon menggunakan skema URI berikut. Saat aplikasi telepon terbuka, akan memulai panggilan telepon. Pengguna tidak perlu mengetuk tombol Call.

Tindakan ACTION_CALL mengharuskan Anda menambahkan Izin CALL_PHONE ke file manifes Anda:

<uses-permission android:name="android.permission.CALL_PHONE" />
Tindakan
  • ACTION_DIAL - Membuka aplikasi telepon atau telepon.
  • ACTION_CALL - Melakukan panggilan telepon (memerlukan CALL_PHONE)
Skema URI Data
  • tel:<phone-number>
  • voicemail:<phone-number>
Jenis MIME
Tidak ada

Nomor telepon yang valid adalah nomor yang ditentukan di IETF RFC 3966. Contoh yang valid meliputi berikut ini:

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

Aplikasi telepon aplikasi Telepon bagus dalam menormalisasi skema, seperti nomor telepon Anda. Jadi skema yang dideskripsikan tidak mutlak diperlukan dalam Metode Uri.parse(). Namun, jika Anda belum mencoba suatu skema atau tidak yakin apakah itu dapat ditangani, gunakan Uri.fromParts() metode tersebut.

Contoh intent:

Kotlin

fun dialPhoneNumber(phoneNumber: String) {
    val intent = Intent(Intent.ACTION_DIAL).apply {
        data = Uri.parse("tel:$phoneNumber")
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Berikut adalah tindakan umum untuk aplikasi penelusuran, termasuk informasi yang Anda perlukan untuk membuat filter intent guna memberitahukan kemampuan aplikasi Anda dalam melakukan setiap tindakan.

Menelusuri dengan menggunakan aplikasi tertentu

Google Voice Actions

  • "cari video kucing di myvideoapp"

Untuk mendukung penelusuran dalam konteks aplikasi Anda, deklarasikan filter intent di aplikasi Anda dengan tindakan SEARCH_ACTION, seperti yang ditunjukkan dalam contoh filter intent berikut.

Catatan: Kami tidak merekomendasikan penggunaan SEARCH_ACTION untuk penelusuran aplikasi. Sebagai gantinya, implementasikan metode GET_THING tindakan untuk memanfaatkan dukungan bawaan Asisten Google untuk penelusuran dalam aplikasi. Untuk informasi selengkapnya, lihat Asisten Google Dokumentasi Action Aplikasi.

Tindakan
"com.google.android.gms.actions.SEARCH_ACTION"
Mendukung kueri penelusuran dari Google Voice Actions.
Tambahan
QUERY
String yang berisi kueri penelusuran.

Contoh filter intent:

<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>

Melakukan penelusuran web

Untuk memulai penelusuran web, gunakan tindakan ACTION_WEB_SEARCH dan menentukan string pencarian Tambahan SearchManager.QUERY.

Tindakan
ACTION_WEB_SEARCH
Skema URI Data
Tidak ada
Jenis MIME
Tidak ada
Tambahan
SearchManager.QUERY
String penelusuran.

Contoh intent:

Kotlin

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

Java

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

Setelan

Untuk membuka layar di aplikasi Setelan sistem saat aplikasi mengharuskan pengguna mengubah sesuatu, gunakan salah satu tindakan intent berikut:

Tindakan
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

Untuk layar setelan tambahan yang tersedia, lihat dokumentasi Settings .

Skema URI Data
Tidak ada
Jenis MIME
Tidak ada

Contoh intent:

Kotlin

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

Java

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

Pesan teks

Menulis pesan SMS/MMS dengan lampiran adalah tindakan umum untuk aplikasi pesan teks. Buat filter intent untuk memberitahukan kemampuan aplikasi Anda dalam melakukan tindakan ini menggunakan informasi di bagian berikut.

Menulis pesan SMS/MMS dengan lampiran

Untuk memulai pesan teks SMS atau MMS, gunakan salah satu tindakan intent berikut dan tentukan pesan seperti nomor telepon, subjek, dan isi pesan menggunakan tombol ekstra berikut.

Tindakan
ACTION_SENDTO atau
ACTION_SEND atau
ACTION_SEND_MULTIPLE
Skema URI Data
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>

Semua skema ini ditangani dengan cara yang sama.

Jenis MIME
"text/plain"
"image/*"
"video/*"
Tambahan
"subject"
String untuk subjek pesan (biasanya hanya untuk MMS).
"sms_body"
String untuk pesan teks.
EXTRA_STREAM
Uri yang mengarah ke yang akan dilampirkan. Jika menggunakan tindakan ACTION_SEND_MULTIPLE, ekstra ini adalah ArrayList Objek Uri yang mengarah ke gambar atau video yang akan dilampirkan.

Contoh intent:

Kotlin

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

Java

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

Jika ingin memastikan bahwa intent Anda hanya ditangani oleh aplikasi pesan teks, dan bukan email atau aplikasi sosial, lalu gunakan tindakan ACTION_SENDTO dan sertakan skema data "smsto:" seperti yang ditunjukkan dalam contoh berikut:

Kotlin

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

Java

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

Contoh filter 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>

Catatan: Jika mengembangkan aplikasi pesan SMS/MMS, Anda harus mengimplementasikan filter intent untuk beberapa tindakan tambahan agar tersedia sebagai aplikasi SMS default di Android 4.4 dan yang lebih tinggi. Untuk informasi selengkapnya, lihat dokumentasi pukul Telephony.

Browser web

Memuat URL web adalah tindakan umum untuk aplikasi browser web. Buat filter intent untuk memberitahukan kemampuan aplikasi Anda dalam melakukan tindakan ini menggunakan informasi di bagian berikut.

Memuat URL web

Google Voice Actions

  • "buka example.com"

Untuk membuka halaman web, gunakan tindakan ACTION_VIEW dan menentukan URL web dalam data intent.

Tindakan
ACTION_VIEW
Skema URI Data
http:<URL>
https:<URL>
Jenis MIME
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

Contoh intent:

Kotlin

fun openWebPage(url: String) {
    val webpage: Uri = Uri.parse(url)
    val intent = Intent(Intent.ACTION_VIEW, webpage)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

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

Contoh filter 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>

Tips: Jika aplikasi Android Anda menyediakan fungsi yang mirip dengan situs web Anda, sertakan filter intent untuk URL yang mengarah ke situs web Anda. Lalu: jika pengguna telah menginstal aplikasi Anda, link dari email atau halaman web lain yang mengarah ke situs Anda membuka aplikasi Android, bukan halaman web. Pelajari lebih lanjut di Menangani Link Aplikasi Android.

Mulai Android 12 (API level 31), intent web generik berubah menjadi aktivitas dalam aplikasi Anda hanya jika aplikasi disetujui untuk domain tertentu yang terdapat dalam intent web tersebut. Jika aplikasi Anda tidak disetujui untuk domain, web intent ditetapkan ke aplikasi browser default pengguna.

Memverifikasi intent dengan Android Debug Bridge

Untuk memverifikasi apakah aplikasi Anda merespons intent yang ingin didukung, Anda bisa menggunakan metode Alat adb untuk mengaktifkan intent tertentu dengan melakukan hal berikut:

  1. Menyiapkan perangkat Android untuk pengembangan atau gunakan perangkat virtual.
  2. Pasang versi aplikasi Anda yang menangani intent yang ingin didukung.
  3. Aktifkan intent menggunakan adb:
    adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \
      -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
    

    Contoh:

    adb shell am start -a android.intent.action.DIAL \
      -d tel:555-5555 -n org.example.MyApp/.MyActivity
    
  4. Jika Anda mendefinisikan filter intent yang diperlukan, tangani intent tersebut.

Untuk informasi selengkapnya, lihat Membuat perintah shell.