Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Intent Umum

Intent memungkinkan Anda memulai aktivitas di aplikasi lain dengan menjelaskan aksi sederhana yang ingin Anda lakukan (misalnya "melihat peta" atau "mengambil foto") dalam satu objek Intent. Maksud tipe ini disebut intent implisit karena tidak menetapkan komponen aplikasi yang akan dimulai, melainkan menetapkan aksi dan menyediakan data yang digunakan untuk melakukan aksi tersebut.

Bila Anda memanggil startActivity() atau startActivityForResult() dan meneruskan intent implisit, sistem akan menetapkan intent ke aplikasi yang bisa menangani intent itu dan menjalankan Activity-nya. Jika ada lebih dari satu aplikasi yang bisa menangani intent tersebut, sistem akan menyediakan dialog kepada pengguna untuk memilih aplikasi yang akan digunakan.

Halaman ini menjelaskan beberapa intent implisit yang bisa Anda gunakan untuk melakukan tindakan umum, yang disusun menurut tipe aplikasi yang menangani intent itu. Setiap bagian juga menunjukkan cara membuat filter intent untuk mengiklankan kemampuan aplikasi Anda dalam melakukan aksi yang sama.

Perhatian: Jika di perangkat tidak ada aplikasi yang bisa menerima intent implisit, aplikasi Anda akan mogok bila memanggil startActivity(). Untuk memverifikasi lebih dahulu apakah ada aplikasi yang akan menerima intent tersebut, panggil resolveActivity() di objek Intent Anda. Jika hasilnya bukan nol, berarti setidaknya ada satu aplikasi yang bisa menangani intent tersebut dan aman untuk memanggil startActivity(). Jika hasilnya nol, Anda tidak boleh menggunakan intent tersebut dan, jika memungkinkan, Anda harus menonaktifkan fitur yang memanggil intent ini.

Jika Anda tidak paham cara membuat maksud atau filter intent, Anda harus membaca Maksud dan Filter Intent terlebih dahulu.

Untuk mempelajari cara memicu intent yang dicantumkan pada laman ini dari host development Anda, lihat Memverifikasi Intent dengan Android Debug Bridge.

Google Voice Actions

Google Voice Actions memicu sejumlah intent yang dicantumkan pada laman ini sebagai respons terhadap perintah suara. Untuk informasi selengkapnya, lihat Intent yang Dipicu oleh Google Voice Actions.

Beker

Membuat alarm

Google Voice Actions

  • "atur alarm untuk jam 7 pagi"

Untuk membuat alarm baru, gunakan aksi ACTION_SET_ALARM dan tetapkan detail alarm seperti waktu dan pesan dengan menggunakan tambahan yang didefinisikan di bawah ini.

Catatan: Hanya jam, menit, dan pesan tambahan yang tersedia di Android 2.3 (API level 9) dan yang lebih rendah. Tambahan lainnya ditambahkan di versi lebih baru platform ini.

Aksi
ACTION_SET_ALARM
URI Data
Tidak ada
Tipe 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 untuk pengulangan alarm ini. Setiap hari harus dideklarasikan dengan integer dari class Calendar seperti MONDAY.

Untuk alarm satu kali, jangan tetapkan ekstra ini.

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

Untuk menggunakan nada dering default, jangan tetapkan ekstra ini.

EXTRA_VIBRATE
Boolean yang menetapkan apakah akan menggetarkan alarm ini atau tidak.
EXTRA_SKIP_UI
Boolean yang menetapkan apakah aplikasi yang merespons harus melewatkan UI-nya saat menyetel alarm. Jika benar, aplikasi harus melewatkan UI konfirmasi dan cukup mengatur alarm yang ditetapkan.

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

  • "atur timer selama 5 menit"

Untuk membuat penghitung mundur, gunakan aksi ACTION_SET_TIMER dan tetapkan detail penghitung, misalnya durasinya, dengan menggunakan tambahan yang didefinisikan di bawah ini.

Catatan: Intent ini ditambahkan dalam Android 4.4 (API level 19).

Aksi
ACTION_SET_TIMER
URI Data
Tidak ada
Tipe MIME
Tidak ada
Tambahan
EXTRA_LENGTH
Panjang timer dalam detik.
EXTRA_MESSAGE
Pesan khusus untuk mengidentifikasi timer.
EXTRA_SKIP_UI
Boolean yang menetapkan apakah aplikasi yang merespons harus melewatkan UI-nya saat menyetel timer. Jika benar, aplikasi harus melewatkan UI konfirmasi dan cukup memulai timer yang ditetapkan.

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 aksi ACTION_SHOW_ALARMS.

Meskipun tidak banyak aplikasi yang akan memanggil intent ini (terutama digunakan oleh aplikasi sistem), aplikasi apa saja yang berperilaku sebagai beker harus mengimplementasikan filter intent ini dan merespons dengan menampilkan daftar alarm saat ini.

Catatan: Intent ini ditambahkan dalam Android 4.4 (API level 19).

Aksi
ACTION_SHOW_ALARMS
URI Data
Tidak ada
Tipe MIME
Tidak ada

Contoh filter maksud:

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

Kalender

Menambahkan kejadian kalender

Untuk menambahkan kejadian baru ke kalender pengguna, gunakan aksi ACTION_INSERT dan tentukan URI data dengan Events.CONTENT_URI. Kemudian Anda bisa menetapkan berbagai detail kejadian dengan menggunakan tambahan yang didefinisikan di bawah ini.

Aksi
ACTION_INSERT
URI Data
Events.CONTENT_URI
Tipe MIME
"vnd.android.cursor.dir/event"
Tambahan
EXTRA_EVENT_ALL_DAY
Boolean yang menetapkan apakah kejadian berlangsung seharian.
EXTRA_EVENT_BEGIN_TIME
Waktu mulai kejadian (milidetik sejak waktu patokan).
EXTRA_EVENT_END_TIME
Waktu berakhir kejadian (milidetik sejak waktu patokan).
TITLE
Judul kejadian.
DESCRIPTION
Keterangan kejadian.
EVENT_LOCATION
Lokasi kejadian.
EXTRA_EMAIL
Daftar alamat email yang dipisahkan koma yang menetapkan peserta undangan.

Masih banyak detail kejadian 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

Memotret atau merekam video dan mengembalikannya

Untuk membuka aplikasi kamera dan menerima foto atau video yang dihasilkan, gunakan aksi ACTION_IMAGE_CAPTURE atau ACTION_VIDEO_CAPTURE. Tetapkan juga lokasi URI tempat kamera akan menyimpan foto atau video, dalam tambahan EXTRA_OUTPUT.

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

Bila aplikasi kamera berhasil mengembalikan fokus ke aktivitas Anda (aplikasi Anda menerima callback onActivityResult()), maka Anda bisa mengakses foto atau video itu di URI yang Anda tetapkan dengan nilai EXTRA_OUTPUT.

Catatan: Bila Anda menggunakan ACTION_IMAGE_CAPTURE untuk menjepret foto, kamera juga mungkin mengembalikan salinan foto yang diperkecil (gambar kecil) dalam hasil Intent, yang disimpan sebagai Bitmap dan 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 informasi selengkapnya tentang cara menggunakan intent ini untuk menjepret foto, termasuk cara membuat Uri yang sesuai untuk lokasi keluaran, baca Menjepret Foto Saja atau Merekam Video Saja.

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, aktivitas Anda harus memeriksa ekstra EXTRA_OUTPUT dalam Intent yang masuk, kemudian menyimpan hasil jepretan gambar atau rekaman video di lokasi yang ditetapkan oleh ekstra itu dan memanggil setResult() dengan Intent yang menyertakan gambar kecil yang dikompresi dalam ekstra bernama "data".

Memulai aplikasi kamera dalam mode gambar diam

Google Voice Actions

  • "ambil foto"

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

Aksi
INTENT_ACTION_STILL_IMAGE_CAMERA
Skema URI Data
Tidak ada
Tipe MIME
Tidak ada
Tambahan
Tidak ada

Contoh intent:

Kotlin

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

Java

public void capturePhoto() {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
    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 aksi INTENT_ACTION_VIDEO_CAMERA.

Aksi
INTENT_ACTION_VIDEO_CAMERA
Skema URI Data
Tidak ada
Tipe 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 Orang/Kontak

Memilih kontak

Untuk meminta pengguna memilih kontak dan memberi aplikasi Anda akses ke semua informasi kontak, gunakan aksi ACTION_PICK dan tetapkan tipe MIME ke Contacts.CONTENT_TYPE.

Hasil Intent yang dikirimkan ke callback onActivityResult() berisi URI content: yang menunjuk ke kontak yang dipilih. Responsnya memberikan izin sementara pada aplikasi Anda untuk membaca kontak itu dengan menggunakan Penyedia Kontak API bahkan jika aplikasi Anda tidak disertai izin READ_CONTACTS.

Tips: Jika Anda perlu mengakses suatu bagian informasi kontak tertentu, misalnya nomor ponsel atau alamat email, lihat bagian berikutnya tentang cara memilih data kontak tertentu.

Aksi
ACTION_PICK
Skema URI Data
Tidak ada
Tipe 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 memanggil detail kontak setelah Anda memiliki URI kontak, baca Mengambil Detail untuk Kontak. Ingatlah, saat mengambil URI kontak dengan intent di atas, Anda tidak memerlukan izin READ_CONTACTS untuk membaca detail kontak itu.

Memilih data kontak tertentu

Untuk meminta pengguna memilih informasi tertentu dari kontak, misalnya nomor ponsel, alamat email, atau tipe data lainnya, gunakan aksi ACTION_PICK dan tetapkan tipe MIME ke salah satu tipe materi yang tertera di bawah ini, misalnya CommonDataKinds.Phone.CONTENT_TYPE untuk mendapatkan nomor ponsel kontak itu.

Jika Anda perlu mengambil satu tipe data saja dari kontak, teknik ini bersama CONTENT_TYPE dari class ContactsContract.CommonDataKinds akan lebih efisien daripada menggunakan Contacts.CONTENT_TYPE (seperti yang ditampilkan di bagian sebelumnya) karena hasilnya memberi Anda akses langsung ke data yang diinginkan tanpa perlu melakukan kueri yang lebih kompleks ke Penyedia Kontak.

Hasil Intent yang dikirimkan ke callback onActivityResult() berisi URI content: yang menunjuk ke data kontak yang dipilih. Responsnya memberikan izin sementara pada aplikasi Anda untuk membaca data kontak itu meskipun aplikasi Anda tidak disertai izin READ_CONTACTS.

Aksi
ACTION_PICK
Skema URI Data
Tidak ada
Tipe MIME
CommonDataKinds.Phone.CONTENT_TYPE
Memilih dari kontak dengan nomor ponsel.
CommonDataKinds.Email.CONTENT_TYPE
Memilih dari kontak dengan alamat email.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
Memilih dari kontak dengan alamat pos.

Atau salah satu dari sekian nilai CONTENT_TYPE lainnya pada 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 diketahui, gunakan aksi ACTION_VIEW dan tetapkan kontak itu dengan URI content: sebagai data intent.

Ada dua cara utama untuk pengambilan awal URI kontak:

  • Gunakan URI kontak yang dikembalikan oleh ACTION_PICK, yang ditampilkan di bagian sebelumnya (pendekatan ini tidak memerlukan izin aplikasi).
  • Akses daftar semua kontak secara langsung, seperti dijelaskan dalam Mengambil Daftar Kontak (pendekatan ini memerlukan izin READ_CONTACTS).
Aksi
ACTION_VIEW
Skema URI Data
content:<URI>
Tipe MIME
Tidak ada. Tipe 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 diketahui, gunakan aksi ACTION_EDIT, tetapkan kontak itu dengan URI content: sebagai data intent, dan sertakan setiap informasi kontak yang diketahui, dalam tambahan yang ditetapkan oleh konstanta dalam ContactsContract.Intents.Insert.

Ada dua cara utama untuk pengambilan awal URI kontak:

  • Gunakan URI kontak yang dikembalikan oleh ACTION_PICK, yang ditampilkan di bagian sebelumnya (pendekatan ini tidak memerlukan izin aplikasi).
  • Akses daftar semua kontak secara langsung, seperti dijelaskan dalam Mengambil Daftar Kontak (pendekatan ini memerlukan izin READ_CONTACTS).
Aksi
ACTION_EDIT
Skema URI Data
content:<URI>
Tipe MIME
Tipe ini diambil dari URI kontak.
Tambahan
Satu atau beberapa tambahan yang didefinisikan dalam ContactsContract.Intents.Insert sehingga Anda bisa 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 Memodifikasi Kontak dengan Menggunakan Intent.

Menyisipkan kontak

Untuk menyisipkan kontak, gunakan aksi ACTION_INSERT, tetapkan Contacts.CONTENT_TYPE sebagai tipe MIME, dan sertakan setiap informasi kontak yang diketahui, dalam tambahan yang ditetapkan oleh konstanta dalam ContactsContract.Intents.Insert.

Aksi
ACTION_INSERT
Skema URI Data
Tidak ada
Tipe MIME
Contacts.CONTENT_TYPE
Tambahan
Satu atau beberapa tambahan yang didefinisikan 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 Memodifikasi Kontak dengan Menggunakan Intent.

Email

Menulis email dengan lampiran opsional

Untuk menulis email, gunakan salah satu tindakan di bawah ini berdasarkan apakah Anda akan menyertakan lampiran atau tidak, dan sertakan detail email seperti penerima dan subjek dengan menggunakan kunci ekstra yang tercantum di bawah ini.

Aksi
ACTION_SENDTO (untuk tanpa lampiran) atau
ACTION_SEND (untuk satu lampiran) atau
ACTION_SEND_MULTIPLE (untuk beberapa lampiran)
Skema URI Data
Tidak ada
Tipe MIME
"text/plain"
"*/*"
Tambahan
Intent.EXTRA_EMAIL
Larik string semua alamat email penerima "To".
Intent.EXTRA_CC
Larik string semua alamat email penerima "CC".
Intent.EXTRA_BCC
Larik string semua alamat email penerima "BCC".
Intent.EXTRA_SUBJECT
String dengan subjek email.
Intent.EXTRA_TEXT
String dengan isi email.
Intent.EXTRA_STREAM
Uri Menunjuk ke lampiran. Jika menggunakan aksi ACTION_SEND_MULTIPLE, ini malah berupa ArrayList yang 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 ingin memastikan apakah intent Anda hanya ditangani oleh aplikasi email (dan bukan aplikasi perpesanan teks lain ataupun aplikasi sosial), maka gunakan aksi ACTION_SENDTO dan sertakan skema data "mailto:". Sebagai contoh:

Kotlin

fun composeEmail(addresses: Array<String>, subject: String) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:") // only email apps should 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 should 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

Mengambil tipe file tertentu

Untuk meminta pengguna memilih satu file misalnya dokumen atau foto dan mengembalikan referensi ke aplikasi Anda, gunakan aksi ACTION_GET_CONTENT dan tetapkan tipe MIME yang Anda inginkan. Referensi file yang dikembalikan ke aplikasi Anda bersifat sementara terhadap daur hidup aktivitas Anda saat ini, jadi jika ingin mengaksesnya nanti, Anda harus mengimpor salinan yang dapat Anda baca nanti. Intent ini juga memungkinkan pengguna membuat file baru dalam proses (misalnya, alih-alih memilih foto yang sudah ada, pengguna dapat mengambil foto baru dengan kamera).

Intent hasil yang dikirim ke metode onActivityResult() Anda mencakup data dengan URI yang menunjuk ke file tersebut. URI dapat berupa apa saja, seperti URI http:, URI file:, atau URI content:. Akan tetapi, jika Anda ingin membatasi file yang bisa dipilih hanyalah file yang bisa diakses dari penyedia materi (URI content:) dan tersedia sebagai aliran file dengan openFileDescriptor(), maka Anda harus menambahkan kategori CATEGORY_OPENABLE ke intent.

Di Android 4.3 (API level 18) dan yang lebih tinggi, Anda juga bisa mengizinkan pengguna memilih beberapa file dengan menambahkan EXTRA_ALLOW_MULTIPLE ke intent, setel ke true. Selanjutnya Anda bisa mengakses setiap file yang dipilih dalam objek ClipData yang dikembalikan oleh getClipData().

Aksi
ACTION_GET_CONTENT
Skema URI Data
Tidak ada
Tipe MIME
Tipe MIME terkait dengan jenis file yang harus dipilih oleh pengguna.
Tambahan
EXTRA_ALLOW_MULTIPLE
Boolean yang mendeklarasikan apakah pengguna bisa memilih lebih dari satu file sekaligus.
EXTRA_LOCAL_ONLY
Boolean yang mendeklarasikan apakah file yang dikembalikan harus tersedia langsung dari perangkat, daripada harus mengunduhnya dari layanan jauh.
Kategori (opsional)
CATEGORY_OPENABLE
Untuk hanya mengembalikan file yang "bisa dibuka" yang bisa dinyatakan 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 mengembalikan 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 aksi ACTION_GET_CONTENT), saat menjalankan Android 4.4 atau yang lebih tinggi, sebagai gantinya Anda bisa meminta untuk membuka file yang dikelola oleh aplikasi lain dengan menggunakan aksi ACTION_OPEN_DOCUMENT dan menetapkan tipe MIME. Agar pengguna dapat membuat dokumen baru yang dapat ditulis aplikasi Anda, sebagai gantinya gunakan aksi ACTION_CREATE_DOCUMENT. Misalnya, daripada memilih dari dokumen PDF yang ada, intent ACTION_CREATE_DOCUMENT memungkinkan pengguna untuk memilih tempat yang mereka inginkan untuk membuat dokumen baru (dalam aplikasi lain yang mengelola penyimpanan dokumen)—aplikasi Anda kemudian akan menerima lokasi URI yang bisa digunakannya untuk menuliskan dokumen baru.

Sedangkan intent yang dikirim ke metode onActivityResult() Anda dari aksi ACTION_GET_CONTENT dapat mengembalikan tipe URI apa saja, intent yang dikembalikan dari ACTION_OPEN_DOCUMENT dan ACTION_CREATE_DOCUMENT selalu menetapkan file yang dipilih sebagai URI content: yang didukung oleh DocumentsProvider. Anda bisa membuka file dengan openFileDescriptor() dan melakukan kueri detailnya dengan menggunakan kolom-kolom dari DocumentsContract.Document.

URI yang dikembalikan memberi aplikasi Anda akses jangka panjang untuk membaca file itu (mungkin juga dengan akses tulis). Jadi aksi ACTION_OPEN_DOCUMENT terutama berguna (daripada menggunakan ACTION_GET_CONTENT) saat Anda ingin membaca file yang ada tanpa membuat salinan dalam aplikasi Anda, atau saat Anda ingin membuka dan mengedit file langsung di tempat.

Anda juga bisa memungkinkan pengguna memilih beberapa file dengan menambahkan EXTRA_ALLOW_MULTIPLE ke intent, setel ke true. Jika pengguna hanya memilih satu item, maka Anda dapat mengambil item itu dari getData(). Jika pengguna memilih lebih dari satu item, maka getData() akan mengembalikan nol sehingga Anda malah harus mengambil setiap item dari objek ClipData yang dikembalikan oleh getClipData().

Catatan: Intent Anda harus menetapkan tipe MIME dan harus mendeklarasikan kategori CATEGORY_OPENABLE. Jika sesuai, Anda bisa menetapkan lebih dari satu tipe MIME dengan menambahkan satu larik tipe MIME dengan ekstra EXTRA_MIME_TYPES —jika demikian, Anda harus menyetel tipe MIME utama dalam setType() ke "*/*".

Aksi
ACTION_OPEN_DOCUMENT atau
ACTION_CREATE_DOCUMENT
Skema URI Data
Tidak ada
Tipe MIME
Tipe MIME terkait dengan jenis file yang harus dipilih oleh pengguna.
Tambahan
EXTRA_MIME_TYPES
Satu larik tipe MIME yang terkait dengan tipe file yang diminta oleh aplikasi Anda. Bila menggunakan ekstra ini, Anda harus menyetel tipe MIME utama dalam setType() ke "*/*".
EXTRA_ALLOW_MULTIPLE
Boolean yang mendeklarasikan apakah pengguna bisa memilih lebih dari satu file sekaligus.
EXTRA_TITLE
Untuk digunakan bersama ACTION_CREATE_DOCUMENT untuk menetapkan satu nama file awal.
EXTRA_LOCAL_ONLY
Boolean yang mendeklarasikan apakah file yang dikembalikan harus tersedia langsung dari perangkat, daripada harus mengunduhnya dari layanan jauh.
Kategori
CATEGORY_OPENABLE
Untuk hanya mengembalikan file yang "bisa dibuka" yang bisa dinyatakan 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 bisa benar-benar merespons intent dengan aksi ACTION_OPEN_DOCUMENT. Sebagai gantinya, sistem akan menerima intent ini dan menampilkan semua file yang tersedia dari beragam aplikasi dalam satu antarmuka pengguna gabungan.

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

<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 agar bisa dibuka dari aplikasi lain, baca panduan Storage Access Framework.

Tindakan Lokal

Memanggil mobil

Google Voice Actions

  • "pesankan saya taksi"
  • "panggilkan saya mobil"

(Wear OS saja)

Untuk memanggil taksi, gunakan aksi ACTION_RESERVE_TAXI_RESERVATION.

Catatan: Aplikasi harus meminta konfirmasi dari pengguna sebelum melakukan aksi ini.

Aksi
ACTION_RESERVE_TAXI_RESERVATION
URI Data
Tidak ada
Tipe 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 di peta

Untuk membuka peta, gunakan aksi ACTION_VIEW dan tetapkan informasi lokasi dalam data intent dengan salah satu skema yang didefinisikan di bawah ini.

Aksi
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
Tampilkan peta pada garis bujur dan lintang yang diberikan di tingkat zoom tertentu. Tingkat zoom 1 menampilkan seluruh Bumi, yang berpusat pada lat,lng yang diberikan. Tingkat zoom tertinggi (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" (dapat berupa kueri alamat atau lokasi tertentu).

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

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

Tipe 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

Memutar file media

Untuk memutar file musik, gunakan aksi ACTION_VIEW dan tetapkan lokasi URI file itu dalam data intent.

Aksi
ACTION_VIEW
Skema URI Data
file:<URI>
content:<URI>
http:<URL>
Tipe MIME
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
Atau apa saja yang mungkin 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

  • "putar michael jackson billie jean"

Untuk memutar musik berdasarkan kueri penelusuran, gunakan intent INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH. Sebuah aplikasi bisa memicu intent ini sebagai respons terhadap perintah suara pengguna untuk memutar musik. Aplikasi yang menerima intent ini akan melakukan penelusuran di dalam inventorinya untuk mencocokkan materi yang ada dengan kueri yang diberikan dan mulai memutar materi tersebut.

Intent ini harus menyertakan ekstra string EXTRA_MEDIA_FOCUS, yang menetapkan mode penelusuran yang dimaksud. Misalnya, mode penelusuran bisa menetapkan apakah menelusuri nama artis atau nama lagu.

Aksi
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
Skema URI Data
Tidak ada
Tipe MIME
Tidak ada
Tambahan
MediaStore.EXTRA_MEDIA_FOCUS (diperlukan)

Menunjukkan mode penelusuran (apakah pengguna menelusuri artis, album, lagu, atau daftar putar tertentu). Kebanyakan mode penelusuran memerlukan ekstra tambahan. Misalnya, jika pengguna tertarik untuk mendengarkan lagu tertentu, intent ini mungkin memiliki tiga ekstra tambahan: judul lagu, artis, dan album. Intent ini mendukung mode penelusuran untuk setiap nilai EXTRA_MEDIA_FOCUS:

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

Memutar musik apa saja. Aplikasi penerima harus memutar musik berdasarkan pilihan pintar, misalnya daftar putar yang terakhir didengarkan oleh pengguna.

Ekstra tambahan:

  • QUERY (diperlukan) - String kosong. Ekstra ini selalu disediakan untuk kompatibilitas mundur: aplikasi yang ada yang tidak mengenal mode penelusuran bisa memproses intent ini sebagai penelusuran tak terstruktur.

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

Memutar lagu, album atau genre tertentu dari kueri penelusuran tak terstruktur. Aplikasi dapat menghasilkan intent dengan mode penelusuran ini bila tidak bisa mengidentifikasi tipe materi yang ingin didengarkan oleh pengguna. Aplikasi harus menggunakan mode penelusuran tertentu lainnya bila memungkinkan.

Ekstra tambahan:

  • QUERY (diperlukan) - String yang berisi kombinasi apa saja dari: artis, album, nama lagu, atau genre.

Genre -Audio.Genres.ENTRY_CONTENT_TYPE

Memutar musik dari genre tertentu.

Ekstra tambahan:

  • "android.intent.extra.genre" (diperlukan) - Genre.
  • QUERY (diperlukan) - Genre. Ekstra ini selalu disediakan untuk kompatibilitas mundur: aplikasi yang ada yang tidak mengenal mode penelusuran bisa memproses intent ini sebagai penelusuran tak terstruktur.

Artis -Audio.Artists.ENTRY_CONTENT_TYPE

Memutar musik dari artis tertentu.

Ekstra tambahan:

  • EXTRA_MEDIA_ARTIST (diperlukan) - Artis.
  • "android.intent.extra.genre" - Genre.
  • QUERY (diperlukan) - String yang berisi kombinasi apa saja dari artis atau genre. Ekstra ini selalu disediakan untuk kompatibilitas mundur: aplikasi yang ada yang tidak mengenal mode penelusuran bisa memproses intent ini sebagai penelusuran tak terstruktur.

Album -Audio.Albums.ENTRY_CONTENT_TYPE

Memutar musik dari album tertentu.

Ekstra tambahan:

  • EXTRA_MEDIA_ALBUM (diperlukan) - Album.
  • EXTRA_MEDIA_ARTIST - Artis.
  • "android.intent.extra.genre" - Genre.
  • QUERY (diperlukan) - String yang berisi kombinasi apa saja dari album dan artis. Ekstra ini selalu disediakan untuk kompatibilitas mundur: aplikasi yang ada yang tidak mengenal mode penelusuran bisa memproses intent ini sebagai penelusuran 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 (diperlukan) - Nama lagu.
  • QUERY (diperlukan) - String yang berisi kombinasi apa saja dari: album, artis, genre, atau judul. Ekstra ini selalu disediakan untuk kompatibilitas mundur: aplikasi yang ada yang tidak mengenal mode penelusuran bisa memproses intent ini sebagai penelusuran tak terstruktur.

Daftar Putar - Audio.Playlists.ENTRY_CONTENT_TYPE

Memutar daftar putar tertentu atau daftar putar yang cocok dengan kriteria yang ditetapkan oleh ekstra tambahan.

Ekstra tambahan:

  • EXTRA_MEDIA_ALBUM - Album.
  • EXTRA_MEDIA_ARTIST - Artis.
  • "android.intent.extra.genre" - Genre.
  • "android.intent.extra.playlist" - Daftar putar.
  • EXTRA_MEDIA_TITLE - Nama lagu yang menjadi dasar daftar putar.
  • QUERY (diperlukan) - String yang berisi kombinasi apa saja dari: album, artis, genre, daftar putar, atau judul. Ekstra ini selalu disediakan untuk kompatibilitas mundur: aplikasi yang ada yang tidak mengenal mode penelusuran bisa memproses intent 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, aktivitas Anda harus memeriksa nilai dari ekstra EXTRA_MEDIA_FOCUS dalam Intent yang masuk untuk menentukan mode penelusurannya. Setelah aktivitas Anda mengidentifikasi mode penelusuran, aktivitas ini harus membaca nilai dari ekstra tambahan untuk mode penelusuran tertentu. Dengan informasi ini, aplikasi Anda selanjutnya dapat melakukan penelusuran di dalam inventarisnya guna memutar konten yang cocok dengan kueri penelusuran. Sebagai contoh:

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

Untuk membuat catatan baru, gunakan aksi ACTION_CREATE_NOTE dan tetapkan detail catatan seperti perihal dan teks dengan menggunakan tambahan yang didefinisikan di bawah ini.

Catatan: Aplikasi harus meminta konfirmasi dari pengguna sebelum melakukan aksi ini.

Aksi
ACTION_CREATE_NOTE
Skema URI Data
Tidak ada
Tipe MIME
PLAIN_TEXT_TYPE
"*/*"
Tambahan
EXTRA_NAME
String yang menunjukkan judul atau perihal 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 telepon

Untuk membuka aplikasi ponsel dan memanggil nomor ponsel, gunakan aksi ACTION_DIAL dan tetapkan nomor ponsel dengan menggunakan skema URI yang didefinisikan di bawah ini. Saat aplikasi ponsel dibuka, nomor ponsel akan ditampilkan namun pengguna harus menekan tombol Panggil untuk memulai panggilan telepon.

Google Voice Actions

  • "panggil 555-5555"
  • "panggil bob"
  • "panggil pesan suara"

Untuk melakukan panggilan telepon secara langsung, gunakan aksi ACTION_CALL dan tetapkan nomor ponsel dengan menggunakan skema URI yang didefinisikan di bawah ini. Saat aplikasi ponsel dibuka, panggilan telepon akan dimulai; pengguna tidak perlu menekan tombol Panggil.

Aksi ACTION_CALL mengharuskan Anda menambahkan izin CALL_PHONE ke file manifes:

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

Nomor ponsel yang valid didefinisikan dalam IETF RFC 3966. Contoh yang valid antara lain berikut ini:

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

Dialer ponsel bagus saat menormalkan skema, misalnya nomor ponsel. Jadi skema yang dijelaskan tidak mutlak diperlukan di metode Uri.parse(). Akan tetapi, jika Anda belum mencoba suatu skema atau tidak yakin apakah skema itu bisa ditangani, gunakan metode Uri.fromParts() sebagai gantinya.

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

Menelusuri dengan menggunakan aplikasi tertentu

Google Voice Actions

  • "cari video kucing di myvideoapp"

Untuk mendukung penelusuran dalam konteks aplikasi Anda, deklarasikan filter intent dalam aplikasi dengan aksi SEARCH_ACTION, seperti yang ditampilkan dalam contoh filter intent di bawah ini.

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

Contoh filter maksud:

<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 aksi ACTION_WEB_SEARCH dan tetapkan string penelusuran dalam ekstra SearchManager.QUERY.

Aksi
ACTION_WEB_SEARCH
Skema URI Data
Tidak ada
Tipe 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);
    }
}

Settings

Membuka bagian Setelan tertentu

Untuk membuka layar dalam setelan sistem bila aplikasi Anda mengharuskan pengguna untuk mengubah sesuatu, gunakan salah satu tindakan intent berikut untuk membuka layar setelan masing-masing nama aksi.

Aksi
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

Lihat dokumentasi Settings untuk layar setelan tambahan yang tersedia.

Skema URI Data
Tidak ada
Tipe 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);
    }
}

Perpesanan Teks

Menulis pesan SMS/MMS dengan lampiran

Untuk memulai pesan teks SMS atau MMS, gunakan salah satu tindakan intent di bawah ini dan tetapkan detail pesan seperti nomor ponsel, subjek, dan isi pesan dengan menggunakan kunci ekstra yang tercantum di bawah ini.

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

Setiap skema ini ditangani sama.

Tipe MIME
"text/plain"
"image/*"
"video/*"
Tambahan
"subject"
String untuk subjek pesan (biasanya untuk MMS saja).
"sms_body"
String untuk pesan teks.
EXTRA_STREAM
Uri Menunjuk ke gambar atau video yang akan dilampirkan. Jika menggunakan aksi ACTION_SEND_MULTIPLE, ekstra ini harus berupa ArrayList dari Uri yang menunjuk ke gambar/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 perpesanan teks (dan bukan aplikasi email lain ataupun aplikasi sosial), maka gunakan aksi ACTION_SENDTO dan sertakan skema data "smsto:". Sebagai contoh:

Kotlin

fun composeMmsMessage(message: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SEND).apply {
        data = Uri.parse("smsto:")  // This ensures only SMS apps respond
        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:"));  // This ensures only SMS apps respond
    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 aplikasi pertukaran 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 di Telephony.

Browser Web

Memuat URL web

Google Voice Actions

  • "buka example.com"

Untuk membuka laman web, gunakan aksi ACTION_VIEW dan tetapkan URL web dalam data intent.

Aksi
ACTION_VIEW
Skema URI Data
http:<URL>
https:<URL>
Tipe 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 fungsionalitas yang sama dengan situs web Anda, sertakan filter maksud untuk URL yang menunjuk ke situs web Anda. Kemudian, jika pengguna sudah memasang aplikasi Anda, tautan dari email atau laman web yang menunjuk ke situs web Anda akan membuka aplikasi Android Anda sebagai ganti halaman web Anda.

Memverifikasi Intent dengan Android Debug Bridge

Untuk memverifikasi apakah aplikasi Anda merespons intent yang ingin didukung, Anda bisa menggunakan alat adb untuk memicu maksud tertentu:

  1. Siapkan perangkat Android untuk development, atau gunakan perangkat maya.
  2. Pasang versi aplikasi Anda yang menangani intent yang ingin didukung.
  3. Picu maksud dengan menggunakan adb:
    adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \
      -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
    

    Misalnya:

    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, aplikasi Anda harus menangani maksud itu.

Untuk informasi selengkapnya, lihat Perintah ADB Shell.