Intent ช่วยให้คุณเริ่มกิจกรรมในแอปอื่นได้โดยอธิบายการดำเนินการที่ต้องการทำ เช่น "ดูแผนที่" หรือ "ถ่ายรูปภาพ" ในออบเจ็กต์ Intent
Intent ประเภทนี้เรียกว่า Intent โดยนัย เนื่องจากไม่ได้ระบุคอมโพเนนต์ของแอปที่จะเริ่มต้น แต่จะระบุการดำเนินการและระบุข้อมูลบางอย่างที่จะใช้ดำเนินการแทน
เมื่อคุณเรียกใช้ startActivity()
หรือ startActivityForResult()
และส่ง Intent โดยนัย ระบบจะแก้ไข
Intent ไปยังแอปที่จัดการ Intent ได้ และเริ่ม Activity
ที่เกี่ยวข้อง หากมีแอปมากกว่า 1 แอป
ที่จัดการ Intent ได้ ระบบจะแสดงกล่องโต้ตอบให้ผู้ใช้
เลือกแอปที่จะใช้
หน้านี้อธิบาย Intent โดยนัยหลายรายการที่คุณใช้เพื่อดำเนินการ ทั่วไปได้ โดยจัดระเบียบตามประเภทของแอปที่จัดการ Intent แต่ละส่วนยังแสดงวิธีสร้างตัวกรองเจตนาเพื่อโฆษณาความสามารถของแอปในการดำเนินการด้วย
ข้อควรระวัง: หากไม่มีแอปในอุปกรณ์ที่รับ
Intent โดยนัยได้ แอปจะขัดข้องเมื่อเรียกใช้ startActivity()
หากต้องการยืนยันก่อนว่ามีแอปที่รับ Intent ให้เรียกใช้ resolveActivity()
ในออบเจ็กต์ Intent
หากผลลัพธ์ไม่ใช่ Null แสดงว่ามีแอปอย่างน้อย 1 แอปที่จัดการ Intent ได้ และเรียกใช้ startActivity()
ได้อย่างปลอดภัย หากผลลัพธ์เป็น null อย่าใช้อินเทนต์ และหากเป็นไปได้ ให้ปิดใช้ฟีเจอร์ที่เรียกใช้อินเทนต์
หากคุณไม่คุ้นเคยกับวิธีสร้าง Intent หรือตัวกรอง Intent โปรดอ่านIntent และตัวกรอง Intent ก่อน
หากต้องการดูวิธีเรียกใช้ Intent ที่แสดงในหน้านี้จากโฮสต์การพัฒนา โปรดดูส่วนยืนยัน Intent ด้วย Android Debug Bridge
การสั่งงานด้วยเสียงของ Google
Google Voice Actions จะเรียกใช้ Intent บางอย่างที่แสดงในหน้านี้เพื่อตอบสนองต่อ คำสั่งเสียง ดูข้อมูลเพิ่มเติมได้ที่ เริ่มต้นใช้งานการดำเนินการด้วยเสียงของระบบ
นาฬิกาปลุก
การดำเนินการทั่วไปสำหรับแอปนาฬิกาปลุก รวมถึงข้อมูลที่คุณต้องใช้ ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่างมีดังนี้
สร้างการตั้งปลุก
หากต้องการสร้างการปลุกใหม่ ให้ใช้ACTION_SET_ALARM
การดำเนินการและระบุรายละเอียดการปลุก เช่น เวลาและข้อความ โดยใช้ข้อมูลเพิ่มเติมต่อไปนี้
หมายเหตุ: มีเฉพาะส่วนเสริมชั่วโมง นาที และข้อความเท่านั้นที่ใช้ได้ ใน Android 2.3 (API ระดับ 9) และต่ำกว่า ส่วนฟีเจอร์อื่นๆ จะพร้อมใช้งานในแพลตฟอร์มเวอร์ชันที่สูงกว่า
- การดำเนินการ
ACTION_SET_ALARM
- URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- ฟีเจอร์เพิ่มเติม
-
EXTRA_HOUR
- ชั่วโมงสำหรับการปลุก
EXTRA_MINUTES
- นาทีสำหรับปลุก
EXTRA_MESSAGE
- ข้อความที่กำหนดเองเพื่อระบุการปลุก
EXTRA_DAYS
ArrayList
รวมถึงวันในสัปดาห์ที่การปลุกนี้ จะซ้ำ คุณต้องประกาศแต่ละวันด้วยจำนวนเต็มจากคลาสCalendar
เช่นMONDAY
สำหรับการปลุกแบบครั้งเดียว ไม่ต้องระบุค่านี้เพิ่มเติม
EXTRA_RINGTONE
- URI ที่ระบุเสียงเรียกเข้าที่จะใช้กับนาฬิกาปลุก หรือ
VALUE_RINGTONE_SILENT
หากไม่ต้องการใช้เสียงเรียกเข้าcontent:
หากต้องการใช้เสียงเรียกเข้าเริ่มต้น ให้ไม่ต้องระบุส่วนเสริมนี้
EXTRA_VIBRATE
- บูลีนที่ระบุว่าจะให้สั่นสำหรับการปลุกนี้หรือไม่
EXTRA_SKIP_UI
- บูลีนที่ระบุว่าแอปที่ตอบสนองต้องข้าม UI ของตัวเองเมื่อตั้งปลุกหรือไม่ หากเป็นจริง แอปต้องข้าม UI การยืนยันและตั้งปลุกที่ระบุ
ตัวอย่างเจตนา:
Kotlin
fun createAlarm(message: String, hour: Int, minutes: Int) { val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_HOUR, hour) putExtra(AlarmClock.EXTRA_MINUTES, minutes) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void createAlarm(String message, int hour, int minutes) { Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_HOUR, hour) .putExtra(AlarmClock.EXTRA_MINUTES, minutes); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
หากต้องการเรียกใช้ Intent ACTION_SET_ALARM
แอปต้องมีสิทธิ์
SET_ALARM
ดังนี้
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
สร้างตัวจับเวลา
หากต้องการสร้างตัวนับถอยหลัง ให้ใช้การดำเนินการ ACTION_SET_TIMER
และระบุรายละเอียดตัวจับเวลา
เช่น ระยะเวลา โดยใช้ส่วนเสริมต่อไปนี้
หมายเหตุ: Intent นี้พร้อมใช้งานใน Android 4.4 (API ระดับ 19) ขึ้นไป
- การดำเนินการ
ACTION_SET_TIMER
- URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- ฟีเจอร์เพิ่มเติม
-
EXTRA_LENGTH
- ความยาวของตัวจับเวลาเป็นวินาที
EXTRA_MESSAGE
- ข้อความที่กำหนดเองเพื่อระบุตัวจับเวลา
EXTRA_SKIP_UI
- บูลีนที่ระบุว่าแอปที่ตอบสนองต้องข้าม UI ของตัวเองเมื่อตั้งค่าตัวจับเวลาหรือไม่ หากเป็นจริง แอปต้องข้าม UI การยืนยันและเริ่มตัวจับเวลาที่ระบุ
ตัวอย่างเจตนา:
Kotlin
fun startTimer(message: String, seconds: Int) { val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_LENGTH, seconds) putExtra(AlarmClock.EXTRA_SKIP_UI, true) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void startTimer(String message, int seconds) { Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
หากต้องการเรียกใช้ Intent ACTION_SET_TIMER
แอปต้องมีสิทธิ์
SET_ALARM
ดังนี้
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
แสดงการเตือนทั้งหมด
หากต้องการแสดงรายการการปลุก ให้ใช้ACTION_SHOW_ALARMS
การดำเนินการ
แม้ว่าจะมีแอปไม่มากนักที่เรียกใช้ Intent นี้ เนื่องจากส่วนใหญ่เป็นแอปของระบบ แต่แอปใดก็ตามที่ทำงานเป็นนาฬิกาปลุกสามารถใช้ ตัวกรอง Intent นี้และตอบสนองด้วยการแสดงรายการการปลุกปัจจุบันได้
หมายเหตุ: Intent นี้พร้อมใช้งานใน Android 4.4 (API ระดับ 19) ขึ้นไป
- การดำเนินการ
ACTION_SHOW_ALARMS
- URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
ปฏิทิน
การเพิ่มกิจกรรมเป็นการดำเนินการทั่วไปสำหรับแอปปฏิทิน สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ ข้อมูลในส่วนต่อไปนี้
เพิ่มกิจกรรมในปฏิทิน
หากต้องการเพิ่มกิจกรรมใหม่ลงในปฏิทินของผู้ใช้ ให้ใช้
ACTION_INSERT
การดำเนินการและระบุ URI ข้อมูลโดยใช้
Events.CONTENT_URI
จากนั้นคุณจะระบุรายละเอียดเหตุการณ์ต่างๆ ได้โดยใช้ส่วนเสริมต่อไปนี้
- การดำเนินการ
ACTION_INSERT
- URI ของข้อมูล
Events.CONTENT_URI
- ประเภท MIME
"vnd.android.cursor.dir/event"
- ฟีเจอร์เพิ่มเติม
-
EXTRA_EVENT_ALL_DAY
- บูลีนที่ระบุว่าเป็นกิจกรรมตลอดวันหรือไม่
EXTRA_EVENT_BEGIN_TIME
- เวลาเริ่มต้นของกิจกรรม (มิลลิวินาทีนับตั้งแต่เริ่มต้น)
EXTRA_EVENT_END_TIME
- เวลาสิ้นสุดของกิจกรรม (มิลลิวินาทีนับตั้งแต่เริ่มต้น)
TITLE
- ชื่อกิจกรรม
DESCRIPTION
- คำอธิบายกิจกรรม
EVENT_LOCATION
- สถานที่จัดกิจกรรม
EXTRA_EMAIL
- รายการอีเมลที่คั่นด้วยคอมมาซึ่งระบุผู้ได้รับเชิญ
คุณระบุรายละเอียดเหตุการณ์อื่นๆ ได้อีกมากมายโดยใช้ค่าคงที่ที่กำหนดไว้ในคลาส
CalendarContract.EventsColumns
ตัวอย่างเจตนา:
Kotlin
fun addEvent(title: String, location: String, begin: Long, end: Long) { val intent = Intent(Intent.ACTION_INSERT).apply { data = Events.CONTENT_URI putExtra(Events.TITLE, title) putExtra(Events.EVENT_LOCATION, location) putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void addEvent(String title, String location, long begin, long end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.INSERT" /> <data android:mimeType="vnd.android.cursor.dir/event" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
กล้อง
การดำเนินการทั่วไปสำหรับแอปกล้อง รวมถึงข้อมูลที่จำเป็นในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่างมีดังนี้
ถ่ายรูปภาพหรือวิดีโอแล้วส่งกลับ
หากต้องการเปิดแอปกล้องและรับรูปภาพหรือวิดีโอที่ได้ ให้ใช้การดำเนินการ ACTION_IMAGE_CAPTURE
หรือ ACTION_VIDEO_CAPTURE
นอกจากนี้ ให้ระบุตำแหน่ง URI ที่คุณต้องการให้กล้องบันทึกรูปภาพหรือวิดีโอใน EXTRA_OUTPUT
extra
- การดำเนินการ
ACTION_IMAGE_CAPTURE
หรือ
ACTION_VIDEO_CAPTURE
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- ฟีเจอร์เพิ่มเติม
-
EXTRA_OUTPUT
- ตำแหน่ง URI ที่แอปกล้องบันทึกไฟล์รูปภาพหรือ
วิดีโอ (เป็นออบเจ็กต์
Uri
)
เมื่อแอปกล้องถ่ายรูปคืนค่า
โฟกัสไปยังกิจกรรมของคุณได้สำเร็จ กล่าวคือ แอปได้รับโค้ดเรียกกลับ onActivityResult()
คุณจะ
เข้าถึงรูปภาพหรือวิดีโอได้ที่ URI ที่คุณระบุ
ด้วยค่า EXTRA_OUTPUT
หมายเหตุ: เมื่อคุณใช้ ACTION_IMAGE_CAPTURE
เพื่อถ่ายรูปภาพ กล้องอาจแสดงสำเนาที่ลดขนาดลงหรือภาพขนาดย่อของรูปภาพในผลลัพธ์ Intent
ซึ่งบันทึกเป็น Bitmap
ในช่องเพิ่มเติมชื่อ "data"
ตัวอย่างเจตนา:
Kotlin
const val REQUEST_IMAGE_CAPTURE = 1 val locationForPhotos: Uri = ... fun capturePhoto(targetFilename: String) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)) } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") // Do other work with full size photo saved in locationForPhotos. ... } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri locationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelableExtra("data"); // Do other work with full size photo saved in locationForPhotos. ... } }
หากต้องการดำเนินการนี้เมื่อใช้ Android 12 (API ระดับ 31) ขึ้นไป โปรดดูตัวอย่าง Intent ต่อไปนี้
ตัวอย่างเจตนา:
Kotlin
val REQUEST_IMAGE_CAPTURE = 1 private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } catch (ActivityNotFoundException e) { // Display error state to the user. } } </section></div>
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ Intent นี้เพื่อถ่ายรูปภาพ รวมถึงวิธีสร้าง Uri
ที่เหมาะสมสำหรับตำแหน่งเอาต์พุตได้ที่หัวข้อ
ถ่ายรูปภาพหรือ
ถ่ายวิดีโอ
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เมื่อจัดการเจตนานี้ ให้กิจกรรมตรวจสอบ EXTRA_OUTPUT
เพิ่มเติมใน Intent
ที่เข้ามา จากนั้นบันทึกรูปภาพหรือวิดีโอที่จับภาพไว้ใน
ตำแหน่งที่ระบุโดยข้อมูลเพิ่มเติมนั้น แล้วเรียกใช้ setResult()
ด้วย Intent
ที่มีภาพขนาดย่อที่บีบอัดแล้วในข้อมูลเพิ่มเติม
ชื่อ "data"
เริ่มแอปกล้องถ่ายรูปในโหมดภาพนิ่ง
หากต้องการเปิดแอปกล้องถ่ายรูปในโหมดภาพนิ่ง ให้ใช้การดำเนินการ INTENT_ACTION_STILL_IMAGE_CAMERA
- การดำเนินการ
INTENT_ACTION_STILL_IMAGE_CAMERA
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- ฟีเจอร์เพิ่มเติม
- ไม่มี
ตัวอย่างเจตนา:
Kotlin
private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เริ่มแอปกล้องถ่ายรูปในโหมดวิดีโอ
หากต้องการเปิดแอปกล้องถ่ายรูปในโหมดวิดีโอ ให้ใช้การดำเนินการ INTENT_ACTION_VIDEO_CAMERA
- การดำเนินการ
INTENT_ACTION_VIDEO_CAMERA
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- ฟีเจอร์เพิ่มเติม
- ไม่มี
ตัวอย่างเจตนา:
Kotlin
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
Java
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
แอปรายชื่อติดต่อ/ผู้คน
การดำเนินการทั่วไปสำหรับแอปการจัดการรายชื่อติดต่อ รวมถึงข้อมูลที่คุณต้องใช้ ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่างมีดังนี้
เลือกรายชื่อติดต่อ
หากต้องการให้ผู้ใช้เลือกรายชื่อติดต่อและให้สิทธิ์แอปของคุณเข้าถึงข้อมูลติดต่อทั้งหมด
ให้ใช้ACTION_PICK
การดำเนินการและระบุประเภท MIME เป็น
Contacts.CONTENT_TYPE
ผลลัพธ์ Intent
ที่ส่งไปยังการเรียกกลับ onActivityResult()
จะมี content:
URI ที่ชี้ไปยังรายชื่อติดต่อที่เลือก การตอบกลับจะให้สิทธิ์ชั่วคราวแก่แอปของคุณในการอ่านรายชื่อติดต่อนั้นโดยใช้ Contacts Provider API แม้ว่าแอปของคุณจะไม่มีสิทธิ์ READ_CONTACTS
ก็ตาม
เคล็ดลับ: หากต้องการเข้าถึงข้อมูลติดต่อเพียงบางส่วน เช่น หมายเลขโทรศัพท์หรืออีเมล ให้ไปที่ส่วนถัดไปเพื่อดูวิธีเลือกข้อมูลติดต่อที่เฉพาะเจาะจงแทน
- การดำเนินการ
ACTION_PICK
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
Contacts.CONTENT_TYPE
ตัวอย่างเจตนา:
Kotlin
const val REQUEST_SELECT_CONTACT = 1 fun selectContact() { val intent = Intent(Intent.ACTION_PICK).apply { type = ContactsContract.Contacts.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { val contactUri: Uri = data.data // Do something with the selected contact at contactUri. //... } }
Java
static final int REQUEST_SELECT_CONTACT = 1; public void selectContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); // Do something with the selected contact at contactUri. ... } }
ดูข้อมูลเกี่ยวกับวิธีดึงข้อมูลติดต่อเมื่อมี URI ของรายชื่อติดต่อแล้วได้ที่ดึงข้อมูล สำหรับรายชื่อติดต่อ
เมื่อเรียก URI ของรายชื่อติดต่อโดยใช้ Intent นี้ โดยทั่วไปคุณไม่จำเป็นต้องมี
READ_CONTACTS
สิทธิ์ในการอ่านรายละเอียดพื้นฐานของรายชื่อติดต่อนั้น เช่น ชื่อที่แสดงและ
ไม่ว่ารายชื่อติดต่อจะติดดาวหรือไม่ อย่างไรก็ตาม หากคุณต้องการอ่านข้อมูลที่เฉพาะเจาะจงมากขึ้นเกี่ยวกับผู้ติดต่อ เช่น หมายเลขโทรศัพท์หรืออีเมล คุณจะต้องมีREAD_CONTACTS
สิทธิ์
เลือกข้อมูลติดต่อที่เฉพาะเจาะจง
หากต้องการให้ผู้ใช้เลือกข้อมูลที่เฉพาะเจาะจงจากรายชื่อติดต่อ เช่น
หมายเลขโทรศัพท์ อีเมล หรือประเภทข้อมูลอื่นๆ ให้ใช้ACTION_PICK
การดำเนินการและระบุประเภท MIME เป็นประเภทเนื้อหาใดประเภทหนึ่งต่อไปนี้ เช่น
CommonDataKinds.Phone.CONTENT_TYPE
เพื่อรับหมายเลขโทรศัพท์ของรายชื่อติดต่อ
หมายเหตุ: ในหลายกรณี แอปของคุณต้องมีสิทธิ์
READ_CONTACTS
เพื่อดูข้อมูลที่เฉพาะเจาะจงเกี่ยวกับรายชื่อติดต่อหนึ่งๆ
หากคุณต้องการดึงข้อมูลเพียงประเภทเดียวจากรายชื่อติดต่อ เทคนิคนี้ที่มี
CONTENT_TYPE
จากคลาส
ContactsContract.CommonDataKinds
จะมีประสิทธิภาพมากกว่า
การใช้ Contacts.CONTENT_TYPE
ดังที่แสดงในส่วนก่อนหน้า ผลลัพธ์จะให้สิทธิ์เข้าถึงข้อมูลที่ต้องการโดยตรง
โดยที่คุณไม่ต้องทำการค้นหาที่ซับซ้อนมากขึ้นกับผู้ให้บริการรายชื่อติดต่อ
ผลลัพธ์ Intent
ที่ส่งไปยังonActivityResult()
การเรียกกลับมี URI content:
ที่ชี้ไปยังข้อมูลรายชื่อติดต่อที่เลือก การตอบกลับจะให้สิทธิ์ชั่วคราวแก่แอปของคุณในการอ่านข้อมูลรายชื่อติดต่อนั้น แม้ว่าแอปจะไม่มีREAD_CONTACTS
สิทธิ์ก็ตาม
- การดำเนินการ
ACTION_PICK
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
-
CommonDataKinds.Phone.CONTENT_TYPE
- เลือกจากรายชื่อติดต่อที่มีหมายเลขโทรศัพท์
CommonDataKinds.Email.CONTENT_TYPE
- เลือกจากรายชื่อติดต่อที่มีอีเมล
CommonDataKinds.StructuredPostal.CONTENT_TYPE
- เลือกจากรายชื่อติดต่อที่มีที่อยู่ไปรษณีย์
หรือ
CONTENT_TYPE
ค่า อื่นๆ อีกมากมายในส่วนContactsContract
ตัวอย่างเจตนา:
Kotlin
const val REQUEST_SELECT_PHONE_NUMBER = 1 fun selectContact() { // Start an activity for the user to pick a phone number from contacts. val intent = Intent(Intent.ACTION_PICK).apply { type = CommonDataKinds.Phone.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) { // Get the URI and query the content provider for the phone number. val contactUri: Uri = data.data val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER) contentResolver.query(contactUri, projection, null, null, null).use { cursor -> // If the cursor returned is valid, get the phone number. if (cursor.moveToFirst()) { val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER) val number = cursor.getString(numberIndex) // Do something with the phone number. ... } } } }
Java
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // Start an activity for the user to pick a phone number from contacts. Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { // Get the URI and query the content provider for the phone number. Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // If the cursor returned is valid, get the phone number. if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // Do something with the phone number. //... } } }
ดูรายชื่อติดต่อ
หากต้องการแสดงรายละเอียดสำหรับรายชื่อติดต่อที่รู้จัก ให้ใช้ACTION_VIEW
การดำเนินการและระบุรายชื่อติดต่อด้วย content:
URI เป็นข้อมูล Intent
คุณดึง URI ของรายชื่อติดต่อได้ 2 วิธีหลักๆ ดังนี้
- ใช้ URI ของผู้ติดต่อที่ส่งคืนโดยการดำเนินการ
ACTION_PICK
ที่แสดงในส่วนก่อนหน้า วิธีนี้ไม่จำเป็นต้องใช้สิทธิ์ของแอป - เข้าถึงรายการรายชื่อติดต่อทั้งหมดโดยตรงตามที่อธิบายไว้ในดึงข้อมูลรายการรายชื่อติดต่อ วิธีนี้ต้องใช้สิทธิ์
READ_CONTACTS
- การดำเนินการ
ACTION_VIEW
- รูปแบบ URI ของข้อมูล
content:<URI>
- ประเภท MIME
- ไม่มี ระบบจะอนุมานประเภทจาก URI ของรายชื่อติดต่อ
ตัวอย่างเจตนา:
Kotlin
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
แก้ไขรายชื่อติดต่อที่มีอยู่
หากต้องการแก้ไขรายชื่อติดต่อที่รู้จัก ให้ใช้ACTION_EDIT
การดำเนินการ ระบุรายชื่อติดต่อด้วย content:
URI
เป็นข้อมูล Intent และรวมข้อมูลติดต่อที่รู้จักไว้ในส่วนเพิ่มเติมที่ระบุโดย
ค่าคงที่ใน ContactsContract.Intents.Insert
คุณดึงข้อมูล URI ของรายชื่อติดต่อในตอนแรกได้ 2 วิธีหลักๆ ดังนี้
- ใช้ URI ของผู้ติดต่อที่ส่งคืนโดยการดำเนินการ
ACTION_PICK
ที่แสดงในส่วนก่อนหน้า วิธีนี้ไม่จำเป็นต้องใช้สิทธิ์ของแอป - เข้าถึงรายการรายชื่อติดต่อทั้งหมดโดยตรงตามที่อธิบายไว้ในดึงข้อมูลรายการรายชื่อติดต่อ วิธีนี้ต้องใช้สิทธิ์
READ_CONTACTS
- การดำเนินการ
ACTION_EDIT
- รูปแบบ URI ของข้อมูล
content:<URI>
- ประเภท MIME
- ระบบจะอนุมานประเภทจาก URI ของรายชื่อติดต่อ
- ฟีเจอร์เพิ่มเติม
- ส่วนเสริมอย่างน้อย 1 รายการที่กำหนดไว้ใน
ContactsContract.Intents.Insert
เพื่อให้คุณป้อนข้อมูลในช่องรายละเอียดการติดต่อได้
ตัวอย่างเจตนา:
Kotlin
fun editContact(contactUri: Uri, email: String) { val intent = Intent(Intent.ACTION_EDIT).apply { data = contactUri putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void editContact(Uri contactUri, String email) { Intent intent = new Intent(Intent.ACTION_EDIT); intent.setData(contactUri); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขรายชื่อติดต่อได้ที่แก้ไข รายชื่อติดต่อโดยใช้ Intent
แทรกรายชื่อติดต่อ
หากต้องการแทรกรายชื่อติดต่อใหม่ ให้ใช้การดำเนินการ ACTION_INSERT
ระบุ Contacts.CONTENT_TYPE
เป็น
ประเภท MIME และรวมข้อมูลติดต่อที่ทราบไว้ในส่วนพิเศษที่ระบุโดย
ค่าคงที่ใน ContactsContract.Intents.Insert
- การดำเนินการ
ACTION_INSERT
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
Contacts.CONTENT_TYPE
- ฟีเจอร์เพิ่มเติม
- ส่วนเสริมอย่างน้อย 1 รายการที่กำหนดไว้ใน
ContactsContract.Intents.Insert
ตัวอย่างเจตนา:
Kotlin
fun insertContact(name: String, email: String) { val intent = Intent(Intent.ACTION_INSERT).apply { type = ContactsContract.Contacts.CONTENT_TYPE putExtra(ContactsContract.Intents.Insert.NAME, name) putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void insertContact(String name, String email) { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(Contacts.CONTENT_TYPE); intent.putExtra(Intents.Insert.NAME, name); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแทรกรายชื่อติดต่อได้ที่แก้ไข รายชื่อติดต่อโดยใช้ Intent
อีเมล
การเขียนอีเมลพร้อมไฟล์แนบที่ไม่บังคับเป็นการดำเนินการทั่วไปสำหรับแอปอีเมล สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ ข้อมูลในส่วนต่อไปนี้
เขียนอีเมลพร้อมไฟล์แนบที่ไม่บังคับ
หากต้องการเขียนอีเมล ให้ใช้การดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้โดยพิจารณาว่าคุณจะแนบไฟล์หรือไม่ และระบุรายละเอียดอีเมล เช่น ผู้รับและเรื่อง โดยใช้ปุ่มพิเศษที่ระบุไว้
- การดำเนินการ
ACTION_SENDTO
(ไม่มีไฟล์แนบ) หรือ
ACTION_SEND
(มีไฟล์แนบ 1 ไฟล์) หรือ
ACTION_SEND_MULTIPLE
(มีไฟล์แนบหลายไฟล์)- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
-
"text/plain"
"*/*"
- ฟีเจอร์เพิ่มเติม
-
Intent.EXTRA_EMAIL
- อาร์เรย์สตริงของอีเมลของผู้รับทั้งหมดในช่อง "ถึง"
Intent.EXTRA_CC
- อาร์เรย์สตริงของอีเมลของผู้รับทั้งหมดในช่อง "สำเนา"
Intent.EXTRA_BCC
- อาร์เรย์สตริงของอีเมลของผู้รับทั้งหมดในช่อง "สำเนาลับ"
Intent.EXTRA_SUBJECT
- สตริงที่มีชื่อเรื่องของอีเมล
Intent.EXTRA_TEXT
- สตริงที่มีเนื้อหาของอีเมล
Intent.EXTRA_STREAM
Uri
ชี้ไปที่ไฟล์แนบ หากใช้การดำเนินการACTION_SEND_MULTIPLE
แทนที่จะเป็นArrayList
ที่มีออบเจ็กต์Uri
หลายรายการ
ตัวอย่างเจตนา:
Kotlin
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "*/*" putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
หากต้องการให้มั่นใจว่าแอปอีเมลเท่านั้นที่จะจัดการ Intent ของคุณ ไม่ใช่แอปส่งข้อความหรือแอปโซเชียล ให้ใช้ACTION_SENDTO
การดำเนินการ
และรวม"mailto:"
รูปแบบข้อมูลตามที่แสดงในตัวอย่างต่อไปนี้
Kotlin
fun composeEmail(addresses: Array<String>, subject: String) { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") // Only email apps handle this. putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // Only email apps handle this. intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
พื้นที่จัดเก็บไฟล์
การดำเนินการทั่วไปสำหรับแอปพื้นที่เก็บไฟล์ รวมถึงข้อมูลที่คุณต้องใช้ เพื่อสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่างมีดังนี้
เรียกไฟล์ประเภทใดประเภทหนึ่ง
หากต้องการขอให้ผู้ใช้เลือกไฟล์ เช่น เอกสารหรือรูปภาพ แล้วส่งคืนการอ้างอิงไปยัง
แอปของคุณ ให้ใช้ACTION_GET_CONTENT
การดำเนินการและระบุ
MIME ประเภทที่ต้องการ การอ้างอิงไฟล์ที่ส่งคืนไปยังแอปของคุณจะอยู่ชั่วคราวในวงจรปัจจุบันของกิจกรรม
ดังนั้นหากต้องการเข้าถึงในภายหลัง คุณต้องนำเข้าสำเนาที่อ่านได้ในภายหลัง
นอกจากนี้ ความตั้งใจนี้ยังช่วยให้ผู้ใช้สร้างไฟล์ใหม่ในกระบวนการได้ด้วย ตัวอย่างเช่น ผู้ใช้สามารถถ่ายรูปภาพใหม่ด้วยกล้องแทนการเลือกรูปภาพที่มีอยู่
Intent ผลลัพธ์ที่ส่งไปยังเมธอด onActivityResult()
จะมีข้อมูลที่มี URI ซึ่งชี้ไปยังไฟล์
URI อาจเป็นอะไรก็ได้ เช่น http:
URI, file:
URI หรือ content:
URI อย่างไรก็ตาม หากต้องการจำกัดไฟล์ที่เลือกได้ให้เป็นเฉพาะไฟล์ที่เข้าถึงได้
จากผู้ให้บริการเนื้อหา (content:
URI) และพร้อมใช้งานเป็นสตรีมไฟล์ที่มี
openFileDescriptor()
ให้เพิ่มหมวดหมู่ CATEGORY_OPENABLE
ลงใน Intent
ใน Android 4.3 (API ระดับ 18) ขึ้นไป
คุณยังอนุญาตให้ผู้ใช้เลือกหลายไฟล์ได้โดยเพิ่ม
EXTRA_ALLOW_MULTIPLE
ใน Intent และตั้งค่าเป็น true
จากนั้นคุณจะเข้าถึงแต่ละไฟล์ที่เลือกได้ในClipData
ออบเจ็กต์ที่getClipData()
ส่งคืน
- การดำเนินการ
ACTION_GET_CONTENT
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่ผู้ใช้ต้องเลือก
- ฟีเจอร์เพิ่มเติม
-
EXTRA_ALLOW_MULTIPLE
- บูลีนที่ประกาศว่าผู้ใช้เลือกไฟล์ได้มากกว่า 1 ไฟล์ในครั้งเดียวหรือไม่
EXTRA_LOCAL_ONLY
- บูลีนที่ประกาศว่าไฟล์ที่ส่งคืนต้องพร้อมใช้งานจากอุปกรณ์โดยตรงหรือไม่ แทนที่จะต้องดาวน์โหลดจากบริการระยะไกล
- หมวดหมู่ (ไม่บังคับ)
-
CATEGORY_OPENABLE
- หากต้องการแสดงเฉพาะไฟล์ที่ "เปิดได้" ซึ่งแสดงเป็นสตรีมไฟล์ได้
ด้วย
openFileDescriptor()
ตัวอย่างเจตนาในการรับรูปภาพ
Kotlin
const val REQUEST_IMAGE_GET = 1 fun selectImage() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") val fullPhotoUri: Uri = data.data // Do work with photo saved at fullPhotoUri. ... } }
Java
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri. ... } }
ตัวอย่างตัวกรอง Intent เพื่อแสดงรูปภาพ
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
. --> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
เปิดไฟล์ประเภทใดประเภทหนึ่ง
แทนที่จะดึงสำเนาไฟล์ที่คุณต้องนำเข้าไปยังแอป การใช้การดำเนินการ ACTION_GET_CONTENT
เมื่อเรียกใช้ใน Android
4.4 ขึ้นไป คุณสามารถขอเปิดไฟล์ที่แอปอื่นจัดการได้โดยใช้การดำเนินการ ACTION_OPEN_DOCUMENT
และระบุประเภท MIME
หากต้องการให้ผู้ใช้สร้างเอกสารใหม่ที่แอปของคุณเขียนได้ด้วย ให้ใช้ACTION_CREATE_DOCUMENT
แทน
เช่น แทนที่จะเลือกจากเอกสาร PDF ที่มีอยู่ ACTION_CREATE_DOCUMENT
Intent จะช่วยให้ผู้ใช้เลือกตำแหน่งที่ต้องการสร้างเอกสารใหม่ได้ เช่น ภายในแอปอื่นที่จัดการพื้นที่เก็บข้อมูลของเอกสาร จากนั้นแอปของคุณจะได้รับตำแหน่ง URI ของตำแหน่งที่
สามารถเขียนเอกสารใหม่ได้
ในขณะที่ Intent ที่ส่งไปยังเมธอด onActivityResult()
จากACTION_GET_CONTENT
การดำเนินการอาจ
แสดงผล URI ประเภทใดก็ได้ แต่ Intent ผลลัพธ์จาก ACTION_OPEN_DOCUMENT
และ ACTION_CREATE_DOCUMENT
จะระบุไฟล์ที่เลือกเป็น URI content:
ที่มี DocumentsProvider
เป็นข้อมูลสำรองเสมอ คุณสามารถเปิดไฟล์ด้วย openFileDescriptor()
และ
ค้นหารายละเอียดโดยใช้คอลัมน์จาก DocumentsContract.Document
URI ที่ส่งคืนจะให้สิทธิ์เข้าถึงแบบอ่านระยะยาวแก่แอปของคุณในไฟล์ดังกล่าว และอาจมีสิทธิ์เข้าถึงแบบเขียนด้วย
ACTION_OPEN_DOCUMENT
การดำเนินการนี้
มีประโยชน์อย่างยิ่งเมื่อคุณต้องการอ่านไฟล์ที่มีอยู่โดยไม่ต้องคัดลอกลงในแอป
หรือเมื่อคุณต้องการเปิดและแก้ไขไฟล์ในตำแหน่งเดิม
นอกจากนี้ คุณยังอนุญาตให้ผู้ใช้เลือกหลายไฟล์ได้โดยเพิ่ม
EXTRA_ALLOW_MULTIPLE
ไปยัง Intent แล้วตั้งค่าเป็น true
หากผู้ใช้เลือกเพียง 1 รายการ คุณจะดึงข้อมูลรายการจาก getData()
ได้
หากผู้ใช้เลือกมากกว่า 1 รายการ getData()
จะแสดงค่าเป็น null และคุณต้อง
ดึงข้อมูลแต่ละรายการจากออบเจ็กต์ ClipData
ที่ getClipData()
แสดงผลแทน
หมายเหตุ: Intent ของคุณต้องระบุประเภท MIME และต้องประกาศหมวดหมู่ CATEGORY_OPENABLE
หากเหมาะสม คุณสามารถระบุประเภท MIME มากกว่า 1 ประเภทได้โดยการเพิ่มอาร์เรย์ของประเภท MIME ด้วยEXTRA_MIME_TYPES
extra หากทำเช่นนั้น คุณต้องตั้งค่าประเภท MIME หลักใน setType()
เป็น "*/*"
- การดำเนินการ
ACTION_OPEN_DOCUMENT
หรือ
ACTION_CREATE_DOCUMENT
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่ผู้ใช้ต้องเลือก
- ฟีเจอร์เพิ่มเติม
-
EXTRA_MIME_TYPES
- อาร์เรย์ของประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่แอปของคุณ
ขอ เมื่อใช้ส่วนเสริมนี้ คุณต้องตั้งค่าประเภท MIME หลักใน
setType()
เป็น"*/*"
EXTRA_ALLOW_MULTIPLE
- บูลีนที่ประกาศว่าผู้ใช้เลือกไฟล์ได้มากกว่า 1 ไฟล์ในครั้งเดียวหรือไม่
EXTRA_TITLE
- ใช้กับ
ACTION_CREATE_DOCUMENT
เพื่อระบุ ชื่อไฟล์เริ่มต้น EXTRA_LOCAL_ONLY
- บูลีนที่ประกาศว่าไฟล์ที่ส่งคืนต้องพร้อมใช้งานจากอุปกรณ์โดยตรงหรือไม่ แทนที่จะต้องดาวน์โหลดจากบริการระยะไกล
- หมวดหมู่
-
CATEGORY_OPENABLE
- หากต้องการแสดงเฉพาะไฟล์ที่ "เปิดได้" ซึ่งแสดงเป็นสตรีมไฟล์ได้
ด้วย
openFileDescriptor()
ตัวอย่างเจตนาในการรับรูปภาพ
Kotlin
const val REQUEST_IMAGE_OPEN = 1 fun selectImage2() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) { val fullPhotoUri: Uri = data.data // Do work with full size photo saved at fullPhotoUri. ... } }
Java
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri. ... } }
แอปของบุคคลที่สามไม่สามารถตอบสนองต่อ Intent ด้วยการดำเนินการ ACTION_OPEN_DOCUMENT
ได้ แต่ระบบจะรับเจตนานี้
และแสดงไฟล์ทั้งหมดที่พร้อมใช้งานจากแอปต่างๆ ในอินเทอร์เฟซผู้ใช้แบบรวม
หากต้องการระบุไฟล์ของแอปใน UI นี้และอนุญาตให้แอปอื่นๆ เปิดไฟล์เหล่านั้น คุณต้องใช้
DocumentsProvider
และรวมตัวกรอง Intent สำหรับ
PROVIDER_INTERFACE
("android.content.action.DOCUMENTS_PROVIDER"
) ดังที่แสดงในตัวอย่างต่อไปนี้
<provider ... android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider>
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีทำให้ไฟล์ที่แอปของคุณจัดการเปิดได้จากแอปอื่นๆ ได้ที่เปิดไฟล์โดยใช้เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล
การกระทำเกี่ยวกับสถานที่
การโทรเรียกรถเป็นการกระทำเกี่ยวกับสถานที่ที่พบบ่อย สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอป ในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้
โทรเรียกรถ
หากต้องการเรียกแท็กซี่ ให้ใช้การดำเนินการ
ACTION_RESERVE_TAXI_RESERVATION
หมายเหตุ: แอปต้องขอการยืนยันจากผู้ใช้ ก่อนที่จะดำเนินการนี้ให้เสร็จสมบูรณ์
- การดำเนินการ
ACTION_RESERVE_TAXI_RESERVATION
- URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- ฟีเจอร์เพิ่มเติม
- ไม่มี
ตัวอย่างเจตนา:
Kotlin
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
แผนที่
การแสดงตำแหน่งบนแผนที่เป็นการดำเนินการทั่วไปสำหรับแอปแผนที่ สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ ข้อมูลในส่วนต่อไปนี้
แสดงตำแหน่งบนแผนที่
หากต้องการเปิดแผนที่ ให้ใช้การดำเนินการ ACTION_VIEW
และระบุ
ข้อมูลตำแหน่งในข้อมูล Intent ด้วยรูปแบบใดรูปแบบหนึ่งต่อไปนี้
- การดำเนินการ
ACTION_VIEW
- รูปแบบ URI ของข้อมูล
-
geo:latitude,longitude
- แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุ
ตัวอย่าง:
"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
- แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุที่ระดับการซูมหนึ่งๆ ระดับการซูมที่
1 จะแสดงทั้งโลกโดยมี lat,lng ที่ระบุเป็นจุดศูนย์กลาง ระดับการซูมสูงสุด
(ใกล้ที่สุด) คือ 23
ตัวอย่าง:
"geo:47.6,-122.3?z=11"
geo:0,0?q=lat,lng(label)
- แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุพร้อมป้ายกำกับสตริง
ตัวอย่าง:
"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address
- แสดงตำแหน่งสำหรับ "ที่อยู่ของฉัน" ซึ่งอาจเป็นที่อยู่ที่เฉพาะเจาะจงหรือคำค้นหาตำแหน่ง
ตัวอย่าง:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
หมายเหตุ: สตริงทั้งหมดที่ส่งใน URI ของ
geo
ต้อง ได้รับการเข้ารหัส เช่น สตริง1st & Pike, Seattle
จะกลายเป็น1st%20%26%20Pike%2C%20Seattle
ระบบจะเข้ารหัสช่องว่างในสตริงด้วย%20
หรือแทนที่ด้วยเครื่องหมายบวก (+
)
- ประเภท MIME
- ไม่มี
ตัวอย่างเจตนา:
Kotlin
fun showMap(geoLocation: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = geoLocation } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void showMap(Uri geoLocation) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(geoLocation); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เพลงหรือวิดีโอ
การดำเนินการทั่วไปสำหรับแอปเพลงและวิดีโอ รวมถึงข้อมูลที่คุณต้องใช้ ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่างมีดังนี้
เล่นไฟล์สื่อ
หากต้องการเล่นไฟล์เพลง ให้ใช้การดำเนินการ ACTION_VIEW
และ
ระบุตำแหน่ง URI ของไฟล์ในข้อมูล Intent
- การดำเนินการ
ACTION_VIEW
- รูปแบบ URI ของข้อมูล
-
file:<URI>
content:<URI>
http:<URL>
- ประเภท MIME
-
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
- หรืออื่นๆ ที่แอปของคุณต้องการ
ตัวอย่างเจตนา:
Kotlin
fun playMedia(file: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = file } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playMedia(Uri file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(file); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:type="audio/*" /> <data android:type="application/ogg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เปิดเพลงตามคำค้นหา
หากต้องการเล่นเพลงตามคำค้นหา ให้ใช้
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
เจตนา แอปอาจเรียกใช้
Intent นี้เพื่อตอบสนองต่อคำสั่งเสียงของผู้ใช้ในการเล่นเพลง แอปที่รับ Intent นี้จะค้นหาในคลังของตัวเองเพื่อจับคู่เนื้อหาที่มีอยู่กับคำค้นหาที่ระบุและ
เริ่มเล่นเนื้อหานั้น
ในความตั้งใจนี้ ให้ใส่สตริง EXTRA_MEDIA_FOCUS
extra ซึ่งระบุโหมดการค้นหาที่ต้องการ ตัวอย่างเช่น โหมดการค้นหาสามารถระบุได้ว่า
การค้นหาเป็นชื่อศิลปินหรือชื่อเพลง
- การดำเนินการ
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- ฟีเจอร์เพิ่มเติม
-
MediaStore.EXTRA_MEDIA_FOCUS
(ต้องระบุ)-
ระบุโหมดการค้นหา: ไม่ว่าผู้ใช้จะค้นหาศิลปิน อัลบั้ม เพลง หรือเพลย์ลิสต์ใดก็ตาม โหมดการค้นหาส่วนใหญ่ต้องใช้ส่วนเสริมเพิ่มเติม เช่น หากผู้ใช้ สนใจฟังเพลงหนึ่งๆ ความตั้งใจอาจมีข้อมูลเพิ่มเติม 3 อย่าง ได้แก่ ชื่อเพลง ศิลปิน และอัลบั้ม Intent นี้รองรับโหมดการค้นหาต่อไปนี้สำหรับ ค่าแต่ละค่าของ
EXTRA_MEDIA_FOCUS
Any -
"vnd.android.cursor.item/*"
-
เปิดเพลง แอปที่รับจะเล่นเพลงบางเพลงตามตัวเลือกอัจฉริยะ เช่น เพลย์ลิสต์ล่าสุดที่ผู้ใช้ฟัง
ส่วนเสริมเพิ่มเติม
QUERY
(ต้องระบุ): สตริงว่าง โดยจะมีการระบุข้อมูลเพิ่มเติมนี้เสมอ เพื่อให้เข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาสามารถ ประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้าง
ไม่มีโครงสร้าง -
"vnd.android.cursor.item/*"
-
เปิดเพลง อัลบั้ม หรือแนวเพลงที่ต้องการจากคำค้นหาที่ไม่มีโครงสร้าง แอปสามารถสร้าง Intent ด้วยโหมดการค้นหานี้เมื่อไม่สามารถระบุประเภทเนื้อหาที่ผู้ใช้ต้องการ ฟังได้ ใช้โหมดการค้นหาที่เฉพาะเจาะจงมากขึ้นเมื่อเป็นไปได้
ส่วนเสริมเพิ่มเติม
QUERY
(ต้องระบุ): สตริงที่มีชุดค่าผสม ของศิลปิน อัลบั้ม ชื่อเพลง หรือแนวเพลง
ประเภท -
Audio.Genres.ENTRY_CONTENT_TYPE
-
เปิดเพลงประเภทใดประเภทหนึ่ง
ส่วนเสริมเพิ่มเติม
"android.intent.extra.genre"
(ต้องระบุ) - ประเภทQUERY
(ต้องระบุ): ประเภท โดยจะมีการระบุข้อมูลเพิ่มเติมนี้เสมอ เพื่อให้เข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาสามารถประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
ศิลปิน -
Audio.Artists.ENTRY_CONTENT_TYPE
-
เปิดเพลงจากศิลปินที่ต้องการ
ส่วนเสริมเพิ่มเติม
EXTRA_MEDIA_ARTIST
(ต้องระบุ): ศิลปิน"android.intent.extra.genre"
: ประเภทQUERY
(ต้องระบุ): สตริงที่มีการผสมผสานระหว่าง ศิลปินหรือแนวเพลง โดยจะมีการระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อให้เข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาสามารถประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
อัลบั้ม -
Audio.Albums.ENTRY_CONTENT_TYPE
-
เปิดเพลงจากอัลบั้มที่เฉพาะเจาะจง
ส่วนเสริมเพิ่มเติม
EXTRA_MEDIA_ALBUM
(ต้องระบุ): อัลบั้มEXTRA_MEDIA_ARTIST
: ศิลปิน"android.intent.extra.genre"
: ประเภทQUERY
(ต้องระบุ): สตริงที่มีการผสมผสานระหว่าง อัลบั้มหรือศิลปิน โดยจะมีการระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อให้เข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาสามารถประมวลผลเจตนานี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
เพลง -
"vnd.android.cursor.item/audio"
-
เล่นเพลงที่เฉพาะเจาะจง
ส่วนเสริมเพิ่มเติม
EXTRA_MEDIA_ALBUM
: อัลบั้มEXTRA_MEDIA_ARTIST
: ศิลปิน"android.intent.extra.genre"
: ประเภทEXTRA_MEDIA_TITLE
(ต้องระบุ): ชื่อเพลงQUERY
(ต้องระบุ): สตริงที่มีการผสมผสานของ อัลบั้ม ศิลปิน ประเภท หรือชื่อ โดยจะมีการระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อ ความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาสามารถประมวลผลเจตนานี้ เป็นการค้นหาที่ไม่มีโครงสร้างได้
เพลย์ลิสต์ -
Audio.Playlists.ENTRY_CONTENT_TYPE
-
เล่นเพลย์ลิสต์ที่เฉพาะเจาะจงหรือเพลย์ลิสต์ที่ตรงกับเกณฑ์บางอย่างที่ระบุ โดยส่วนเสริมเพิ่มเติม
ส่วนเสริมเพิ่มเติม
EXTRA_MEDIA_ALBUM
: อัลบั้มEXTRA_MEDIA_ARTIST
: ศิลปิน"android.intent.extra.genre"
: ประเภท"android.intent.extra.playlist"
: เพลย์ลิสต์EXTRA_MEDIA_TITLE
: ชื่อเพลงที่เพลย์ลิสต์อิงตามQUERY
(ต้องระบุ): สตริงที่มีชุดค่าผสม ของอัลบั้ม ศิลปิน แนวเพลง เพลย์ลิสต์ หรือชื่อ โดยจะมีการระบุข้อมูลเพิ่มเติมนี้เสมอ เพื่อให้เข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาสามารถ ประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้าง
ตัวอย่างเจตนา:
หากผู้ใช้ต้องการฟังเพลงจากศิลปินรายใดรายหนึ่ง แอปค้นหาอาจสร้างความตั้งใจต่อไปนี้
Kotlin
fun playSearchArtist(artist: String) { val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply { putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist) putExtra(SearchManager.QUERY, artist) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playSearchArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); intent.putExtra(SearchManager.QUERY, artist); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เมื่อจัดการ Intent นี้ในกิจกรรม ให้ตรวจสอบค่าของ
EXTRA_MEDIA_FOCUS
extra ใน
Intent
ที่เข้ามาเพื่อกำหนดโหมดการค้นหา เมื่อกิจกรรมระบุโหมดการค้นหาแล้ว
ให้อ่านค่าของส่วนเสริมเพิ่มเติมสำหรับโหมดการค้นหานั้นๆ
ข้อมูลนี้จะช่วยให้แอปค้นหาในคลังของตัวเองเพื่อเล่นเนื้อหาที่ตรงกับคำค้นหาได้ ซึ่งแสดงในตัวอย่างต่อไปนี้
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS) val query: String? = intent.getStringExtra(SearchManager.QUERY) // Some of these extras might not be available depending on the search mode. val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM) val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST) val genre: String? = intent.getStringExtra("android.intent.extra.genre") val playlist: String? = intent.getStringExtra("android.intent.extra.playlist") val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE) // Determine the search mode and use the corresponding extras. when { mediaFocus == null -> { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query) } mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> { if (query?.isNotEmpty() == true) { // 'Unstructured' search mode. playUnstructuredSearch(query) } else { // 'Any' search mode. playResumeLastPlaylist() } } mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> { // 'Genre' search mode. playGenre(genre) } mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Artist' search mode. playArtist(artist, genre) } mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> { // 'Album' search mode. playAlbum(album, artist) } mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> { // 'Song' search mode. playSong(album, artist, genre, title) } mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title) } } } }
Java
protected void onCreate(Bundle savedInstanceState) { //... Intent intent = this.getIntent(); if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); String query = intent.getStringExtra(SearchManager.QUERY); // Some of these extras might not be available depending on the search mode. String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); String genre = intent.getStringExtra("android.intent.extra.genre"); String playlist = intent.getStringExtra("android.intent.extra.playlist"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // Determine the search mode and use the corresponding extras. if (mediaFocus == null) { // 'Unstructured' search mode (backward compatible). playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // 'Any' search mode. playResumeLastPlaylist(); } else { // 'Unstructured' search mode. playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { // 'Genre' search mode. playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // 'Artist' search mode. playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // 'Album' search mode. playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // 'Song' search mode. playSong(album, artist, genre, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title); } } }
โน้ตใหม่
การสร้างโน้ตเป็นการดำเนินการทั่วไปสำหรับแอปจดบันทึก สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ ข้อมูลในส่วนต่อไปนี้
สร้างโน้ต
หากต้องการสร้างโน้ตใหม่ ให้ใช้การดำเนินการ
ACTION_CREATE_NOTE
แล้วระบุรายละเอียดของโน้ต เช่น เรื่องและข้อความ โดยใช้ส่วนเสริมต่อไปนี้
หมายเหตุ: แอปต้องขอการยืนยันจากผู้ใช้ ก่อนที่จะดำเนินการนี้ให้เสร็จสมบูรณ์
- การดำเนินการ
-
ACTION_CREATE_NOTE
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
-
PLAIN_TEXT_TYPE
- "*/*"
- ฟีเจอร์เพิ่มเติม
-
-
EXTRA_NAME
- สตริงที่ระบุชื่อหรือเรื่องของโน้ต
-
EXTRA_TEXT
- สตริงที่ระบุข้อความของโน้ต
-
- การดำเนินการ
-
ACTION_DIAL
- เปิดแอปแป้นโทรศัพท์หรือแอปโทรศัพท์ACTION_CALL
- โทรออก (ต้องมีสิทธิ์CALL_PHONE
)
- รูปแบบ URI ของข้อมูล
-
tel:<phone-number>
voicemail:<phone-number>
- ประเภท MIME
- ไม่มี
tel:2125551212
tel:(212) 555 1212
- การดำเนินการ
-
"com.google.android.gms.actions.SEARCH_ACTION"
- รองรับคำค้นหาจาก Google Voice Actions
- ฟีเจอร์เพิ่มเติม
-
QUERY
- สตริงที่มีคำค้นหา
- การดำเนินการ
ACTION_WEB_SEARCH
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- ฟีเจอร์เพิ่มเติม
-
SearchManager.QUERY
- สตริงการค้นหา
- การดำเนินการ
-
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
- ไม่มี
- การดำเนินการ
ACTION_SENDTO
หรือ
ACTION_SEND
หรือ
ACTION_SEND_MULTIPLE
- รูปแบบ URI ของข้อมูล
-
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>
ระบบจะจัดการกับรูปแบบเหล่านี้ทั้งหมดในลักษณะเดียวกัน
- ประเภท MIME
-
"text/plain"
"image/*"
"video/*"
- ฟีเจอร์เพิ่มเติม
-
"subject"
- สตริงสำหรับเรื่องของข้อความ (โดยปกติจะใช้สำหรับ MMS เท่านั้น)
"sms_body"
- สตริงสำหรับข้อความ
EXTRA_STREAM
Uri
ชี้ไปที่รูปภาพหรือวิดีโอที่จะแนบ หากใช้การดำเนินการACTION_SEND_MULTIPLE
ส่วนนี้จะเป็นArrayList
ของ ออบเจ็กต์Uri
ที่ชี้ไปยังรูปภาพหรือวิดีโอที่จะแนบ
- การดำเนินการ
ACTION_VIEW
- รูปแบบ URI ของข้อมูล
http:<URL>
https:<URL>
- ประเภท MIME
-
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
- ตั้งค่าอุปกรณ์ Android สำหรับการพัฒนา หรือใช้อุปกรณ์เสมือน
- ติดตั้งแอปเวอร์ชันที่จัดการ Intent ที่คุณต้องการรองรับ
- เรียกใช้ 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
- หากคุณกำหนดตัวกรอง Intent ที่จำเป็น ให้จัดการ 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 Filter:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.CREATE_NOTE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </activity>
โทรศัพท์
การเริ่มโทรเป็นการดำเนินการทั่วไปสำหรับแอปโทรศัพท์ สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ ข้อมูลในส่วนต่อไปนี้
เริ่มโทรออก
หากต้องการเปิดแอปโทรศัพท์และกดหมายเลขโทรศัพท์ ให้ใช้ACTION_DIAL
การดำเนินการและระบุหมายเลขโทรศัพท์โดยใช้
รูปแบบ URI ต่อไปนี้ เมื่อแอปโทรศัพท์เปิดขึ้น แอปจะแสดงหมายเลขโทรศัพท์
และผู้ใช้ต้องแตะปุ่มโทรเพื่อเริ่มการโทร
หากต้องการโทรออกโดยตรง ให้ใช้ACTION_CALL
การดำเนินการ
และระบุหมายเลขโทรศัพท์โดยใช้รูปแบบ URI ต่อไปนี้ เมื่อแอปโทรศัพท์เปิดขึ้น ระบบจะ
เริ่มการโทร ผู้ใช้ไม่จำเป็นต้องแตะปุ่มโทร
การดำเนินการ ACTION_CALL
กำหนดให้คุณต้องเพิ่มสิทธิ์
CALL_PHONE
ลงในไฟล์ Manifest
<uses-permission android:name="android.permission.CALL_PHONE" />
หมายเลขโทรศัพท์ที่ถูกต้องคือหมายเลขที่กำหนดไว้ ใน IETF RFC 3966 ตัวอย่างที่ถูกต้องมีดังนี้
แป้นโทรของแอปโทรศัพท์มีประสิทธิภาพในการแปลงรูปแบบให้เป็นมาตรฐาน เช่น
หมายเลขโทรศัพท์ ดังนั้นจึงไม่จำเป็นต้องใช้รูปแบบที่อธิบายไว้ในเมธอด
Uri.parse()
อย่างเคร่งครัด
อย่างไรก็ตาม หากคุณยังไม่ได้ลองใช้สคีมาหรือไม่แน่ใจว่าจะจัดการได้หรือไม่ ให้ใช้วิธี Uri.fromParts()
แทน
ตัวอย่างเจตนา:
Kotlin
fun dialPhoneNumber(phoneNumber: String) { val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void dialPhoneNumber(String phoneNumber) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ค้นหา
การดำเนินการทั่วไปสำหรับแอปค้นหา รวมถึงข้อมูลที่คุณต้องใช้ เพื่อสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่างมีดังนี้
ค้นหาโดยใช้แอปที่เฉพาะเจาะจง
หากต้องการรองรับการค้นหาภายในบริบทของแอป ให้ประกาศตัวกรอง Intent ในแอปด้วยSEARCH_ACTION
การดำเนินการ ดังที่แสดงในตัวอย่างตัวกรอง Intent ต่อไปนี้
หมายเหตุ: เราไม่แนะนำให้ใช้ SEARCH_ACTION
สำหรับการค้นหาแอป
แต่ให้ใช้การดำเนินการ GET_THING
แทนเพื่อใช้ประโยชน์จากการรองรับการค้นหาในแอปในตัวของ Google Assistant ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับการทำงานของแอปของ Google Assistant
ตัวอย่าง Intent Filter:
<activity android:name=".SearchActivity"> <intent-filter> <action android:name="com.google.android.gms.actions.SEARCH_ACTION"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
ค้นหาในเว็บ
หากต้องการเริ่มการค้นหาเว็บ ให้ใช้ACTION_WEB_SEARCH
การดำเนินการ
และระบุสตริงการค้นหาใน
SearchManager.QUERY
ข้อมูลเพิ่มเติม
ตัวอย่างเจตนา:
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 อย่างใดอย่างหนึ่งต่อไปนี้
ตัวอย่างเจตนา:
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 อย่างใดอย่างหนึ่งต่อไปนี้และระบุรายละเอียดข้อความ เช่น หมายเลขโทรศัพท์ เรื่อง และเนื้อหาข้อความโดยใช้คีย์พิเศษต่อไปนี้
ตัวอย่างเจตนา:
Kotlin
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SENDTO).apply { type = HTTP.PLAIN_TEXT_TYPE putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType(HTTP.PLAIN_TEXT_TYPE); intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
หากต้องการให้แอปข้อความจัดการ Intent เท่านั้น และไม่ให้แอปอีเมลหรือแอปโซเชียลอื่นๆ จัดการ ให้ใช้ACTION_SENDTO
การดำเนินการ
และรวม"smsto:"
รูปแบบข้อมูลตามที่แสดงในตัวอย่างต่อไปนี้
Kotlin
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { data = Uri.parse("smsto:") // Only SMS apps respond to this. putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("smsto:")); // Only SMS apps respond to this. intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่าง Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="text/plain" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
หมายเหตุ: หากคุณกำลังพัฒนาแอปรับส่งข้อความ SMS/MMS คุณต้อง
ใช้ตัวกรอง Intent สำหรับการดำเนินการเพิ่มเติมหลายอย่างเพื่อให้พร้อมใช้งานเป็นแอป SMS เริ่มต้นใน Android 4.4 ขึ้นไป ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบ
ที่ Telephony
เว็บเบราว์เซอร์
การโหลด URL ของเว็บเป็นการดำเนินการทั่วไปสำหรับแอปเว็บเบราว์เซอร์ สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ ข้อมูลในส่วนต่อไปนี้
โหลด URL ของเว็บ
หากต้องการเปิดหน้าเว็บ ให้ใช้ACTION_VIEW
การดำเนินการ
และระบุ URL ของเว็บในข้อมูล 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 Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <!-- Include the host attribute if you want your app to respond only to URLs with your app's domain. --> <data android:scheme="http" android:host="www.example.com" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The BROWSABLE category is required to get links from web pages. --> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> </activity>
เคล็ดลับ: หากแอป Android มีฟังก์ชันการทำงานคล้ายกับ เว็บไซต์ของคุณ ให้ใส่ตัวกรอง Intent สำหรับ URL ที่ชี้ไปยังเว็บไซต์ จากนั้น หากผู้ใช้ติดตั้งแอปของคุณไว้ ลิงก์จากอีเมลหรือหน้าเว็บอื่นๆ ที่ชี้ไปยังเว็บไซต์ของคุณ จะเปิดแอป Android แทนหน้าเว็บ ดูข้อมูลเพิ่มเติมได้ที่การจัดการ Android App Link
ตั้งแต่ Android 12 (API ระดับ 31) เป็นต้นไป Intent เว็บทั่วไปจะเปลี่ยนเส้นทางไปยัง กิจกรรมในแอปของคุณก็ต่อเมื่อแอปได้รับการอนุมัติสำหรับโดเมนที่เฉพาะเจาะจง ซึ่งอยู่ใน Intent เว็บนั้น หากแอปไม่ได้รับอนุมัติสำหรับโดเมนนั้น ระบบจะเปลี่ยนเส้นทางเว็บ Intent ไปยังแอปเบราว์เซอร์เริ่มต้นของผู้ใช้แทน
ยืนยันความตั้งใจด้วย Android Debug Bridge
หากต้องการยืนยันว่าแอปตอบสนองต่อ Intent ที่คุณต้องการรองรับ คุณสามารถใช้เครื่องมือ adb
เพื่อเรียกใช้ Intent ที่เฉพาะเจาะจงได้โดยทำดังนี้
ดูข้อมูลเพิ่มเติมได้ที่ ออกคำสั่งเชลล์