Intent ทั่วไป

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

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

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

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

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

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

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

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

นาฬิกาปลุก

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • "set timer for 5 minutes" (จับเวลา 5 นาที)

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

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

การดำเนินการ
ACTION_SET_TIMER
URI ของข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
ฟีเจอร์เพิ่มเติม
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 Filter:

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

<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"
ฟีเจอร์เพิ่มเติม
EXTRA_EVENT_ALL_DAY
บูลีนที่ระบุว่าเป็นกิจกรรมตลอดวันหรือไม่
EXTRA_EVENT_BEGIN_TIME
เวลาเริ่มต้นของกิจกรรม (มิลลิวินาทีนับตั้งแต่เริ่มต้น)
EXTRA_EVENT_END_TIME
เวลาสิ้นสุดของกิจกรรม (มิลลิวินาทีนับตั้งแต่เริ่มต้น)
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 Filter:

<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
ไม่มี
ฟีเจอร์เพิ่มเติม
EXTRA_OUTPUT
ตำแหน่ง URI ที่แอปกล้องบันทึกไฟล์รูปภาพหรือ วิดีโอ (เป็นออบเจ็กต์ Uri)

เมื่อแอปกล้องถ่ายรูปคืนค่า โฟกัสไปยังกิจกรรมของคุณได้สำเร็จ กล่าวคือ แอปได้รับโค้ดเรียกกลับ 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 Filter:

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

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

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

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

  • "ถ่ายรูป"

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

การดำเนินการ
INTENT_ACTION_STILL_IMAGE_CAMERA
รูปแบบ URI ของข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
ฟีเจอร์เพิ่มเติม
ไม่มี

ตัวอย่างเจตนา:

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

<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
ไม่มี
ฟีเจอร์เพิ่มเติม
ไม่มี

ตัวอย่างเจตนา:

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

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

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

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

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

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

ผลลัพธ์ Intent ที่ส่งไปยังการเรียกกลับ onActivityResult() จะมี content: URI ที่ชี้ไปยังรายชื่อติดต่อที่เลือก การตอบกลับจะให้สิทธิ์ชั่วคราวแก่แอปของคุณในการอ่านรายชื่อติดต่อนั้นโดยใช้ Contacts Provider API แม้ว่าแอปของคุณจะไม่มีสิทธิ์ 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 ดังที่แสดงในส่วนก่อนหน้า ผลลัพธ์จะให้สิทธิ์เข้าถึงข้อมูลที่ต้องการโดยตรง โดยที่คุณไม่ต้องทำการค้นหาที่ซับซ้อนมากขึ้นกับผู้ให้บริการรายชื่อติดต่อ

ผลลัพธ์ Intent ที่ส่งไปยัง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 การดำเนินการและระบุรายชื่อติดต่อด้วย content: URI เป็นข้อมูล 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 การดำเนินการ ระบุรายชื่อติดต่อด้วย content:URI เป็นข้อมูล Intent และรวมข้อมูลติดต่อที่รู้จักไว้ในส่วนเพิ่มเติมที่ระบุโดย ค่าคงที่ใน ContactsContract.Intents.Insert

คุณดึงข้อมูล URI ของรายชื่อติดต่อในตอนแรกได้ 2 วิธีหลักๆ ดังนี้

  • ใช้ URI ของผู้ติดต่อที่ส่งคืนโดยการดำเนินการ ACTION_PICK ที่แสดงในส่วนก่อนหน้า วิธีนี้ไม่จำเป็นต้องใช้สิทธิ์ของแอป
  • เข้าถึงรายการรายชื่อติดต่อทั้งหมดโดยตรงตามที่อธิบายไว้ในดึงข้อมูลรายการรายชื่อติดต่อ วิธีนี้ต้องใช้สิทธิ์ READ_CONTACTS
การดำเนินการ
ACTION_EDIT
รูปแบบ URI ของข้อมูล
content:<URI>
ประเภท MIME
ระบบจะอนุมานประเภทจาก URI ของรายชื่อติดต่อ
ฟีเจอร์เพิ่มเติม
ส่วนเสริมอย่างน้อย 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
ฟีเจอร์เพิ่มเติม
ส่วนเสริมอย่างน้อย 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"
"*/*"
ฟีเจอร์เพิ่มเติม
Intent.EXTRA_EMAIL
อาร์เรย์สตริงของอีเมลของผู้รับทั้งหมดในช่อง "ถึง"
Intent.EXTRA_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 Filter:

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

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

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

เรียกไฟล์ประเภทใดประเภทหนึ่ง

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

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

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

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

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

ตัวอย่างเจตนาในการรับรูปภาพ

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>

เปิดไฟล์ประเภทใดประเภทหนึ่ง

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

เช่น แทนที่จะเลือกจากเอกสาร PDF ที่มีอยู่ ACTION_CREATE_DOCUMENT Intent จะช่วยให้ผู้ใช้เลือกตำแหน่งที่ต้องการสร้างเอกสารใหม่ได้ เช่น ภายในแอปอื่นที่จัดการพื้นที่เก็บข้อมูลของเอกสาร จากนั้นแอปของคุณจะได้รับตำแหน่ง 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 หากผู้ใช้เลือกเพียง 1 รายการ คุณจะดึงข้อมูลรายการจาก getData() ได้ หากผู้ใช้เลือกมากกว่า 1 รายการ getData() จะแสดงค่าเป็น null และคุณต้อง ดึงข้อมูลแต่ละรายการจากออบเจ็กต์ ClipData ที่ getClipData() แสดงผลแทน

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

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

ตัวอย่างเจตนาในการรับรูปภาพ

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 ได้ แต่ระบบจะรับเจตนานี้ และแสดงไฟล์ทั้งหมดที่พร้อมใช้งานจากแอปต่างๆ ในอินเทอร์เฟซผู้ใช้แบบรวม

หากต้องการระบุไฟล์ของแอปใน 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

  • "เรียกรถแท็กซี่ให้หน่อย"
  • "call me a car"

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

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

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

การดำเนินการ
ACTION_RESERVE_TAXI_RESERVATION
URI ของข้อมูล
ไม่มี
ประเภท MIME
ไม่มี
ฟีเจอร์เพิ่มเติม
ไม่มี

ตัวอย่างเจตนา:

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

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

แผนที่

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

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

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

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

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

geo:latitude,longitude?z=zoom
แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุที่ระดับการซูมหนึ่งๆ ระดับการซูมที่ 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 Filter:

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

<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_ACTION_MEDIA_PLAY_FROM_SEARCHเจตนา แอปอาจเรียกใช้ Intent นี้เพื่อตอบสนองต่อคำสั่งเสียงของผู้ใช้ในการเล่นเพลง แอปที่รับ Intent นี้จะค้นหาในคลังของตัวเองเพื่อจับคู่เนื้อหาที่มีอยู่กับคำค้นหาที่ระบุและ เริ่มเล่นเนื้อหานั้น

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

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

ระบุโหมดการค้นหา: ไม่ว่าผู้ใช้จะค้นหาศิลปิน อัลบั้ม เพลง หรือเพลย์ลิสต์ใดก็ตาม โหมดการค้นหาส่วนใหญ่ต้องใช้ส่วนเสริมเพิ่มเติม เช่น หากผู้ใช้ สนใจฟังเพลงหนึ่งๆ ความตั้งใจอาจมีข้อมูลเพิ่มเติม 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 (ต้องระบุ): สตริงที่มีการผสมผสานระหว่าง อัลบั้มหรือศิลปิน โดยจะมีการระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อให้เข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาสามารถประมวลผลเจตนานี้เป็นการค้นหาที่ไม่มีโครงสร้างได้

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

เล่นเพลงที่เฉพาะเจาะจง

ส่วนเสริมเพิ่มเติม

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

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

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

ส่วนเสริมเพิ่มเติม

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

ตัวอย่างเจตนา:

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

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

<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 extra ใน 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
"*/*"
ฟีเจอร์เพิ่มเติม
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 Filter:

<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 ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับการทำงานของแอปของ Google Assistant

การดำเนินการ
"com.google.android.gms.actions.SEARCH_ACTION"
รองรับคำค้นหาจาก Google Voice Actions
ฟีเจอร์เพิ่มเติม
QUERY
สตริงที่มีคำค้นหา

ตัวอย่าง Intent Filter:

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

ค้นหาในเว็บ

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

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

ตัวอย่างเจตนา:

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/*"
ฟีเจอร์เพิ่มเติม
"subject"
สตริงสำหรับเรื่องของข้อความ (โดยปกติจะใช้สำหรับ MMS เท่านั้น)
"sms_body"
สตริงสำหรับข้อความ
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 Filter:

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

<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 ไปยังแอปเบราว์เซอร์เริ่มต้นของผู้ใช้แทน

ยืนยันความตั้งใจด้วย 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

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