Intent ทั่วไป

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

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

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

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

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

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

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

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

นาฬิกาปลุก

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

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

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

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

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

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

การดำเนินการ
ACTION_SET_ALARM
Data URI
ไม่มี
ประเภท MIME
ไม่มี
พิเศษ
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 การยืนยันและตั้งปลุกที่ระบุ

ตัวอย่าง Intent:

Kotlin

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

Java

public void createAlarm(String message, int hour, int minutes) {
    Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_HOUR, hour)
            .putExtra(AlarmClock.EXTRA_MINUTES, minutes);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
หมายเหตุ

หากต้องการเรียกใช้ 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
Data URI
ไม่มี
ประเภท MIME
ไม่มี
เพิ่มเติม
EXTRA_LENGTH
ระยะเวลาของนาฬิกาจับเวลาเป็นวินาที
EXTRA_MESSAGE
ข้อความที่กำหนดเองเพื่อระบุตัวจับเวลา
EXTRA_SKIP_UI
บูลีนที่ระบุว่าแอปที่ตอบกลับต้องข้าม UI หรือไม่เมื่อตั้งค่าตัวจับเวลา หากเป็นจริง แอปต้องข้าม UI การยืนยันและเริ่มตัวจับเวลาตามที่ระบุ

ตัวอย่าง Intent

Kotlin

fun startTimer(message: String, seconds: Int) {
    val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void startTimer(String message, int seconds) {
    Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
หมายเหตุ

หากต้องการเรียกใช้ 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 นี้และตอบสนองด้วยการแสดงรายการการปลุกปัจจุบัน

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

การดำเนินการ
ACTION_SHOW_ALARMS
Data 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
Data 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

ตัวอย่าง Intent

Kotlin

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

Java

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

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

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

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

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

ตัวอย่าง Intent:

Kotlin

const val REQUEST_IMAGE_CAPTURE = 1
val locationForPhotos: Uri = ...

fun capturePhoto(targetFilename: String) {
    val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply {
        putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename))
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        val thumbnail: Bitmap = data.getParcelableExtra("data")
        // Do other work with full size photo saved in locationForPhotos.
        ...
    }
}

Java

static final int REQUEST_IMAGE_CAPTURE = 1;
static final Uri locationForPhotos;

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

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelableExtra("data");
        // Do other work with full size photo saved in locationForPhotos.
        ...
    }
}

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

ตัวอย่าง 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
ไม่มี
พิเศษ
ไม่มี

ตัวอย่าง Intent

Kotlin

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

Java

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

ตัวอย่างตัวกรอง 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
ไม่มี
พิเศษ
ไม่มี

ตัวอย่าง Intent

Kotlin

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

Java

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

ตัวอย่างตัวกรอง 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: ที่ชี้ไปยังรายชื่อติดต่อที่เลือก การตอบกลับจะมอบสิทธิ์ชั่วคราวแก่แอปในการอ่านรายชื่อติดต่อนั้นโดยใช้ Contacts Provider API แม้ว่าแอปจะไม่มีสิทธิ์ READ_CONTACTS ก็ตาม

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

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

ตัวอย่าง Intent:

Kotlin

const val REQUEST_SELECT_CONTACT = 1

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

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

Java

static final int REQUEST_SELECT_CONTACT = 1;

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

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

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

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

เลือกข้อมูลติดต่อที่ต้องการ

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

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

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

ผลลัพธ์ 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 อื่นๆ อีก 1 ค่าภายใต้ ContactsContract

ตัวอย่าง Intent:

Kotlin

const val REQUEST_SELECT_PHONE_NUMBER = 1

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

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

Java

static final int REQUEST_SELECT_PHONE_NUMBER = 1;

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

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

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

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

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

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

ตัวอย่าง Intent:

Kotlin

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

Java

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

แก้ไขผู้ติดต่อที่มีอยู่

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

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

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

ตัวอย่าง Intent:

Kotlin

fun editContact(contactUri: Uri, email: String) {
    val intent = Intent(Intent.ACTION_EDIT).apply {
        data = contactUri
        putExtra(ContactsContract.Intents.Insert.EMAIL, email)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void editContact(Uri contactUri, String email) {
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setData(contactUri);
    intent.putExtra(Intents.Insert.EMAIL, email);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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

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

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

การดำเนินการ
ACTION_INSERT
รูปแบบ URI ของข้อมูล
ไม่มี
ประเภท MIME
Contacts.CONTENT_TYPE
พิเศษ
ฟีเจอร์เสริมที่ระบุไว้ใน ContactsContract.Intents.Insert อย่างน้อย 1 รายการ

ตัวอย่าง Intent:

Kotlin

fun insertContact(name: String, email: String) {
    val intent = Intent(Intent.ACTION_INSERT).apply {
        type = ContactsContract.Contacts.CONTENT_TYPE
        putExtra(ContactsContract.Intents.Insert.NAME, name)
        putExtra(ContactsContract.Intents.Insert.EMAIL, email)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void insertContact(String name, String email) {
    Intent intent = new Intent(Intent.ACTION_INSERT);
    intent.setType(Contacts.CONTENT_TYPE);
    intent.putExtra(Intents.Insert.NAME, name);
    intent.putExtra(Intents.Insert.EMAIL, email);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแทรกรายชื่อติดต่อได้ที่หัวข้อแก้ไขรายชื่อติดต่อโดยใช้ 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 หลายรายการ

ตัวอย่าง Intent

Kotlin

fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SEND).apply {
        type = "*/*"
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void composeEmail(String[] addresses, String subject, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("*/*");
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

หากต้องการให้แอปอีเมลเท่านั้นจัดการ 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 ผลลัพธ์ที่ส่งไปยังเมธอด 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 หากผู้ใช้เลือกเพียงรายการเดียว คุณจะดึงข้อมูลรายการนั้นได้จาก 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 ที่สอดคล้องกับประเภทไฟล์ที่ผู้ใช้ต้องเลือก
พิเศษ
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

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

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

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

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

การดำเนินการ
ACTION_RESERVE_TAXI_RESERVATION
Data URI
ไม่มี
ประเภท MIME
ไม่มี
พิเศษ
ไม่มี

ตัวอย่าง Intent

Kotlin

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

Java

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

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

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

แผนที่

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

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

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

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

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

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

ตัวอย่าง Intent

Kotlin

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

Java

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

ตัวอย่างตัวกรอง 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"
หรืออื่นๆ ที่แอปของคุณกำหนด

ตัวอย่าง Intent:

Kotlin

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

Java

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

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

  • "play michael jackson billie jean"

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

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

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

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

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

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

ฟีเจอร์เพิ่มเติม

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

ไม่เป็นโครงสร้าง - "vnd.android.cursor.item/*"

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

ฟีเจอร์เพิ่มเติม

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

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

เปิดเพลงแนวใดแนวหนึ่ง

ฟีเจอร์เพิ่มเติม

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

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

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

ฟีเจอร์เพิ่มเติม

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

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

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

ข้อมูลเพิ่มเติม:

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

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

เล่นเพลงที่ต้องการ

ฟีเจอร์เพิ่มเติม

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

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

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

ฟีเจอร์เพิ่มเติม

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

ตัวอย่าง Intent:

หากผู้ใช้ต้องการฟังเพลงจากศิลปินที่เฉพาะเจาะจง แอปค้นหาอาจสร้าง 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
"*/*"
เพิ่มเติม
EXTRA_NAME
สตริงที่มีชื่อหรือเรื่องของโน้ต
EXTRA_TEXT
สตริงที่ระบุข้อความของโน้ต

ตัวอย่าง Intent:

Kotlin

fun createNote(subject: String, text: String) {
    val intent = Intent(NoteIntents.ACTION_CREATE_NOTE).apply {
        putExtra(NoteIntents.EXTRA_NAME, subject)
        putExtra(NoteIntents.EXTRA_TEXT, text)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void createNote(String subject, String text) {
    Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE)
            .putExtra(NoteIntents.EXTRA_NAME, subject)
            .putExtra(NoteIntents.EXTRA_TEXT, text);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

ตัวอย่างตัวกรอง 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"
  • "call bob"
  • "โทรหาข้อความเสียง"

หากต้องการโทรออกโดยตรง ให้ใช้การดําเนินการ 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()วิธีแทน

ตัวอย่าง Intent:

Kotlin

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

Java

public void dialPhoneNumber(String phoneNumber) {
    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:" + phoneNumber));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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

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

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

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

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

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

การดำเนินการ
"com.google.android.gms.actions.SEARCH_ACTION"
รองรับคำค้นหาจากการสั่งงานด้วยเสียงของ Google
พิเศษ
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 extra

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

ตัวอย่าง Intent

Kotlin

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

Java

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

การตั้งค่า

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

ตัวอย่าง Intent

Kotlin

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

Java

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

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

การเขียนข้อความ 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"
สตริงสำหรับ SMS
EXTRA_STREAM
Uri ที่ชี้ไปยังรูปภาพหรือวิดีโอที่จะแนบ หากใช้การดำเนินการ ACTION_SEND_MULTIPLE ข้อมูลเพิ่มเติมนี้จะเป็น ArrayList ของออบเจ็กต์ Uri ที่ชี้ไปยังรูปภาพหรือวิดีโอที่จะแนบ

ตัวอย่าง Intent:

Kotlin

fun composeMmsMessage(message: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        type = HTTP.PLAIN_TEXT_TYPE
        putExtra("sms_body", message)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setType(HTTP.PLAIN_TEXT_TYPE);
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

หากต้องการตรวจสอบว่า 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"

ตัวอย่าง Intent:

Kotlin

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

Java

public void openWebPage(String url) {
    Uri webpage = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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

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