Intent ทั่วไป

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

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

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

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

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

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

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

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

นาฬิกาปลุก

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

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

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

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

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

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

การดำเนินการ
ACTION_SET_ALARM
URL ข้อมูล
ไม่มี
ประเภท 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
URL ข้อมูล
ไม่มี
ประเภท 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 นี้ใช้งานได้ ใน Android 4.4 (API ระดับ 19) ขึ้นไป

การดำเนินการ
ACTION_SHOW_ALARMS
URL ข้อมูล
ไม่มี
ประเภท 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
URL ข้อมูล
Events.CONTENT_URI
ประเภท MIME
"vnd.android.cursor.dir/event"
เพิ่มเติม
EXTRA_EVENT_ALL_DAY
บูลีนที่ระบุว่าเป็นกิจกรรมตลอดทั้งวันหรือไม่
EXTRA_EVENT_BEGIN_TIME
เวลาเริ่มต้นของเหตุการณ์ (มิลลิวินาทีตั้งแต่ Epoch)
EXTRA_EVENT_END_TIME
เวลาสิ้นสุดของเหตุการณ์ (มิลลิวินาทีตั้งแต่ Epoch)
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)

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ความตั้งใจนี้เพื่อถ่ายภาพ รวมถึง วิธีสร้าง 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 เป็น 1 ประเภทเนื้อหาต่อไปนี้ เช่น CommonDataKinds.Phone.CONTENT_TYPEเพื่อดูหมายเลขโทรศัพท์ของรายชื่อติดต่อ

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

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

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

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

หรือค่า CONTENT_TYPE อื่นๆ อีก 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
เพิ่มเติม
ส่วนเสริมอย่างน้อย 1 รายการที่กำหนดไว้ใน ContactsContract.Intents.Insert

ตัวอย่าง 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
อาร์เรย์สตริงของ "CC" ทั้งหมด อีเมลของผู้รับ
Intent.EXTRA_BCC
อาร์เรย์สตริงของ "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 ของคุณได้รับการจัดการโดยแอปอีเมลเท่านั้น และไม่ใช่ ส่ง SMS หรือแอปโซเชียล จากนั้นใช้การดำเนินการ ACTION_SENDTO และรวมรูปแบบข้อมูล "mailto:" ดังที่แสดงในตัวอย่างต่อไปนี้

Kotlin

fun composeEmail(addresses: Array<String>, subject: String) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:") // Only email apps handle this.
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // Only email apps handle this.
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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

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

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

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

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

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

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

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

ใน 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 ของตำแหน่ง สามารถเขียนเอกสารใหม่

ขณะที่ความตั้งใจส่งไปถึง 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 หากคุณทำเช่นนั้น คุณต้องตั้งค่า ประเภท 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.
        ...
    }
}

แอปของบุคคลที่สามไม่สามารถตอบสนองต่อความตั้งใจด้วย การดำเนินการ 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
URL ข้อมูล
ไม่มี
ประเภท 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 และระบุ ข้อมูลตำแหน่งในข้อมูลความตั้งใจด้วยรูปแบบใดรูปแบบหนึ่งต่อไปนี้

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

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

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

  • "กางเกงยีนส์ของไมเคิล แจ็กสัน บิลลี"

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

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

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

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

ไม่จำกัด - "vnd.android.cursor.item/*"

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

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

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

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

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

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

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

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

เปิดเพลงประเภทใดประเภทหนึ่งโดยเฉพาะ

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

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

ศิลปิน - 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

<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"
  • "โทรหาบ๊อบ"
  • "โทรฟังข้อความเสียง"

หากต้องการโทรออกโดยตรง ให้ใช้การดำเนินการ 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 เอกสารประกอบเกี่ยวกับ App Actions

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

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

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

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

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

    เช่น

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

สำหรับข้อมูลเพิ่มเติม โปรดดู สร้างคำสั่ง Shell