Intent ทั่วไป

Intent ช่วยให้คุณเริ่มกิจกรรมในแอปอื่นได้โดยอธิบายการดำเนินการที่ต้องการทำ เช่น "ดูแผนที่" หรือ "ถ่ายภาพ" ในออบเจ็กต์ Intent Intent ประเภทนี้เรียกว่า Intent โดยนัย เนื่องจากไม่ได้ระบุคอมโพเนนต์ของแอปที่จะเริ่ม แต่ระบุการดำเนินการและให้ข้อมูลบางอย่างเพื่อดำเนินการแทน

เมื่อคุณเรียกใช้ startActivity() หรือ startActivityForResult() และส่ง Intent โดยนัย ระบบจะแก้ไข Intent ไปยังแอปที่จัดการ Intent ได้และเริ่ม Activity ที่เกี่ยวข้อง หากมีแอปมากกว่า 1 แอปที่จัดการ Intent ได้ ระบบจะแสดงกล่องโต้ตอบให้ผู้ใช้เลือกแอปที่จะใช้

หน้านี้อธิบาย Intent โดยนัยหลายรายการที่คุณใช้เพื่อดำเนินการทั่วไปได้ โดยจัดระเบียบตามประเภทแอปที่จัดการ Intent แต่ละส่วนยังแสดงวิธีสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการด้วย

ข้อควรระวัง: หากไม่มีแอปในอุปกรณ์ที่สามารถรับ Intent โดยนัย แอปจะขัดข้องเมื่อเรียกใช้ startActivity() หากต้องการยืนยันก่อนว่ามีแอปที่จะรับ Intent ให้เรียกใช้ resolveActivity() ในออบเจ็กต์ Intent หากผลลัพธ์ไม่ใช่ค่า Null แสดงว่ามีแอปอย่างน้อย 1 แอปที่จัดการ Intent ได้ และเรียกใช้ startActivity() ได้อย่างปลอดภัย หากผลลัพธ์เป็น Null อย่าใช้ Intent และปิดใช้ฟีเจอร์ที่เรียกใช้ Intent หากเป็นไปได้

หากไม่คุ้นเคยกับวิธีสร้าง Intent หรือตัวกรอง Intent โปรดอ่าน Intent และตัวกรอง Intent ก่อน

หากต้องการดูวิธีเริ่ม Intent ที่แสดงในหน้านี้จากโฮสต์การพัฒนา โปรดดูส่วนยืนยัน Intent ด้วย Android Debug Bridge

การสั่งงานด้วยเสียงของ Google

การสั่งงานด้วยเสียงของ Google จะเริ่ม Intent บางรายการที่แสดงในหน้านี้เพื่อตอบสนองต่อคำสั่งเสียง ดูข้อมูลเพิ่มเติมได้ที่ เริ่มต้นใช้งานการสั่งงานด้วยเสียงของระบบ

นาฬิกาปลุก

ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปนาฬิกาปลุก รวมถึงข้อมูลที่คุณต้องใช้ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง

สร้างการตั้งปลุก

การสั่งงานด้วยเสียงของ Google

  • "ตั้งปลุกตอน 7 โมงเช้า"

หากต้องการสร้างการปลุกใหม่ ให้ใช้การดำเนินการ ACTION_SET_ALARM และระบุรายละเอียดการปลุก เช่น เวลาและข้อความ โดยใช้ข้อมูลเพิ่มเติมต่อไปนี้

หมายเหตุ: เฉพาะชั่วโมง นาที และข้อความเพิ่มเติมเท่านั้นที่ใช้ได้ใน Android 2.3 (ระดับ API 9) และต่ำกว่า ส่วนสิทธิพิเศษอื่นๆ จะพร้อมใช้งานในแพลตฟอร์มเวอร์ชันที่สูงกว่า

การดำเนินการ
ACTION_SET_ALARM
URI ข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
Extras
EXTRA_HOUR
ชั่วโมงสำหรับการปลุก
EXTRA_MINUTES
นาทีสำหรับการปลุก
EXTRA_MESSAGE
ข้อความที่กำหนดเองเพื่อระบุการปลุก
EXTRA_DAYS
ArrayList รวมถึงวันในสัปดาห์ที่การปลุกนี้จะเกิดซ้ำ แต่ละวันต้องประกาศด้วยจำนวนเต็มจากคลาส Calendar เช่น MONDAY

สำหรับการปลุกแบบครั้งเดียว ไม่ต้องระบุข้อมูลเพิ่มเติมนี้

EXTRA_RINGTONE
URI content: ที่ระบุเสียงเรียกเข้าที่จะใช้กับการปลุก หรือ VALUE_RINGTONE_SILENT สำหรับไม่มีเสียงเรียกเข้า

หากต้องการใช้เสียงเรียกเข้าเริ่มต้น ไม่ต้องระบุส่วนเสริมนี้

EXTRA_VIBRATE
บูลีนที่ระบุว่าจะสั่นสำหรับการปลุกนี้หรือไม่
EXTRA_SKIP_UI
บูลีนที่ระบุว่าแอปที่ตอบสนองต้องข้าม UI ของตนเมื่อตั้งปลุกหรือไม่ หากเป็น "จริง" แอปต้องข้าม UI การยืนยันและตั้งการปลุกที่ระบุ

ตัวอย่างความตั้งใจ

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);
    }
}
หมายเหตุ

หากต้องการเรียกใช้ Intent ACTION_SET_ALARM แอปของคุณต้องมีสิทธิ์ SET_ALARM ดังนี้

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

ตัวอย่างตัวกรอง Intent

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

สร้างตัวจับเวลา

การสั่งงานด้วยเสียงของ Google

  • "จับเวลา 5 นาที"

หากต้องการสร้างนาฬิกานับเวลาถอยหลัง ให้ใช้การดำเนินการ ACTION_SET_TIMER และระบุรายละเอียดตัวจับเวลา เช่น ระยะเวลา โดยใช้ข้อมูลเพิ่มเติมต่อไปนี้

หมายเหตุ: Intent นี้ใช้ได้ใน Android 4.4 (ระดับ API 19) ขึ้นไป

การดำเนินการ
ACTION_SET_TIMER
URI ข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
Extras
EXTRA_LENGTH
ระยะเวลาของตัวจับเวลาเป็นวินาที
EXTRA_MESSAGE
ข้อความที่กำหนดเองเพื่อระบุตัวจับเวลา
EXTRA_SKIP_UI
บูลีนที่ระบุว่าแอปที่ตอบสนองต้องข้าม UI ของตนเมื่อตั้งตัวจับเวลาหรือไม่ หากเป็น "จริง" แอปต้องข้าม UI การยืนยันและเริ่มตัวจับเวลาที่ระบุ

ตัวอย่างความตั้งใจ

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);
    }
}
หมายเหตุ

หากต้องการเรียกใช้ Intent ACTION_SET_TIMER แอปของคุณต้องมีสิทธิ์ SET_ALARM ดังนี้

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

ตัวอย่างตัวกรอง Intent

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

แสดงการเตือนทั้งหมด

หากต้องการแสดงรายการการปลุก ให้ใช้การดำเนินการ ACTION_SHOW_ALARMS

แม้ว่าจะมีแอปไม่มากนักที่เรียกใช้ Intent นี้ เนื่องจากแอปของระบบเป็นผู้ใช้หลัก แต่แอปใดก็ตามที่ทำงานเป็นนาฬิกาปลุกสามารถใช้ตัวกรอง Intent นี้และตอบสนองโดยแสดงรายการการปลุกปัจจุบันได้

หมายเหตุ: Intent นี้ใช้ได้ใน Android 4.4 (ระดับ API 19) ขึ้นไป

การดำเนินการ
ACTION_SHOW_ALARMS
URI ข้อมูล
ไม่มี
ประเภท MIME
ไม่มี

ตัวอย่างตัวกรอง Intent

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

ปฏิทิน

การเพิ่มกิจกรรมเป็นการดำเนินการทั่วไปสำหรับแอปปฏิทิน สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้

เพิ่มกิจกรรมในปฏิทิน

หากต้องการเพิ่มกิจกรรมใหม่ลงในปฏิทินของผู้ใช้ ให้ใช้การดำเนินการ ACTION_INSERT และระบุ URI ข้อมูลโดยใช้ Events.CONTENT_URI จากนั้นคุณจะระบุรายละเอียดเหตุการณ์ต่างๆ ได้โดยใช้ข้อมูลเพิ่มเติมต่อไปนี้

การดำเนินการ
ACTION_INSERT
URI ข้อมูล
Events.CONTENT_URI
ประเภท MIME
"vnd.android.cursor.dir/event"
Extras
EXTRA_EVENT_ALL_DAY
บูลีนที่ระบุว่ากิจกรรมนี้เป็นกิจกรรมตลอดวันหรือไม่
EXTRA_EVENT_BEGIN_TIME
เวลาเริ่มต้นของเหตุการณ์ (มิลลิวินาทีนับตั้งแต่ Epoch)
EXTRA_EVENT_END_TIME
เวลาสิ้นสุดของเหตุการณ์ (มิลลิวินาทีที่เริ่มนับมาตั้งแต่วันที่ 1 มกราคม ค.ศ. 1970)
TITLE
ชื่อกิจกรรม
DESCRIPTION
คำอธิบายเหตุการณ์
EVENT_LOCATION
สถานที่จัดกิจกรรม
EXTRA_EMAIL
รายการที่คั่นด้วยคอมมาของที่อยู่อีเมลซึ่งระบุผู้ได้รับเชิญ

คุณระบุรายละเอียดเหตุการณ์อื่นๆ ได้อีกมากมายโดยใช้ค่าคงที่ที่กำหนดไว้ในคลาส CalendarContract.EventsColumns

ตัวอย่างความตั้งใจ

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

ตัวอย่างตัวกรอง Intent

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

กล้อง

ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปกล้องถ่ายรูป รวมถึงข้อมูลที่คุณต้องใช้ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง

จับภาพหรือวิดีโอแล้วส่งกลับ

หากต้องการเปิดแอปกล้องและรับรูปภาพหรือวิดีโอที่ได้ ให้ใช้การดำเนินการ ACTION_IMAGE_CAPTURE หรือ ACTION_VIDEO_CAPTURE นอกจากนี้ ให้ระบุตำแหน่ง URI ที่คุณต้องการให้กล้องบันทึกรูปภาพหรือวิดีโอใน EXTRA_OUTPUT extra

การดำเนินการ
ACTION_IMAGE_CAPTURE หรือ
ACTION_VIDEO_CAPTURE
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
Extras
EXTRA_OUTPUT
ตำแหน่ง URI ที่แอปกล้องบันทึกไฟล์รูปภาพหรือวิดีโอ (เป็นออบเจ็กต์ Uri)

เมื่อแอปกล้องคืนโฟกัสไปยังกิจกรรมของคุณได้สำเร็จ กล่าวคือ แอปของคุณได้รับ Callback onActivityResult() คุณจะเข้าถึงรูปภาพหรือวิดีโอที่ URI ที่ระบุด้วยค่า EXTRA_OUTPUT ได้

หมายเหตุ: เมื่อคุณใช้ ACTION_IMAGE_CAPTURE เพื่อถ่ายภาพ กล้องอาจแสดงสำเนาที่ลดขนาดลงหรือภาพขนาดย่อของภาพในผลลัพธ์ Intent ซึ่งบันทึกเป็น Bitmap ในช่องเพิ่มเติมชื่อ "data" ด้วย

ตัวอย่างความตั้งใจ

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

หากต้องการดำเนินการนี้เมื่อทำงานใน Android 12 (ระดับ API 31) ขึ้นไป โปรดดูตัวอย่าง 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>

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ Intent นี้เพื่อจับภาพ รวมถึงวิธีสร้าง Uri ที่เหมาะสมสำหรับตำแหน่งเอาต์พุตได้ที่ถ่ายภาพหรือถ่ายวิดีโอ

ตัวอย่างตัวกรอง Intent

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

เมื่อจัดการ Intent นี้ ให้กิจกรรมของคุณตรวจสอบ EXTRA_OUTPUT เพิ่มเติมใน Intent ที่เข้ามา จากนั้นบันทึกรูปภาพหรือวิดีโอที่ถ่ายไว้ในตำแหน่งที่ระบุโดยข้อมูลเพิ่มเติมนั้น แล้วเรียกใช้ setResult() ด้วย Intent ที่มีภาพปกที่บีบอัดในข้อมูลเพิ่มเติมชื่อ "data"

เริ่มแอปกล้องถ่ายรูปในโหมดภาพนิ่ง

การสั่งงานด้วยเสียงของ Google

  • "ถ่ายรูป"

หากต้องการเปิดแอปกล้องในโหมดภาพนิ่ง ให้ใช้การดำเนินการ INTENT_ACTION_STILL_IMAGE_CAMERA

การดำเนินการ
INTENT_ACTION_STILL_IMAGE_CAMERA
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
Extras
ไม่มี

ตัวอย่างความตั้งใจ

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

ตัวอย่างตัวกรอง Intent

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

เปิดแอปกล้องในโหมดวิดีโอ

การสั่งงานด้วยเสียงของ Google

  • "บันทึกวิดีโอ"

หากต้องการเปิดแอปกล้องถ่ายรูปในโหมดวิดีโอ ให้ใช้การดำเนินการ INTENT_ACTION_VIDEO_CAMERA

การดำเนินการ
INTENT_ACTION_VIDEO_CAMERA
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
Extras
ไม่มี

ตัวอย่างความตั้งใจ

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

ตัวอย่างตัวกรอง Intent

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

แอปรายชื่อติดต่อ/ผู้คน

ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปจัดการรายชื่อติดต่อ รวมถึงข้อมูลที่คุณต้องใช้ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง

เลือกรายชื่อติดต่อ

หากต้องการให้ผู้ใช้เลือกรายชื่อติดต่อและให้สิทธิ์แอปเข้าถึงข้อมูลติดต่อทั้งหมด ให้ใช้การดำเนินการ ACTION_PICK และระบุประเภท MIME เป็น Contacts.CONTENT_TYPE

ผลลัพธ์ Intent ที่ส่งไปยัง Callback onActivityResult() จะมี URI content: ที่ชี้ไปยังรายชื่อติดต่อที่เลือก การตอบกลับจะให้สิทธิ์ชั่วคราวแก่แอปของคุณในการอ่านรายชื่อติดต่อนั้นโดยใช้ API ของ Contacts Provider แม้ว่าแอปของคุณจะไม่มีสิทธิ์ READ_CONTACTS ก็ตาม

เคล็ดลับ: หากต้องการเข้าถึงข้อมูลติดต่อที่เฉพาะเจาะจงเท่านั้น เช่น หมายเลขโทรศัพท์หรืออีเมล โปรดดูส่วนถัดไปเกี่ยวกับวิธีเลือกข้อมูลติดต่อที่เฉพาะเจาะจง

การดำเนินการ
ACTION_PICK
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
Contacts.CONTENT_TYPE

ตัวอย่างความตั้งใจ

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

ดูข้อมูลเกี่ยวกับวิธีดึงข้อมูลติดต่อเมื่อคุณมี URI ของรายชื่อติดต่อแล้วได้ที่หัวข้อดึงรายละเอียดของรายชื่อติดต่อ

เมื่อเรียกข้อมูล URI ของรายชื่อติดต่อโดยใช้ Intent นี้ โดยทั่วไปคุณไม่จำเป็นต้องมีสิทธิ์ READ_CONTACTS เพื่ออ่านรายละเอียดพื้นฐานของรายชื่อติดต่อนั้น เช่น ชื่อที่แสดง และรายชื่อติดต่อติดดาวหรือไม่ อย่างไรก็ตาม หากคุณพยายามอ่านข้อมูลที่เฉพาะเจาะจงมากขึ้นเกี่ยวกับรายชื่อติดต่อหนึ่งๆ เช่น หมายเลขโทรศัพท์หรืออีเมล คุณต้องมีสิทธิ์ READ_CONTACTS

เลือกข้อมูลติดต่อที่เฉพาะเจาะจง

หากต้องการให้ผู้ใช้เลือกข้อมูลที่เฉพาะเจาะจงจากรายชื่อติดต่อ เช่น หมายเลขโทรศัพท์ อีเมล หรือข้อมูลประเภทอื่นๆ ให้ใช้การดำเนินการ ACTION_PICK และระบุประเภท MIME เป็นประเภทเนื้อหาประเภทใดประเภทหนึ่งต่อไปนี้ เช่น CommonDataKinds.Phone.CONTENT_TYPE เพื่อรับหมายเลขโทรศัพท์ของรายชื่อติดต่อ

หมายเหตุ: ในหลายกรณี แอปของคุณต้องมีสิทธิ์ READ_CONTACTS เพื่อดูข้อมูลที่เฉพาะเจาะจงเกี่ยวกับรายชื่อติดต่อหนึ่งๆ

หากต้องการดึงข้อมูลเพียงประเภทเดียวจากรายชื่อติดต่อ เทคนิคนี้ซึ่งใช้ CONTENT_TYPE จากคลาส ContactsContract.CommonDataKinds จะมีประสิทธิภาพมากกว่าการใช้ Contacts.CONTENT_TYPE ดังที่แสดงในส่วนก่อนหน้า ผลลัพธ์ที่ได้จะช่วยให้คุณเข้าถึงข้อมูลที่ต้องการได้โดยตรง โดยไม่ต้องทำการค้นหาที่ซับซ้อนมากขึ้นใน Contacts Provider

ผลลัพธ์ Intent ที่ส่งไปยัง Callback onActivityResult() ของคุณจะมี URI content: ที่ชี้ไปยังข้อมูลรายชื่อติดต่อที่เลือก การตอบกลับจะให้สิทธิ์ชั่วคราวแก่แอปของคุณในการอ่านข้อมูลรายชื่อติดต่อนั้น แม้ว่าแอปของคุณจะไม่มีสิทธิ์ READ_CONTACTS ก็ตาม

การดำเนินการ
ACTION_PICK
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
CommonDataKinds.Phone.CONTENT_TYPE
เลือกจากรายชื่อติดต่อที่มีหมายเลขโทรศัพท์
CommonDataKinds.Email.CONTENT_TYPE
เลือกจากรายชื่อติดต่อที่มีอีเมล
CommonDataKinds.StructuredPostal.CONTENT_TYPE
เลือกจากรายชื่อติดต่อที่มีที่อยู่ทางไปรษณีย์

หรือค่า CONTENT_TYPE อื่นๆ อีกมากมายใน ContactsContract

ตัวอย่างความตั้งใจ

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

ดูรายชื่อติดต่อ

หากต้องการแสดงรายละเอียดของรายชื่อติดต่อที่รู้จัก ให้ใช้การดำเนินการ ACTION_VIEW และระบุรายชื่อติดต่อด้วย URI content: เป็นข้อมูล Intent

การดึงข้อมูล URI ของรายชื่อติดต่อในเบื้องต้นทำได้ 2 วิธีหลักๆ ดังนี้

  • ใช้ URI ของรายชื่อติดต่อที่แสดงผลโดยการดำเนินการ ACTION_PICK ที่แสดงในส่วนก่อนหน้า วิธีนี้ไม่จำเป็นต้องใช้สิทธิ์ของแอป
  • เข้าถึงรายชื่อติดต่อทั้งหมดโดยตรงตามที่อธิบายไว้ในหัวข้อเรียกข้อมูลรายชื่อติดต่อ วิธีนี้ต้องใช้สิทธิ์ READ_CONTACTS
การดำเนินการ
ACTION_VIEW
สคีม URI ของข้อมูล
content:<URI>
ประเภท MIME
ไม่มี ระบบจะอนุมานประเภทจาก URI ของรายชื่อติดต่อ

ตัวอย่างความตั้งใจ

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

แก้ไขรายชื่อติดต่อที่มีอยู่

หากต้องการแก้ไขรายชื่อติดต่อที่รู้จัก ให้ใช้การดำเนินการ ACTION_EDIT ระบุรายชื่อติดต่อด้วย URI content: เป็นข้อมูล Intent และรวมข้อมูลรายชื่อติดต่อที่รู้จักในส่วนเสริมที่ระบุโดยค่าคงที่ใน ContactsContract.Intents.Insert

การดึงข้อมูล URI ของรายชื่อติดต่อในเบื้องต้นทำได้ 2 วิธีหลักๆ ดังนี้

  • ใช้ URI ของรายชื่อติดต่อที่แสดงผลโดยการดำเนินการ ACTION_PICK ที่แสดงในส่วนก่อนหน้า วิธีนี้ไม่จำเป็นต้องใช้สิทธิ์ของแอป
  • เข้าถึงรายชื่อติดต่อทั้งหมดโดยตรงตามที่อธิบายไว้ในหัวข้อเรียกข้อมูลรายชื่อติดต่อ วิธีนี้ต้องใช้สิทธิ์ READ_CONTACTS
การดำเนินการ
ACTION_EDIT
สคีม URI ของข้อมูล
content:<URI>
ประเภท MIME
ระบบจะอนุมานประเภทจาก URI ของผู้ติดต่อ
Extras
ข้อมูลเพิ่มเติมอย่างน้อย 1 รายการที่กำหนดไว้ใน ContactsContract.Intents.Insertเพื่อให้คุณป้อนข้อมูลในช่องข้อมูลติดต่อได้

ตัวอย่างความตั้งใจ:

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขรายชื่อติดต่อได้ที่หัวข้อแก้ไขรายชื่อติดต่อโดยใช้ Intent

แทรกรายชื่อติดต่อ

หากต้องการแทรกรายชื่อติดต่อใหม่ ให้ใช้การดำเนินการ ACTION_INSERT ระบุ Contacts.CONTENT_TYPE เป็นประเภท MIME และรวมข้อมูลติดต่อที่ทราบในส่วนเสริมที่ระบุโดยค่าคงที่ใน ContactsContract.Intents.Insert

การดำเนินการ
ACTION_INSERT
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
Contacts.CONTENT_TYPE
Extras
ข้อมูลเพิ่มเติมอย่างน้อย 1 รายการที่กำหนดไว้ใน ContactsContract.Intents.Insert

ตัวอย่างความตั้งใจ

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแทรกรายชื่อติดต่อได้ที่แก้ไขรายชื่อติดต่อโดยใช้ Intent

อีเมล

การเขียนอีเมลที่มีไฟล์แนบ (ไม่บังคับ) เป็นการดำเนินการทั่วไปสำหรับแอปอีเมล สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้

เขียนอีเมลพร้อมไฟล์แนบ (ไม่บังคับ)

หากต้องการเขียนอีเมล ให้ใช้การดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้โดยขึ้นอยู่กับว่าคุณจะรวมไฟล์แนบหรือไม่ และระบุรายละเอียดอีเมล เช่น ผู้รับและเรื่อง โดยใช้คีย์เพิ่มเติมที่ระบุไว้

การดำเนินการ
ACTION_SENDTO (สำหรับกรณีที่ไม่มีไฟล์แนบ) หรือ
ACTION_SEND (สำหรับกรณีที่มีไฟล์แนบ 1 รายการ) หรือ
ACTION_SEND_MULTIPLE (สำหรับกรณีที่มีไฟล์แนบหลายรายการ)
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
"text/plain"
"*/*"
Extras
Intent.EXTRA_EMAIL
อาร์เรย์สตริงของอีเมลผู้รับ "ถึง" ทั้งหมด
Intent.EXTRA_CC
อาร์เรย์สตริงของอีเมลผู้รับ "CC" ทั้งหมด
Intent.EXTRA_BCC
อาร์เรย์สตริงของอีเมลผู้รับ "สำเนาลับ" ทั้งหมด
Intent.EXTRA_SUBJECT
สตริงที่มีเรื่องอีเมล
Intent.EXTRA_TEXT
สตริงที่มีเนื้อหาของอีเมล
Intent.EXTRA_STREAM
Uri ที่ชี้ไปยังไฟล์แนบ หากใช้การดำเนินการ ACTION_SEND_MULTIPLE นี่จะเป็น ArrayList ที่มีออบเจ็กต์ Uri หลายรายการแทน

ตัวอย่างความตั้งใจ

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

หากต้องการตรวจสอบว่า Intent ของคุณได้รับการจัดการโดยแอปอีเมลเท่านั้น ไม่ใช่แอปส่งข้อความหรือแอปโซเชียล ให้ใช้การดำเนินการ ACTION_SENDTO และรวมรูปแบบข้อมูล "mailto:" ดังที่แสดงในตัวอย่างต่อไปนี้

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

ตัวอย่างตัวกรอง Intent

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="*/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SENDTO" />
        <data android:scheme="mailto" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

พื้นที่จัดเก็บไฟล์

ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปพื้นที่เก็บข้อมูลไฟล์ รวมถึงข้อมูลที่คุณต้องใช้ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง

ดึงข้อมูลไฟล์บางประเภท

หากต้องการขอให้ผู้ใช้เลือกไฟล์ เช่น เอกสารหรือรูปภาพ และแสดงผลข้อมูลอ้างอิงไปยังแอปของคุณ ให้ใช้การดำเนินการ ACTION_GET_CONTENT และระบุประเภท MIME ที่ต้องการ การอ้างอิงไฟล์ที่แสดงผลไปยังแอปของคุณจะเปลี่ยนผ่านไปยังวงจรปัจจุบันของกิจกรรม ดังนั้นหากต้องการเข้าถึงในภายหลัง คุณต้องนำเข้าสำเนาที่อ่านได้ในภายหลัง

Intent นี้ยังช่วยให้ผู้ใช้สร้างไฟล์ใหม่ในกระบวนการได้ด้วย เช่น แทนที่จะเลือกรูปภาพที่มีอยู่ ผู้ใช้สามารถถ่ายรูปใหม่ด้วยกล้องได้

Intent ผลลัพธ์ที่ส่งไปยังเมธอด onActivityResult() ของคุณจะมีข้อมูลที่มี URI ที่ชี้ไปยังไฟล์ URI อาจเป็นอะไรก็ได้ เช่น URI ของ http:, URI ของ file: หรือ URI ของ content: อย่างไรก็ตาม หากต้องการจำกัดไฟล์ที่เลือกได้ให้เหลือเฉพาะไฟล์ที่เข้าถึงได้จาก Content Provider (URI content:) และพร้อมใช้งานเป็นสตรีมไฟล์ที่มี openFileDescriptor() ให้เพิ่มหมวดหมู่ CATEGORY_OPENABLE ลงใน Intent

ใน Android 4.3 (ระดับ API 18) ขึ้นไป คุณยังอนุญาตให้ผู้ใช้เลือกไฟล์หลายไฟล์ได้โดยเพิ่ม EXTRA_ALLOW_MULTIPLE ลงใน Intent โดยตั้งค่าเป็น true จากนั้นคุณจะเข้าถึงไฟล์ที่เลือกแต่ละไฟล์ได้ในออบเจ็กต์ ClipData ที่ getClipData() แสดงผล

การดำเนินการ
ACTION_GET_CONTENT
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
ประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่ผู้ใช้ต้องเลือก
Extras
EXTRA_ALLOW_MULTIPLE
บูลีนที่ประกาศว่าผู้ใช้สามารถเลือกไฟล์ได้มากกว่า 1 ไฟล์พร้อมกันหรือไม่
EXTRA_LOCAL_ONLY
บูลีนที่ประกาศว่าไฟล์ที่แสดงผลต้องพร้อมใช้งานโดยตรงจากอุปกรณ์หรือไม่ แทนที่จะต้องดาวน์โหลดจากบริการระยะไกล
Category (ไม่บังคับ)
CATEGORY_OPENABLE
หากต้องการแสดงเฉพาะไฟล์ที่ "เปิดได้" ซึ่งแสดงเป็นสตรีมไฟล์ที่มี openFileDescriptor() ได้

ตัวอย่าง Intent เพื่อรับรูปภาพ:

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

ตัวอย่างตัวกรอง Intent เพื่อแสดงผลรูปภาพ

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

เปิดไฟล์บางประเภท

เมื่อใช้ Android 4.4 ขึ้นไป คุณสามารถขอเปิดไฟล์ที่จัดการโดยแอปอื่นได้โดยใช้การดำเนินการ ACTION_OPEN_DOCUMENT และระบุประเภท MIME แทนการเรียกข้อมูลสำเนาของไฟล์ที่ต้องนำเข้าแอปโดยใช้การดำเนินการ ACTION_GET_CONTENT หากต้องการให้ผู้ใช้สร้างเอกสารใหม่ที่แอปของคุณเขียนได้ด้วย ให้ใช้การดำเนินการ ACTION_CREATE_DOCUMENT แทน

ตัวอย่างเช่น แทนที่จะเลือกจากเอกสาร PDF ที่มีอยู่ Intent ACTION_CREATE_DOCUMENT จะช่วยให้ผู้ใช้เลือกตำแหน่งที่ต้องการสร้างเอกสารใหม่ได้ เช่น ภายในแอปอื่นที่จัดการพื้นที่เก็บข้อมูลของเอกสาร จากนั้นแอปจะได้รับตำแหน่ง URI ที่สามารถเขียนเอกสารใหม่ได้

แม้ว่า Intent ที่ส่งไปยังเมธอด onActivityResult() จากการดำเนินการ ACTION_GET_CONTENT อาจแสดงผล URI ประเภทใดก็ได้ แต่ Intent ผลลัพธ์จาก ACTION_OPEN_DOCUMENT และ ACTION_CREATE_DOCUMENT จะระบุไฟล์ที่เลือกเป็น URI content: ที่สนับสนุนโดย DocumentsProvider เสมอ คุณสามารถเปิดไฟล์ด้วย openFileDescriptor() และค้นหารายละเอียดโดยใช้คอลัมน์จาก DocumentsContract.Document

URI ที่แสดงผลจะให้สิทธิ์แอปของคุณในการอ่านไฟล์ในระยะยาว และอาจให้สิทธิ์เขียนด้วย การดำเนินการ ACTION_OPEN_DOCUMENT มีประโยชน์อย่างยิ่งเมื่อคุณต้องการอ่านไฟล์ที่มีอยู่โดยไม่ต้องทำสำเนาลงในแอป หรือเมื่อต้องการเปิดและแก้ไขไฟล์ในตำแหน่งเดิม

นอกจากนี้ คุณยังอนุญาตให้ผู้ใช้เลือกไฟล์หลายไฟล์ได้โดยเพิ่ม EXTRA_ALLOW_MULTIPLE ลงใน Intent โดยตั้งค่าเป็น true หากผู้ใช้เลือกเพียงรายการเดียว คุณจะดึงข้อมูลรายการดังกล่าวจาก getData() ได้ หากผู้ใช้เลือกมากกว่า 1 รายการ getData() จะแสดงผลเป็น Null และคุณต้องดึงข้อมูลแต่ละรายการจากออบเจ็กต์ ClipData ที่แสดงผลโดย getClipData() แทน

หมายเหตุ: Intent ต้องระบุประเภท MIME และต้องประกาศหมวดหมู่ CATEGORY_OPENABLE หากเหมาะสม คุณสามารถระบุประเภท MIME ได้มากกว่า 1 ประเภทโดยเพิ่มอาร์เรย์ของประเภท MIME ด้วย EXTRA_MIME_TYPES เพิ่มเติม หากทำเช่นนั้น คุณต้องตั้งค่าประเภท MIME หลักใน setType() เป็น "*/*"

การดำเนินการ
ACTION_OPEN_DOCUMENT หรือ
ACTION_CREATE_DOCUMENT
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
ประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่ผู้ใช้ต้องเลือก
Extras
EXTRA_MIME_TYPES
อาร์เรย์ของประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่แอปของคุณขอ เมื่อใช้ส่วนเสริมนี้ คุณต้องตั้งค่าประเภท MIME หลักใน setType() เป็น "*/*"
EXTRA_ALLOW_MULTIPLE
บูลีนที่ประกาศว่าผู้ใช้สามารถเลือกไฟล์ได้มากกว่า 1 ไฟล์พร้อมกันหรือไม่
EXTRA_TITLE
ใช้กับ ACTION_CREATE_DOCUMENT เพื่อระบุชื่อไฟล์เริ่มต้น
EXTRA_LOCAL_ONLY
บูลีนที่ประกาศว่าไฟล์ที่แสดงผลต้องพร้อมใช้งานโดยตรงจากอุปกรณ์หรือไม่ แทนที่จะต้องดาวน์โหลดจากบริการระยะไกล
หมวดหมู่
CATEGORY_OPENABLE
หากต้องการแสดงเฉพาะไฟล์ที่ "เปิดได้" ซึ่งแสดงเป็นสตรีมไฟล์ที่มี openFileDescriptor() ได้

ตัวอย่าง Intent เพื่อรับรูปภาพ:

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

แอปของบุคคลที่สามไม่สามารถตอบสนองต่อ Intent ด้วยการดำเนินการ ACTION_OPEN_DOCUMENT แต่ระบบจะรับ Intent นี้และแสดงไฟล์ทั้งหมดที่พร้อมใช้งานจากแอปต่างๆ ในอินเทอร์เฟซผู้ใช้แบบรวม

หากต้องการระบุไฟล์ของแอปใน UI นี้และอนุญาตให้แอปอื่นๆ เปิดไฟล์เหล่านั้น คุณต้องใช้ DocumentsProvider และใส่ตัวกรอง Intent สำหรับ PROVIDER_INTERFACE ("android.content.action.DOCUMENTS_PROVIDER") ดังที่แสดงในตัวอย่างต่อไปนี้

<provider ...
    android:grantUriPermissions="true"
    android:exported="true"
    android:permission="android.permission.MANAGE_DOCUMENTS">
    <intent-filter>
        <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
    </intent-filter>
</provider>

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีทำให้ไฟล์ที่จัดการโดยแอปของคุณเปิดได้จากแอปอื่นๆ ได้ที่หัวข้อเปิดไฟล์โดยใช้เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล

การกระทำเกี่ยวกับสถานที่

การเรียกรถเป็นการกระทำเกี่ยวกับสถานที่ที่พบได้ทั่วไป สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้

โทรเรียกรถ

การสั่งงานด้วยเสียงของ Google

  • "เรียกรถแท็กซี่ให้ฉันหน่อย"
  • "เรียกรถให้หน่อย"

(Wear OS เท่านั้น)

หากต้องการเรียกแท็กซี่ ให้ใช้การดำเนินการ ACTION_RESERVE_TAXI_RESERVATION

หมายเหตุ: แอปต้องขอการยืนยันจากผู้ใช้ก่อนดำเนินการนี้ให้เสร็จสมบูรณ์

การดำเนินการ
ACTION_RESERVE_TAXI_RESERVATION
URI ข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
Extras
ไม่มี

ตัวอย่างความตั้งใจ

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

ตัวอย่างตัวกรอง 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

การแสดงตำแหน่งบนแผนที่เป็นการดำเนินการทั่วไปสำหรับแอปแผนที่ สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้

แสดงตำแหน่งบนแผนที่

หากต้องการเปิดแผนที่ ให้ใช้การดำเนินการ ACTION_VIEW และระบุข้อมูลตำแหน่งในข้อมูล Intent ด้วยรูปแบบใดรูปแบบหนึ่งต่อไปนี้

การดำเนินการ
ACTION_VIEW
สคีม URI ของข้อมูล
geo:latitude,longitude
แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุ

ตัวอย่าง: "geo:47.6,-122.3"

geo:latitude,longitude?z=zoom
แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุที่ระดับการซูมหนึ่งๆ ระดับการซูม 1 จะแสดงโลกทั้งใบ โดยมีศูนย์กลางอยู่ที่ lat,lng ที่ระบุ ระดับการซูมสูงสุด (ใกล้ที่สุด) คือ 23

ตัวอย่าง: "geo:47.6,-122.3?z=11"

geo:0,0?q=lat,lng(label)
แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุพร้อมป้ายกำกับสตริง

ตัวอย่าง: "geo:0,0?q=34.99,-106.61(Treasure)"

geo:0,0?q=my+street+address
แสดงตำแหน่งของ "ที่อยู่ของฉัน" ซึ่งอาจเป็นที่อยู่หรือคำค้นหาตำแหน่งที่เฉพาะเจาะจง

ตัวอย่าง: "geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"

หมายเหตุ: สตริงทั้งหมดที่ส่งใน URI geo ต้องเข้ารหัส เช่น สตริง 1st & Pike, Seattle จะกลายเป็น 1st%20%26%20Pike%2C%20Seattle ช่องว่างในสตริงจะเข้ารหัสด้วย %20 หรือแทนที่ด้วยเครื่องหมายบวก (+)

ประเภท MIME
ไม่มี

ตัวอย่างความตั้งใจ

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

ตัวอย่างตัวกรอง Intent

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="geo" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

เพลงหรือวิดีโอ

ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปเพลงและวิดีโอ รวมถึงข้อมูลที่คุณต้องใช้ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง

เล่นไฟล์สื่อ

หากต้องการเล่นไฟล์เพลง ให้ใช้การดำเนินการ ACTION_VIEW และระบุตำแหน่ง URI ของไฟล์ในข้อมูล Intent

การดำเนินการ
ACTION_VIEW
สคีม URI ของข้อมูล
file:<URI>
content:<URI>
http:<URL>
ประเภท MIME
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
หรือข้อมูลอื่นๆ ที่แอปของคุณต้องการ

ตัวอย่างความตั้งใจ

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

ตัวอย่างตัวกรอง Intent

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

เปิดเพลงตามคำค้นหา

การสั่งงานด้วยเสียงของ Google

  • "เปิดเพลง billie jean ของ michael jackson"

หากต้องการเปิดเพลงตามคำค้นหา ให้ใช้ Intent INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH แอปอาจเริ่ม Intent นี้เพื่อตอบสนองต่อคำสั่งเสียงของผู้ใช้เพื่อเล่นเพลง แอปที่รับ Intent นี้จะทำการค้นหาภายในคลังของตนเพื่อจับคู่เนื้อหาที่มีอยู่กับคำค้นหาที่ระบุและเริ่มเล่นเนื้อหานั้น

ใน Intent นี้ ให้ใส่สตริง EXTRA_MEDIA_FOCUS เพิ่มเติม ซึ่งระบุโหมดการค้นหาที่ต้องการ ตัวอย่างเช่น โหมดการค้นหาจะระบุได้ว่าการค้นหานั้นเป็นชื่อศิลปินหรือชื่อเพลง

การดำเนินการ
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
Extras
MediaStore.EXTRA_MEDIA_FOCUS (ต้องระบุ)

ระบุโหมดการค้นหาว่าผู้ใช้กำลังมองหาศิลปิน อัลบั้ม เพลง หรือเพลย์ลิสต์ที่เฉพาะเจาะจงหรือไม่ โหมดการค้นหาส่วนใหญ่จะใช้ส่วนเสริมเพิ่มเติม ตัวอย่างเช่น หากผู้ใช้สนใจฟังเพลงใดเพลงหนึ่ง Intent อาจมีข้อมูลเพิ่มเติม 3 รายการ ได้แก่ ชื่อเพลง ศิลปิน และอัลบั้ม Intent นี้รองรับโหมดการค้นหาต่อไปนี้สำหรับค่า EXTRA_MEDIA_FOCUS แต่ละค่า

Any - "vnd.android.cursor.item/*"

เปิดได้ทุกเพลง แอปที่รับจะเล่นเพลงตามตัวเลือกอัจฉริยะ เช่น เพลย์ลิสต์ล่าสุดที่ผู้ใช้ฟัง

บริการเสริมเพิ่มเติม

  • QUERY (ต้องระบุ): สตริงว่าง ระบบจะระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาจะประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้

ไม่มีโครงสร้าง - "vnd.android.cursor.item/*"

เล่นเพลง อัลบั้ม หรือแนวเพลงที่เฉพาะเจาะจงจากคำค้นหาที่ไม่มีโครงสร้าง แอปสามารถสร้าง Intent ด้วยโหมดการค้นหานี้เมื่อไม่สามารถระบุประเภทเนื้อหาที่ผู้ใช้ต้องการฟังได้ ใช้โหมดการค้นหาที่เฉพาะเจาะจงมากขึ้นเมื่อเป็นไปได้

บริการเสริมเพิ่มเติม

  • QUERY (ต้องระบุ): สตริงที่มีการผสมผสานระหว่างศิลปิน อัลบั้ม ชื่อเพลง หรือแนวเพลง

ประเภท - Audio.Genres.ENTRY_CONTENT_TYPE

เปิดเพลงแนวที่ต้องการ

บริการเสริมเพิ่มเติม

  • "android.intent.extra.genre" (ต้องระบุ) - ประเภท
  • QUERY (ต้องระบุ): ประเภท ระบบจะระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาจะประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้

ศิลปิน - Audio.Artists.ENTRY_CONTENT_TYPE

เปิดเพลงจากศิลปินที่เจาะจง

บริการเสริมเพิ่มเติม

  • EXTRA_MEDIA_ARTIST (ต้องระบุ): ศิลปิน
  • "android.intent.extra.genre": ประเภท
  • QUERY (ต้องระบุ): สตริงที่มีศิลปินหรือแนวเพลงผสมกัน ระบบจะระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาจะประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้

อัลบั้ม - Audio.Albums.ENTRY_CONTENT_TYPE

เปิดเพลงจากอัลบั้มที่เจาะจง

บริการเสริมเพิ่มเติม

  • EXTRA_MEDIA_ALBUM (ต้องระบุ): อัลบั้ม
  • EXTRA_MEDIA_ARTIST: ศิลปิน
  • "android.intent.extra.genre": ประเภท
  • QUERY (ต้องระบุ): สตริงที่มีชุดค่าผสมของอัลบั้มหรือศิลปิน ระบบจะระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาจะประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้

เพลง - "vnd.android.cursor.item/audio"

เปิดเพลงที่ต้องการ

บริการเสริมเพิ่มเติม

  • EXTRA_MEDIA_ALBUM: อัลบั้ม
  • EXTRA_MEDIA_ARTIST: ศิลปิน
  • "android.intent.extra.genre": ประเภท
  • EXTRA_MEDIA_TITLE (ต้องระบุ): ชื่อเพลง
  • QUERY (ต้องระบุ): สตริงที่มีการผสมผสานระหว่างอัลบั้ม ศิลปิน แนวเพลง หรือชื่อเพลง ระบบจะระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาจะประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้

เพลย์ลิสต์ - Audio.Playlists.ENTRY_CONTENT_TYPE

เล่นเพลย์ลิสต์ที่เฉพาะเจาะจงหรือเพลย์ลิสต์ที่ตรงกับเกณฑ์บางอย่างที่ระบุโดยส่วนเสริมเพิ่มเติม

บริการเสริมเพิ่มเติม

  • EXTRA_MEDIA_ALBUM: อัลบั้ม
  • EXTRA_MEDIA_ARTIST: ศิลปิน
  • "android.intent.extra.genre": ประเภท
  • "android.intent.extra.playlist": เพลย์ลิสต์
  • EXTRA_MEDIA_TITLE: ชื่อเพลงที่ใช้เป็นพื้นฐานของเพลย์ลิสต์
  • QUERY (ต้องระบุ): สตริงที่มีการผสมผสานระหว่างอัลบั้ม ศิลปิน แนวเพลง เพลย์ลิสต์ หรือชื่อเพลง ระบบจะระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาจะประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้

ตัวอย่างความตั้งใจ

หากผู้ใช้ต้องการฟังเพลงจากศิลปินคนใดคนหนึ่ง แอปค้นหาอาจสร้าง Intent ต่อไปนี้

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

ตัวอย่างตัวกรอง Intent

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

เมื่อจัดการ Intent นี้ในกิจกรรม ให้ตรวจสอบค่าของ EXTRA_MEDIA_FOCUS เพิ่มเติมใน Intent ที่เข้ามาเพื่อกำหนดโหมดการค้นหา เมื่อกิจกรรมของคุณระบุโหมดการค้นหาแล้ว ให้อ่านค่าของข้อมูลเพิ่มเติมสำหรับโหมดการค้นหานั้นๆ เมื่อมีข้อมูลนี้ แอปของคุณจะทำการค้นหาภายในคลังเพื่อเล่นเนื้อหาที่ตรงกับคำค้นหาได้ ดังที่แสดงในตัวอย่างต่อไปนี้

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

โน้ตใหม่

การสร้างโน้ตเป็นการดำเนินการที่พบบ่อยสำหรับแอปจดโน้ต สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้

สร้างโน้ต

หากต้องการสร้างโน้ตใหม่ ให้ใช้การดำเนินการ ACTION_CREATE_NOTE และระบุรายละเอียดโน้ต เช่น เรื่องและข้อความ โดยใช้ข้อมูลเพิ่มเติมต่อไปนี้

หมายเหตุ: แอปต้องขอการยืนยันจากผู้ใช้ก่อนดำเนินการนี้ให้เสร็จสมบูรณ์

การดำเนินการ
ACTION_CREATE_NOTE
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
PLAIN_TEXT_TYPE
"*/*"
Extras
EXTRA_NAME
สตริงที่ระบุชื่อหรือเรื่องของโน้ต
EXTRA_TEXT
สตริงที่ระบุข้อความของโน้ต

ตัวอย่างความตั้งใจ

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

ตัวอย่างตัวกรอง Intent

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

โทรศัพท์

การเริ่มโทรออกเป็นการดำเนินการที่พบบ่อยสำหรับแอปโทรศัพท์ สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้

เริ่มโทรออก

หากต้องการเปิดแอปโทรศัพท์และโทรออก ให้ใช้การดำเนินการ ACTION_DIAL และระบุหมายเลขโทรศัพท์โดยใช้สคีม URI ต่อไปนี้ เมื่อแอปโทรศัพท์เปิดขึ้น ระบบจะแสดงหมายเลขโทรศัพท์ และผู้ใช้ต้องแตะปุ่มโทรเพื่อเริ่มโทรออก

การสั่งงานด้วยเสียงของ Google

  • "โทรหา 555-5555"
  • "โทรหาบ๊อบ"
  • "โทรหาข้อความเสียง"

หากต้องการโทรออกโดยตรง ให้ใช้การดำเนินการ ACTION_CALL และระบุหมายเลขโทรศัพท์โดยใช้สคีม URI ต่อไปนี้ เมื่อแอปโทรศัพท์เปิดขึ้น ระบบจะเริ่มโทรออก ผู้ใช้ไม่จำเป็นต้องแตะปุ่มโทร

การดำเนินการ ACTION_CALL กำหนดให้คุณต้องเพิ่มสิทธิ์ CALL_PHONE ลงในไฟล์ Manifest ดังนี้

<uses-permission android:name="android.permission.CALL_PHONE" />
การดำเนินการ
  • ACTION_DIAL - เปิดแป้นโทรศัพท์หรือแอปโทรศัพท์
  • ACTION_CALL - โทรออก (ต้องใช้สิทธิ์ CALL_PHONE)
สคีม URI ของข้อมูล
  • tel:<phone-number>
  • voicemail:<phone-number>
ประเภท MIME
ไม่มี

หมายเลขโทรศัพท์ที่ถูกต้องคือหมายเลขที่กำหนดไว้ใน IETF RFC 3966 ตัวอย่างที่ถูกต้องมีดังนี้

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

แป้นโทรศัพท์ของแอปโทรศัพท์เหมาะสำหรับการปรับรูปแบบให้เป็นมาตรฐาน เช่น หมายเลขโทรศัพท์ ดังนั้นจึงไม่จำเป็นต้องใช้รูปแบบที่อธิบายไว้ในเมธอด Uri.parse() อย่างเคร่งครัด อย่างไรก็ตาม หากคุณยังไม่ได้ลองใช้รูปแบบหรือยังไม่แน่ใจว่าจะจัดการได้หรือไม่ ให้ใช้เมธอด Uri.fromParts() แทน

ตัวอย่างความตั้งใจ

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

ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปการค้นหา รวมถึงข้อมูลที่คุณต้องใช้ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง

ค้นหาโดยใช้แอปที่เฉพาะเจาะจง

การสั่งงานด้วยเสียงของ Google

  • "ค้นหาวิดีโอแมวใน myvideoapp"

หากต้องการรองรับการค้นหาภายในบริบทของแอป ให้ประกาศตัวกรอง Intent ในแอปด้วยการดำเนินการ SEARCH_ACTION ดังที่แสดงในตัวอย่างตัวกรอง Intent ต่อไปนี้

หมายเหตุ: เราไม่แนะนำให้ใช้ SEARCH_ACTION สำหรับการค้นหาแอป แต่ให้ใช้การดำเนินการ GET_THING เพื่อใช้ประโยชน์จากการรองรับในตัวของ Google Assistant สำหรับการค้นหาในแอปแทน ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับ App Actions ของ Google Assistant

การดำเนินการ
"com.google.android.gms.actions.SEARCH_ACTION"
รองรับคำค้นหาจากการสั่งงานด้วยเสียงของ Google
Extras
QUERY
สตริงที่มีคำค้นหา

ตัวอย่างตัวกรอง 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>

ทำการค้นเว็บ

หากต้องการเริ่มการค้นเว็บ ให้ใช้การดำเนินการ ACTION_WEB_SEARCH และระบุสตริงการค้นหาใน SearchManager.QUERY เพิ่มเติม

การดำเนินการ
ACTION_WEB_SEARCH
สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
Extras
SearchManager.QUERY
สตริงการค้นหา

ตัวอย่างความตั้งใจ

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

การตั้งค่า

หากต้องการเปิดหน้าจอในแอปการตั้งค่าระบบเมื่อแอปกำหนดให้ผู้ใช้ต้องเปลี่ยนแปลงบางอย่าง ให้ใช้การดำเนินการตาม Intent อย่างใดอย่างหนึ่งต่อไปนี้

การดำเนินการ
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS

ดูหน้าจอการตั้งค่าอื่นๆ ที่มีได้ในเอกสารประกอบของ Settings

สคีม URI ของข้อมูล
ไม่มี
ประเภท MIME
ไม่มี

ตัวอย่างความตั้งใจ

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

การรับส่งข้อความ

การเขียนข้อความ SMS/MMS ที่มีไฟล์แนบเป็นการดำเนินการทั่วไปสำหรับแอปรับส่งข้อความ สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้

เขียนข้อความ SMS/MMS พร้อมไฟล์แนบ

หากต้องการเริ่มส่ง SMS หรือ MMS ให้ใช้การดำเนินการ Intent อย่างใดอย่างหนึ่งต่อไปนี้ และระบุรายละเอียดข้อความ เช่น หมายเลขโทรศัพท์ เรื่อง และเนื้อหาข้อความ โดยใช้คีย์เพิ่มเติมต่อไปนี้

การดำเนินการ
ACTION_SENDTO หรือ
ACTION_SEND หรือ
ACTION_SEND_MULTIPLE
สคีม URI ของข้อมูล
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>

รูปแบบเหล่านี้ทั้งหมดจะได้รับการจัดการในลักษณะเดียวกัน

ประเภท MIME
"text/plain"
"image/*"
"video/*"
Extras
"subject"
สตริงสำหรับเรื่องของข้อความ (โดยปกติจะใช้สำหรับ MMS เท่านั้น)
"sms_body"
สตริงสำหรับ SMS
EXTRA_STREAM
Uri ที่ชี้ไปยังรูปภาพหรือวิดีโอที่จะแนบ หากใช้การดำเนินการ ACTION_SEND_MULTIPLE ข้อมูลเพิ่มเติมนี้จะเป็น ArrayList ของออบเจ็กต์ Uri ที่ชี้ไปยังรูปภาพหรือวิดีโอที่จะแนบ

ตัวอย่างความตั้งใจ

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

หากต้องการตรวจสอบว่า Intent ของคุณได้รับการจัดการโดยแอปรับส่งข้อความเท่านั้น ไม่ใช่แอปอีเมลหรือแอปโซเชียลอื่นๆ ให้ใช้การดำเนินการ ACTION_SENDTO และรวมรูปแบบข้อมูล "smsto:" ดังที่แสดงในตัวอย่างต่อไปนี้

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

ตัวอย่างตัวกรอง Intent

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="text/plain" />
        <data android:type="image/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

หมายเหตุ: หากคุณกำลังพัฒนาแอปรับส่งข้อความ SMS/MMS คุณต้องใช้ตัวกรอง Intent สำหรับการดำเนินการเพิ่มเติมหลายอย่างเพื่อให้พร้อมใช้งานเป็นแอป SMS เริ่มต้นใน Android 4.4 ขึ้นไป ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบที่ Telephony

เว็บเบราว์เซอร์

การโหลด URL ของเว็บเป็นการดำเนินการทั่วไปสำหรับแอปเว็บเบราว์เซอร์ สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้

โหลด URL ของเว็บ

การสั่งงานด้วยเสียงของ Google

  • "เปิด example.com"

หากต้องการเปิดหน้าเว็บ ให้ใช้การดำเนินการ ACTION_VIEW และระบุ URL ของเว็บในข้อมูล Intent

การดำเนินการ
ACTION_VIEW
สคีม URI ของข้อมูล
http:<URL>
https:<URL>
ประเภท MIME
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

ตัวอย่างความตั้งใจ

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

ตัวอย่างตัวกรอง Intent

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <!-- Include the host attribute if you want your app to respond
             only to URLs with your app's domain. -->
        <data android:scheme="http" android:host="www.example.com" />
        <category android:name="android.intent.category.DEFAULT" />
        <!-- The BROWSABLE category is required to get links from web pages. -->
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
</activity>

เคล็ดลับ: หากแอป Android มีฟังก์ชันการทำงานคล้ายกับเว็บไซต์ ให้ใส่ตัวกรอง Intent สำหรับ URL ที่ชี้ไปยังเว็บไซต์ของคุณ จากนั้นหากผู้ใช้ติดตั้งแอปของคุณไว้ ลิงก์จากอีเมลหรือหน้าเว็บอื่นๆ ที่ชี้ไปยังเว็บไซต์ของคุณจะเปิดแอป Android แทนหน้าเว็บ ดูข้อมูลเพิ่มเติมได้ที่การจัดการ Android App Link

ตั้งแต่ Android 12 (ระดับ API 31) เป็นต้นไป Intent ของเว็บทั่วไปจะเปลี่ยนเป็นกิจกรรมในแอปก็ต่อเมื่อแอปของคุณได้รับอนุมัติสำหรับโดเมนที่เฉพาะเจาะจงซึ่งมีอยู่ใน Intent ของเว็บนั้น หากแอปไม่ได้รับอนุมัติสำหรับโดเมน ระบบจะเปลี่ยนเส้นทาง Intent ของเว็บไปยังแอปเบราว์เซอร์เริ่มต้นของผู้ใช้แทน

ยืนยัน Intent ด้วย Android Debug Bridge

หากต้องการยืนยันว่าแอปตอบสนองต่อ Intent ที่คุณต้องการรองรับ คุณสามารถใช้เครื่องมือ adb เพื่อเริ่ม Intent ที่เฉพาะเจาะจงได้โดยทำดังนี้

  1. ตั้งค่าอุปกรณ์ Android สำหรับการพัฒนาหรือใช้อุปกรณ์เสมือนจริง
  2. ติดตั้งแอปเวอร์ชันที่จัดการ Intent ที่คุณต้องการรองรับ
  3. เริ่ม Intent โดยใช้ adb:
    adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \
      -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
    

    เช่น

    adb shell am start -a android.intent.action.DIAL \
      -d tel:555-5555 -n org.example.MyApp/.MyActivity
    
  4. หากคุณกำหนดตัวกรอง Intent ที่จำเป็น ให้จัดการ Intent

ดูข้อมูลเพิ่มเติมได้ที่ออกคำสั่ง Shell