Intent ช่วยให้คุณเริ่มกิจกรรมในแอปอื่นได้โดยอธิบายการดำเนินการที่ต้องการทำ เช่น "ดูแผนที่" หรือ "ถ่ายรูป" ในออบเจ็กต์ Intent
Intent ประเภทนี้เรียกว่า Intent โดยนัย เนื่องจากไม่ได้ระบุคอมโพเนนต์แอปที่จะเริ่มต้น แต่ระบุการดำเนินการและระบุข้อมูลบางส่วนที่จะใช้ดำเนินการ
เมื่อคุณเรียกใช้ startActivity()
หรือ startActivityForResult()
และส่ง Intent ที่ไม่ชัด ระบบจะแก้ไข Intent ไปยังแอปที่จัดการ Intent ได้ และเริ่ม Activity
ที่เกี่ยวข้อง หากมีแอปมากกว่า 1 แอปที่จัดการ Intent ได้ ระบบจะแสดงกล่องโต้ตอบให้ผู้ใช้เลือกแอปที่จะใช้
หน้านี้อธิบายถึง Intent ที่ไม่ชัดหลายรายการที่คุณสามารถใช้เพื่อดำเนินการทั่วไป โดยจัดเรียงตามประเภทแอปที่จัดการ Intent นอกจากนี้ ส่วนแต่ละส่วนยังแสดงวิธีสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดําเนินการ
ข้อควรระวัง: หากไม่มีแอปในอุปกรณ์ที่รับ Intent ที่ไม่ชัดได้ แอปจะขัดข้องเมื่อเรียกใช้ startActivity()
หากต้องการยืนยันก่อนว่ามีแอปที่จะรับ Intent ให้เรียกใช้ resolveActivity()
ในออบเจ็กต์ Intent
หากผลลัพธ์ไม่เป็นค่าว่าง แสดงว่ามีแอปอย่างน้อย 1 แอปที่จัดการกับ Intent ได้ และยังเรียกใช้ startActivity()
ได้อย่างปลอดภัย หากผลลัพธ์เป็น Null อย่าใช้ Intent และหากเป็นไปได้ ให้ปิดใช้ฟีเจอร์ที่เรียกใช้ Intent
หากคุณไม่คุ้นเคยกับวิธีสร้าง Intent หรือตัวกรอง Intent ให้อ่านตัวกรอง Intent และ Intent ก่อน
หากต้องการดูวิธีเรียกใช้ Intent ที่แสดงในหน้านี้จากโฮสต์การพัฒนา โปรดดูส่วนยืนยัน Intent ด้วย Android Debug Bridge
การสั่งงานด้วยเสียงของ Google
Google Voice Action จะเรียกใช้ Intent บางรายการที่แสดงในหน้านี้เพื่อตอบสนองต่อคําสั่งเสียง โปรดดูข้อมูลเพิ่มเติมที่ เริ่มต้นใช้งานการสั่งงานด้วยเสียงของระบบ
นาฬิกาปลุก
ต่อไปนี้คือการดำเนินการทั่วไปสำหรับแอปนาฬิกาปลุก รวมถึงข้อมูลที่จำเป็นในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละรายการ
สร้างการปลุก
หากต้องการสร้างการปลุกใหม่ ให้ใช้การดําเนินการ ACTION_SET_ALARM
แล้วระบุรายละเอียดการปลุก เช่น เวลาและข้อความ โดยใช้ส่วนเสริมต่อไปนี้
หมายเหตุ: เฉพาะชั่วโมง นาที และข้อความเพิ่มเติมเท่านั้นที่มีให้ใช้งาน ใน Android 2.3 (API ระดับ 9) และต่ำกว่า ส่วนเพิ่มเติมอื่นๆ จะมีอยู่ใน แพลตฟอร์มเวอร์ชันสูงกว่า
- การดำเนินการ
ACTION_SET_ALARM
- Data URI
- ไม่มี
- ประเภท MIME
- ไม่มี
- พิเศษ
-
EXTRA_HOUR
- ชั่วโมงสำหรับการปลุก
EXTRA_MINUTES
- นาทีของการปลุก
EXTRA_MESSAGE
- ข้อความที่กำหนดเองสำหรับระบุการปลุก
EXTRA_DAYS
ArrayList
ซึ่งระบุวันในสัปดาห์ที่การตั้งปลุกนี้ซ้ำ แต่ละวันต้องประกาศด้วยจำนวนเต็มจากคลาสCalendar
เช่นMONDAY
สำหรับการปลุกแบบครั้งเดียว โปรดอย่าระบุข้อมูลเพิ่มเติมนี้
EXTRA_RINGTONE
- URI
content:
ที่ระบุเสียงเรียกเข้าที่จะใช้กับการปลุก หรือVALUE_RINGTONE_SILENT
สำหรับไม่มีเสียงเรียกเข้าหากต้องการใช้เสียงเรียกเข้าเริ่มต้น โปรดอย่าระบุส่วนเสริมนี้
EXTRA_VIBRATE
- บูลีนที่ระบุว่าจะให้สั่นสำหรับการปลุกนี้หรือไม่
EXTRA_SKIP_UI
- บูลีนที่ระบุว่าแอปที่ตอบกลับต้องข้าม UI หรือไม่เมื่อตั้งปลุก หากเป็น "จริง" แอปต้องข้าม UI การยืนยันและตั้งปลุกที่ระบุ
ตัวอย่าง Intent:
Kotlin
fun createAlarm(message: String, hour: Int, minutes: Int) { val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_HOUR, hour) putExtra(AlarmClock.EXTRA_MINUTES, minutes) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void createAlarm(String message, int hour, int minutes) { Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_HOUR, hour) .putExtra(AlarmClock.EXTRA_MINUTES, minutes); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
หากต้องการเรียกใช้ Intent ACTION_SET_ALARM
แอปของคุณต้องมีสิทธิ์ SET_ALARM
ดังนี้
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
สร้างตัวจับเวลา
หากต้องการสร้างตัวจับเวลานับถอยหลัง ให้ใช้การดำเนินการ ACTION_SET_TIMER
และระบุรายละเอียดตัวจับเวลา เช่น ระยะเวลาโดยใช้ส่วนเสริมต่อไปนี้
หมายเหตุ: Intent นี้พร้อมใช้งานใน Android 4.4 (API ระดับ 19) ขึ้นไป
- การดำเนินการ
ACTION_SET_TIMER
- Data URI
- ไม่มี
- ประเภท MIME
- ไม่มี
- เพิ่มเติม
-
EXTRA_LENGTH
- ระยะเวลาของตัวจับเวลาเป็นวินาที
EXTRA_MESSAGE
- ข้อความที่กำหนดเองเพื่อระบุตัวจับเวลา
EXTRA_SKIP_UI
- บูลีนที่ระบุว่าแอปที่ตอบกลับต้องข้าม UI หรือไม่เมื่อตั้งค่าตัวจับเวลา หากเป็นจริง แอปต้องข้าม UI การยืนยันและเริ่มตัวจับเวลาตามที่ระบุ
ตัวอย่าง Intent:
Kotlin
fun startTimer(message: String, seconds: Int) { val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_LENGTH, seconds) putExtra(AlarmClock.EXTRA_SKIP_UI, true) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void startTimer(String message, int seconds) { Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
หากต้องการเรียกใช้ Intent ACTION_SET_TIMER
แอปของคุณต้องมีสิทธิ์ SET_ALARM
ดังนี้
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
แสดงการเตือนทั้งหมด
หากต้องการแสดงรายการการปลุก ให้ใช้การดำเนินการ ACTION_SHOW_ALARMS
แม้ว่าจะมีแอปจำนวนไม่มากที่เรียกใช้ความตั้งใจนี้ แต่เนื่องจากแอประบบใช้เป็นหลัก แอปใดก็ตามที่ทํางานเป็นนาฬิกาปลุกสามารถใช้ตัวกรองความตั้งใจนี้และตอบกลับด้วยการแสดงรายการการปลุกปัจจุบัน
หมายเหตุ: Intent นี้พร้อมใช้งานใน Android 4.4 (API ระดับ 19) ขึ้นไป
- การดำเนินการ
ACTION_SHOW_ALARMS
- Data URI
- ไม่มี
- ประเภท MIME
- ไม่มี
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
ปฏิทิน
การเพิ่มกิจกรรมเป็นการดำเนินการทั่วไปสำหรับแอปปฏิทิน สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถในการทำงานนี้ของแอปโดยใช้ข้อมูลในส่วนต่อไปนี้
เพิ่มกิจกรรมในปฏิทิน
หากต้องการเพิ่มกิจกรรมใหม่ลงในปฏิทินของผู้ใช้ ให้ใช้การดำเนินการ
ACTION_INSERT
และระบุ URI ของข้อมูลโดยใช้
Events.CONTENT_URI
จากนั้นคุณสามารถระบุรายละเอียดเหตุการณ์ต่างๆ โดยใช้ส่วนเสริมต่อไปนี้
- การดำเนินการ
ACTION_INSERT
- URL ข้อมูล
Events.CONTENT_URI
- ประเภท MIME
"vnd.android.cursor.dir/event"
- พิเศษ
-
EXTRA_EVENT_ALL_DAY
- บูลีนที่ระบุว่าเป็นกิจกรรมตลอดวันหรือไม่
EXTRA_EVENT_BEGIN_TIME
- เวลาเริ่มต้นของเหตุการณ์ (มิลลิวินาทีตั้งแต่ Epoch)
EXTRA_EVENT_END_TIME
- เวลาสิ้นสุดของกิจกรรม (มิลลิวินาทีนับตั้งแต่เริ่มต้น)
TITLE
- ชื่อกิจกรรม
DESCRIPTION
- คำอธิบายกิจกรรม
EVENT_LOCATION
- สถานที่จัดกิจกรรม
EXTRA_EMAIL
- รายการอีเมลที่คั่นด้วยคอมมาซึ่งระบุผู้ได้รับเชิญ
คุณระบุรายละเอียดเหตุการณ์อื่นๆ อีกมากมายได้โดยใช้ค่าคงที่ที่กําหนดไว้ในคลาส
CalendarContract.EventsColumns
ตัวอย่าง Intent
Kotlin
fun addEvent(title: String, location: String, begin: Long, end: Long) { val intent = Intent(Intent.ACTION_INSERT).apply { data = Events.CONTENT_URI putExtra(Events.TITLE, title) putExtra(Events.EVENT_LOCATION, location) putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void addEvent(String title, String location, long begin, long end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่างตัวกรอง Intent
<activity ...> <intent-filter> <action android:name="android.intent.action.INSERT" /> <data android:mimeType="vnd.android.cursor.dir/event" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
กล้อง
ต่อไปนี้คือการดำเนินการทั่วไปสำหรับแอปกล้อง รวมถึงข้อมูลที่จำเป็นในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง
จับภาพหรือวิดีโอและส่งคืน
หากต้องการเปิดแอปกล้องและรับรูปภาพหรือวิดีโอที่ได้ ให้ใช้การดำเนินการ ACTION_IMAGE_CAPTURE
หรือ ACTION_VIDEO_CAPTURE
นอกจากนี้ ให้ระบุตำแหน่ง URI ที่ต้องการให้กล้องบันทึกรูปภาพหรือวิดีโอในส่วนEXTRA_OUTPUT
เพิ่มเติม
- การดำเนินการ
ACTION_IMAGE_CAPTURE
หรือ
ACTION_VIDEO_CAPTURE
- รูปแบบ URI ข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- พิเศษ
-
EXTRA_OUTPUT
- ตำแหน่ง URI ที่แอปกล้องบันทึกไฟล์รูปภาพหรือวิดีโอ (เป็นออบเจ็กต์
Uri
)
เมื่อแอปกล้องกลับมาโฟกัสที่กิจกรรมของคุณได้สําเร็จ หรือก็คือแอปของคุณได้รับการเรียกกลับ onActivityResult()
คุณจะเข้าถึงรูปภาพหรือวิดีโอได้ที่ URI ที่คุณระบุด้วยค่า EXTRA_OUTPUT
หมายเหตุ: เมื่อคุณใช้ ACTION_IMAGE_CAPTURE
เพื่อถ่ายภาพ กล้องอาจแสดงผลสำเนาหรือภาพขนาดย่อที่ปรับลดขนาดของรูปภาพในผลการค้นหา Intent
โดยบันทึกเป็น Bitmap
ในช่องพิเศษที่ชื่อ "data"
ตัวอย่าง Intent:
Kotlin
const val REQUEST_IMAGE_CAPTURE = 1 val locationForPhotos: Uri = ... fun capturePhoto(targetFilename: String) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)) } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") // Do other work with full size photo saved in locationForPhotos. ... } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri locationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelableExtra("data"); // Do other work with full size photo saved in locationForPhotos. ... } }
หากต้องการดำเนินการนี้เมื่อทำงานใน Android 12 (API ระดับ 31) ขึ้นไป โปรดดูตัวอย่าง Intent ต่อไปนี้
ตัวอย่าง Intent
Kotlin
val REQUEST_IMAGE_CAPTURE = 1 private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } catch (ActivityNotFoundException e) { // Display error state to the user. } } </section></div>
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ Intent นี้เพื่อจับภาพ รวมถึงวิธีสร้าง Uri
ที่เหมาะสมสําหรับตําแหน่งเอาต์พุตได้ที่หัวข้อถ่ายภาพหรือถ่ายวิดีโอ
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เมื่อจัดการ Intent นี้ ให้ตรวจสอบกิจกรรมเพื่อหา EXTRA_OUTPUT
ส่วนเกินใน Intent
ขาเข้า จากนั้นบันทึกรูปภาพหรือวิดีโอที่บันทึกไว้ในตำแหน่งที่ระบุไว้โดยอุปกรณ์เสริมดังกล่าว และเรียกใช้ setResult()
ด้วย Intent
ที่มีภาพขนาดย่อที่บีบอัดในชื่อ "data"
พิเศษ
เริ่มแอปกล้องถ่ายรูปในโหมดภาพนิ่ง
หากต้องการเปิดแอปกล้องในโหมดภาพนิ่ง ให้ใช้การดำเนินการ 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>
เริ่มแอปกล้องในโหมดวิดีโอ
หากต้องการเปิดแอปกล้องถ่ายรูปในโหมดวิดีโอ ให้ใช้การดำเนินการ 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
ที่ส่งไปยังการเรียกกลับ onActivityResult()
จะมี content:
URI ที่ชี้ไปยังรายชื่อติดต่อที่เลือก การตอบกลับจะมอบสิทธิ์ชั่วคราวแก่แอปในการอ่านรายชื่อติดต่อนั้นโดยใช้ Contacts Provider API แม้ว่าแอปจะไม่มีสิทธิ์ READ_CONTACTS
ก็ตาม
เคล็ดลับ: หากต้องการเข้าถึงเฉพาะข้อมูลติดต่อบางอย่าง เช่น หมายเลขโทรศัพท์หรืออีเมล โปรดดูส่วนถัดไปเกี่ยวกับวิธีเลือกข้อมูลติดต่อที่เฉพาะเจาะจง
- การดำเนินการ
ACTION_PICK
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
Contacts.CONTENT_TYPE
ตัวอย่าง Intent:
Kotlin
const val REQUEST_SELECT_CONTACT = 1 fun selectContact() { val intent = Intent(Intent.ACTION_PICK).apply { type = ContactsContract.Contacts.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { val contactUri: Uri = data.data // Do something with the selected contact at contactUri. //... } }
Java
static final int REQUEST_SELECT_CONTACT = 1; public void selectContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); // Do something with the selected contact at contactUri. ... } }
ดูข้อมูลเกี่ยวกับวิธีดึงข้อมูลติดต่อเมื่อคุณมี URI ของรายชื่อติดต่อได้ที่หัวข้อดึงข้อมูลสำหรับรายชื่อติดต่อ
เมื่อดึงข้อมูล URI ของรายชื่อติดต่อโดยใช้ Intent นี้ โดยทั่วไปคุณไม่จำเป็นต้องมีREAD_CONTACTS
สิทธิ์ในการอ่านรายละเอียดพื้นฐานของรายชื่อติดต่อนั้น เช่น ชื่อที่แสดงและสถานะว่ามีการติดดาวรายชื่อติดต่อหรือไม่ อย่างไรก็ตาม หากต้องการอ่านข้อมูลที่เฉพาะเจาะจงมากขึ้นเกี่ยวกับผู้ติดต่อรายใดรายหนึ่ง เช่น หมายเลขโทรศัพท์หรืออีเมล คุณจะต้องมีสิทธิ์ READ_CONTACTS
เลือกข้อมูลติดต่อที่เฉพาะเจาะจง
หากต้องการให้ผู้ใช้เลือกข้อมูลที่เจาะจงจากรายชื่อติดต่อ เช่น หมายเลขโทรศัพท์ อีเมล หรือประเภทข้อมูลอื่น ให้ใช้การดำเนินการ ACTION_PICK
และระบุประเภท MIME เป็นเนื้อหาประเภทใดประเภทหนึ่งต่อไปนี้ เช่น CommonDataKinds.Phone.CONTENT_TYPE
เพื่อรับหมายเลขโทรศัพท์ของรายชื่อติดต่อ
หมายเหตุ: ในหลายกรณี แอปของคุณต้องมีสิทธิ์ READ_CONTACTS
เพื่อดูข้อมูลที่เฉพาะเจาะจงเกี่ยวกับรายชื่อติดต่อหนึ่งๆ
หากต้องการดึงข้อมูลเพียงประเภทเดียวจากผู้ติดต่อ เทคนิคนี้ที่ใช้ CONTENT_TYPE
จากคลาส ContactsContract.CommonDataKinds
จะมีประสิทธิภาพมากกว่าการใช้ Contacts.CONTENT_TYPE
ตามที่แสดงในส่วนก่อนหน้า ผลลัพธ์ที่ได้จะช่วยให้คุณเข้าถึงข้อมูลที่ต้องการได้โดยตรงโดยไม่ต้องทำการค้นหาที่ซับซ้อนมากขึ้นในผู้ให้บริการรายชื่อติดต่อ
ผลลัพธ์ Intent
ที่ส่งไปยังการเรียกกลับ onActivityResult()
จะมี content:
URI ที่ชี้ไปยังข้อมูลติดต่อที่เลือก การตอบกลับจะให้สิทธิ์ชั่วคราวแก่แอปของคุณในการอ่านข้อมูลรายชื่อติดต่อดังกล่าว แม้ว่าแอปของคุณจะไม่มีสิทธิ์ READ_CONTACTS
ก็ตาม
- การดำเนินการ
ACTION_PICK
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
-
CommonDataKinds.Phone.CONTENT_TYPE
- เลือกจากรายชื่อติดต่อที่มีหมายเลขโทรศัพท์
CommonDataKinds.Email.CONTENT_TYPE
- เลือกจากรายชื่อติดต่อที่มีที่อยู่อีเมล
CommonDataKinds.StructuredPostal.CONTENT_TYPE
- เลือกจากรายชื่อติดต่อที่มีที่อยู่ไปรษณีย์
หรือค่า
CONTENT_TYPE
อื่นๆ ใดค่าหนึ่งภายใต้ContactsContract
ตัวอย่าง Intent
Kotlin
const val REQUEST_SELECT_PHONE_NUMBER = 1 fun selectContact() { // Start an activity for the user to pick a phone number from contacts. val intent = Intent(Intent.ACTION_PICK).apply { type = CommonDataKinds.Phone.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) { // Get the URI and query the content provider for the phone number. val contactUri: Uri = data.data val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER) contentResolver.query(contactUri, projection, null, null, null).use { cursor -> // If the cursor returned is valid, get the phone number. if (cursor.moveToFirst()) { val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER) val number = cursor.getString(numberIndex) // Do something with the phone number. ... } } } }
Java
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // Start an activity for the user to pick a phone number from contacts. Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { // Get the URI and query the content provider for the phone number. Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // If the cursor returned is valid, get the phone number. if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // Do something with the phone number. //... } } }
ดูรายชื่อติดต่อ
หากต้องการแสดงรายละเอียดสำหรับรายชื่อติดต่อที่รู้จัก ให้ใช้การดำเนินการ ACTION_VIEW
และระบุรายชื่อติดต่อด้วย URI content:
เป็นข้อมูล Intent
การดึงข้อมูล URI ของผู้ติดต่อในตอนแรกทำได้ 2 วิธีหลักๆ ดังนี้
- ใช้ URI ติดต่อที่แสดงผลจากการดำเนินการ
ACTION_PICK
ที่แสดงในส่วนก่อนหน้า แนวทางนี้ไม่จําเป็นต้องใช้สิทธิ์ของแอป - เข้าถึงรายชื่อติดต่อทั้งหมดโดยตรง ตามที่อธิบายไว้ในดึงข้อมูลรายชื่อติดต่อ วิธีนี้ต้องใช้สิทธิ์
READ_CONTACTS
- การดำเนินการ
ACTION_VIEW
- รูปแบบ URI ของข้อมูล
content:<URI>
- ประเภท MIME
- ไม่มี ประเภทจะอนุมานจาก URI รายชื่อติดต่อ
ตัวอย่าง Intent:
Kotlin
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
แก้ไขรายชื่อติดต่อที่มีอยู่
หากต้องการแก้ไขรายชื่อติดต่อที่รู้จัก ให้ใช้การดําเนินการ ACTION_EDIT
ระบุรายชื่อติดต่อด้วย URI content:
เป็นข้อมูล Intent และใส่ข้อมูลติดต่อที่รู้จักไว้ในข้อมูลเพิ่มเติมที่ระบุโดยค่าคงที่ใน ContactsContract.Intents.Insert
การดึงข้อมูล URI ติดต่อในขั้นต้นทำได้ 2 วิธีหลักๆ ดังนี้
- ใช้ URI ติดต่อที่แสดงผลโดยการดำเนินการ
ACTION_PICK
ที่แสดงในส่วนก่อนหน้า วิธีนี้ไม่ต้องใช้สิทธิ์ของแอป - เข้าถึงรายชื่อติดต่อทั้งหมดโดยตรง ตามที่อธิบายไว้ในดึงข้อมูลรายชื่อติดต่อ แนวทางนี้ต้องใช้สิทธิ์
READ_CONTACTS
- การดำเนินการ
ACTION_EDIT
- รูปแบบ URI ของข้อมูล
content:<URI>
- ประเภท MIME
- ระบบจะอนุมานประเภทจาก URI ของรายชื่อติดต่อ
- พิเศษ
- ข้อมูลเพิ่มเติมอย่างน้อย 1 รายการที่กําหนดไว้ใน
ContactsContract.Intents.Insert
เพื่อให้คุณป้อนข้อมูลในช่องของรายละเอียดการติดต่อได้
ตัวอย่าง Intent:
Kotlin
fun editContact(contactUri: Uri, email: String) { val intent = Intent(Intent.ACTION_EDIT).apply { data = contactUri putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void editContact(Uri contactUri, String email) { Intent intent = new Intent(Intent.ACTION_EDIT); intent.setData(contactUri); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขรายชื่อติดต่อ โปรดอ่านแก้ไขรายชื่อติดต่อโดยใช้ Intent
แทรกรายชื่อติดต่อ
หากต้องการแทรกรายชื่อติดต่อใหม่ ให้ใช้การดำเนินการ ACTION_INSERT
โดยระบุ Contacts.CONTENT_TYPE
เป็นประเภท MIME และใส่ข้อมูลติดต่อที่ทราบไว้ในข้อมูลเพิ่มเติมที่ระบุโดยค่าคงที่ใน ContactsContract.Intents.Insert
- การดำเนินการ
ACTION_INSERT
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
Contacts.CONTENT_TYPE
- เพิ่มเติม
- ฟีเจอร์เสริมที่ระบุไว้ใน
ContactsContract.Intents.Insert
อย่างน้อย 1 รายการ
ตัวอย่าง Intent:
Kotlin
fun insertContact(name: String, email: String) { val intent = Intent(Intent.ACTION_INSERT).apply { type = ContactsContract.Contacts.CONTENT_TYPE putExtra(ContactsContract.Intents.Insert.NAME, name) putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void insertContact(String name, String email) { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(Contacts.CONTENT_TYPE); intent.putExtra(Intents.Insert.NAME, name); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีแทรกรายชื่อติดต่อ โปรดอ่านแก้ไขรายชื่อติดต่อโดยใช้ Intent
อีเมล
การเขียนอีเมลพร้อมไฟล์แนบที่ไม่บังคับเป็นการดำเนินการทั่วไปสำหรับแอปอีเมล สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดําเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้
เขียนอีเมลพร้อมไฟล์แนบ (ไม่บังคับ)
หากต้องการเขียนอีเมล ให้ใช้การดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้โดยพิจารณาว่าคุณจะใส่ไฟล์แนบหรือไม่ และใส่รายละเอียดอีเมล เช่น ผู้รับและเรื่อง โดยใช้คีย์เพิ่มเติมที่ระบุไว้
- การดำเนินการ
ACTION_SENDTO
(สำหรับไม่มีไฟล์แนบ) หรือ
ACTION_SEND
(สำหรับไฟล์แนบ 1 รายการ) หรือ
ACTION_SEND_MULTIPLE
(สำหรับไฟล์แนบหลายรายการ)- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
-
"text/plain"
"*/*"
- พิเศษ
-
Intent.EXTRA_EMAIL
- อาร์เรย์สตริงของอีเมลผู้รับ "ถึง" ทั้งหมด
Intent.EXTRA_CC
- อาร์เรย์สตริงของอีเมลผู้รับ "สำเนา" ทั้งหมด
Intent.EXTRA_BCC
- อาร์เรย์สตริงของอีเมลผู้รับ "สำเนาลับ" ทั้งหมด
Intent.EXTRA_SUBJECT
- สตริงที่มีเรื่องอีเมล
Intent.EXTRA_TEXT
- สตริงที่มีเนื้อหาของอีเมล
Intent.EXTRA_STREAM
Uri
ที่ชี้ไปที่ไฟล์แนบ หากใช้การดําเนินการACTION_SEND_MULTIPLE
แทน รายการนี้จะเป็นArrayList
ที่มีออบเจ็กต์Uri
หลายรายการ
ตัวอย่าง Intent
Kotlin
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "*/*" putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
หากต้องการตรวจสอบว่า Intent ได้รับการจัดการโดยแอปอีเมลเท่านั้น ไม่ใช่แอปรับส่งข้อความหรือแอปโซเชียล ให้ใช้การดำเนินการ ACTION_SENDTO
และรวมรูปแบบข้อมูล "mailto:"
ดังที่แสดงในตัวอย่างต่อไปนี้
Kotlin
fun composeEmail(addresses: Array<String>, subject: String) { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") // Only email apps handle this. putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // Only email apps handle this. intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
พื้นที่จัดเก็บไฟล์
ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปพื้นที่เก็บข้อมูลไฟล์ รวมถึงข้อมูลที่จำเป็นในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละรายการ
เรียกข้อมูลไฟล์บางประเภท
หากต้องการขอให้ผู้ใช้เลือกไฟล์ เช่น เอกสารหรือรูปภาพ และส่งคืนข้อมูลอ้างอิงไปยังแอปของคุณ ให้ใช้การดำเนินการ ACTION_GET_CONTENT
และระบุประเภท MIME ที่คุณต้องการ การอ้างอิงไฟล์ที่แสดงผลในแอปจะหายไปตามวงจรปัจจุบันของกิจกรรม ดังนั้นหากต้องการเข้าถึงในภายหลัง คุณต้องนําเข้าสําเนาที่อ่านได้ในภายหลัง
เจตนานี้ยังช่วยให้ผู้ใช้สร้างไฟล์ใหม่ในกระบวนการได้ด้วย เช่น แทนที่จะเลือกรูปภาพที่มีอยู่แล้ว ผู้ใช้สามารถถ่ายรูปใหม่ด้วยกล้องได้
Intent ผลลัพธ์ที่ส่งไปยังเมธอด onActivityResult()
จะมีข้อมูลที่มี URI ที่ชี้ไปยังไฟล์
โดย URI จะเป็นอะไรก็ได้ เช่น URI http:
, file:
URI หรือ content:
URI อย่างไรก็ตาม หากคุณต้องการจำกัดไฟล์ที่เลือกได้เฉพาะกับไฟล์ที่เข้าถึงได้จากผู้ให้บริการเนื้อหา (URI ของ content:
) และพร้อมใช้งานเป็นสตรีมไฟล์ด้วย 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
จะช่วยให้ผู้ใช้เลือกตำแหน่งที่ต้องการสร้างเอกสารใหม่ เช่น ภายในแอปอื่นที่จัดการพื้นที่เก็บข้อมูลของเอกสาร จากนั้นแอปของคุณจะได้รับตำแหน่ง URI ของตำแหน่งที่เขียนเอกสารใหม่ได้
แม้ว่า Intent ที่ส่งไปยังonActivityResult()
วิธีจากการดำเนินการ ACTION_GET_CONTENT
อาจแสดงผลเป็น URI ประเภทใดก็ได้ แต่ Intent ของผลลัพธ์จาก ACTION_OPEN_DOCUMENT
และ ACTION_CREATE_DOCUMENT
จะระบุไฟล์ที่เลือกเป็น URI content:
ที่รองรับ DocumentsProvider
เสมอ คุณสามารถเปิดไฟล์ด้วย openFileDescriptor()
และค้นหารายละเอียดโดยใช้คอลัมน์จาก DocumentsContract.Document
URI ที่ส่งกลับจะให้สิทธิ์การอ่านไฟล์ในระยะยาวแก่แอปและอาจมีสิทธิ์เขียนด้วย การดำเนินการ ACTION_OPEN_DOCUMENT
จะมีประโยชน์อย่างยิ่งเมื่อคุณต้องการอ่านไฟล์ที่มีอยู่โดยไม่ต้องทำสำเนาลงในแอป หรือเมื่อคุณต้องการเปิดและแก้ไขไฟล์ในตำแหน่งเดิม
คุณยังอนุญาตให้ผู้ใช้เลือกหลายไฟล์ได้โดยการเพิ่ม EXTRA_ALLOW_MULTIPLE
ลงใน Intent ที่ตั้งค่าเป็น true
หากผู้ใช้เลือกเพียงรายการเดียว คุณจะดึงข้อมูลรายการนั้นได้จาก getData()
หากผู้ใช้เลือกมากกว่า 1 รายการ getData()
จะแสดงผลเป็น Null และคุณต้องดึงข้อมูลแต่ละรายการจากออบเจ็กต์ ClipData
ที่ getClipData()
แสดงผลแทน
หมายเหตุ: Intent ต้องระบุประเภท MIME และต้องประกาศหมวดหมู่ CATEGORY_OPENABLE
หากเหมาะสม คุณสามารถระบุประเภท MIME ได้มากกว่า 1 ประเภทโดยเพิ่มอาร์เรย์ประเภท MIME ที่มี EXTRA_MIME_TYPES
เพิ่มเติม หากต้องการทำเช่นนั้น คุณต้องตั้งค่าประเภท MIME หลักใน setType()
เป็น "*/*"
- การดำเนินการ
ACTION_OPEN_DOCUMENT
หรือ
ACTION_CREATE_DOCUMENT
- รูปแบบ URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่ผู้ใช้ต้องเลือก
- พิเศษ
-
EXTRA_MIME_TYPES
- อาร์เรย์ของประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่แอปขอ เมื่อใช้ส่วนเสริมนี้ คุณต้องตั้งค่าประเภท MIME หลักใน
setType()
เป็น"*/*"
EXTRA_ALLOW_MULTIPLE
- บูลีนที่ประกาศว่าผู้ใช้จะเลือกไฟล์ได้มากกว่า 1 ไฟล์พร้อมกันหรือไม่
EXTRA_TITLE
- สำหรับใช้กับ
ACTION_CREATE_DOCUMENT
เพื่อระบุชื่อไฟล์เริ่มต้น EXTRA_LOCAL_ONLY
- บูลีนที่ประกาศว่าไฟล์ที่แสดงผลต้องพร้อมใช้งานจากอุปกรณ์โดยตรงหรือไม่ แทนที่จะต้องดาวน์โหลดจากบริการระยะไกล
- หมวดหมู่
-
CATEGORY_OPENABLE
- หากต้องการแสดงผลเฉพาะไฟล์ที่ "เปิดได้" ซึ่งแสดงเป็นสตรีมไฟล์ได้ด้วย
openFileDescriptor()
ตัวอย่างความตั้งใจในการได้รูปภาพ
Kotlin
const val REQUEST_IMAGE_OPEN = 1 fun selectImage2() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) { val fullPhotoUri: Uri = data.data // Do work with full size photo saved at fullPhotoUri. ... } }
Java
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri. ... } }
แอปของบุคคลที่สามจะตอบสนองต่อ Intent ด้วยการดำเนินการ ACTION_OPEN_DOCUMENT
ไม่ได้ แต่ระบบจะรับ Intent นี้และแสดงไฟล์ทั้งหมดที่มีจากแอปต่างๆ ในอินเทอร์เฟซผู้ใช้แบบรวม
หากต้องการแสดงไฟล์ของแอปใน UI นี้และอนุญาตให้แอปอื่นๆ เปิดไฟล์เหล่านั้น คุณต้องติดตั้งใช้งาน DocumentsProvider
และใส่ตัวกรอง Intent สำหรับ PROVIDER_INTERFACE
("android.content.action.DOCUMENTS_PROVIDER"
) ดังที่แสดงในตัวอย่างต่อไปนี้
<provider ... android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider>
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีทำให้ไฟล์ที่จัดการโดยแอปเปิดได้จากแอปอื่นๆ ได้ที่เปิดไฟล์โดยใช้เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล
การกระทำเกี่ยวกับสถานที่
การเรียกรถเป็นการกระทำเกี่ยวกับสถานที่ที่พบบ่อย สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดําเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้
โทรเรียกรถ
หากต้องการเรียกแท็กซี่ ให้ใช้การดำเนินการ
ACTION_RESERVE_TAXI_RESERVATION
หมายเหตุ: แอปต้องขอการยืนยันจากผู้ใช้ก่อนดำเนินการนี้ให้เสร็จสมบูรณ์
- การดำเนินการ
ACTION_RESERVE_TAXI_RESERVATION
- Data URI
- ไม่มี
- ประเภท MIME
- ไม่มี
- พิเศษ
- ไม่มี
ตัวอย่าง Intent
Kotlin
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
แผนที่
การแสดงตำแหน่งบนแผนที่เป็นการกระทำทั่วไปสำหรับแอปแผนที่ สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดําเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้
แสดงตำแหน่งบนแผนที่
หากต้องการเปิดแผนที่ ให้ใช้การดำเนินการ ACTION_VIEW
และระบุข้อมูลตำแหน่งในข้อมูล Intent ด้วยรูปแบบใดรูปแบบหนึ่งต่อไปนี้
- การดำเนินการ
ACTION_VIEW
- รูปแบบ URI ของข้อมูล
-
geo:latitude,longitude
- แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุ
ตัวอย่าง:
"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
- แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุในระดับการซูมหนึ่งๆ ระดับการซูม 1 จะแสดงทั้งโลกโดยศูนย์กลางอยู่ที่ lat,lng ที่ระบุ ระดับการซูมสูงสุด (ใกล้ที่สุด) คือ 23
ตัวอย่าง:
"geo:47.6,-122.3?z=11"
geo:0,0?q=lat,lng(label)
- แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุพร้อมป้ายกำกับสตริง
ตัวอย่าง:
"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address
- แสดงตำแหน่งสำหรับ "ที่อยู่ของฉัน" ซึ่งอาจเป็นที่อยู่หรือคำค้นหาตำแหน่งที่เฉพาะเจาะจง
ตัวอย่าง:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
หมายเหตุ: สตริงทั้งหมดที่ส่งใน URI ของ
geo
ต้องมีการเข้ารหัส เช่น สตริง1st & Pike, Seattle
จะกลายเป็น1st%20%26%20Pike%2C%20Seattle
ช่องว่างในสตริงมีการเข้ารหัสด้วย%20
หรือแทนที่ด้วยเครื่องหมายบวก (+
)
- ประเภท MIME
- ไม่มี
ตัวอย่าง Intent:
Kotlin
fun showMap(geoLocation: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = geoLocation } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void showMap(Uri geoLocation) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(geoLocation); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่างตัวกรอง Intent
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เพลงหรือวิดีโอ
ต่อไปนี้คือการดำเนินการทั่วไปสำหรับแอปเพลงและวิดีโอ รวมถึงข้อมูลที่จำเป็นในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง
เล่นไฟล์สื่อ
หากต้องการเปิดไฟล์เพลง ให้ใช้การดำเนินการ ACTION_VIEW
และระบุตำแหน่ง URI ของไฟล์ในข้อมูล Intent
- การดำเนินการ
ACTION_VIEW
- รูปแบบ URI ของข้อมูล
-
file:<URI>
content:<URI>
http:<URL>
- ประเภท MIME
-
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
- หรืออื่นๆ ที่แอปของคุณกำหนด
ตัวอย่าง Intent:
Kotlin
fun playMedia(file: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = file } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playMedia(Uri file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(file); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:type="audio/*" /> <data android:type="application/ogg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เปิดเพลงตามคำค้นหา
หากต้องการเล่นเพลงตามคำค้นหา ให้ใช้ Intent 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 รายการ ได้แก่ ชื่อเพลง ศิลปิน และอัลบั้ม เจตนานี้รองรับโหมดการค้นหาต่อไปนี้สําหรับค่า
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
(ต้องระบุ): ประเภท ส่วนเพิ่มเติมนี้จะมีไว้ให้เพื่อความเข้ากันได้แบบย้อนหลังเสมอ แอปที่มีอยู่ซึ่งไม่ทราบเกี่ยวกับโหมดการค้นหาจะประมวลผลความตั้งใจนี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
ศิลปิน -
Audio.Artists.ENTRY_CONTENT_TYPE
-
เปิดเพลงจากศิลปินที่เฉพาะเจาะจง
ฟีเจอร์เพิ่มเติม
EXTRA_MEDIA_ARTIST
(ต้องระบุ): ศิลปิน"android.intent.extra.genre"
: ประเภทQUERY
(ต้องระบุ): สตริงที่มีชุดค่าผสมของศิลปินหรือประเภท ส่วนพิเศษนี้จะมีให้เพื่อความเข้ากันได้แบบย้อนหลังเสมอ แอปที่มีอยู่ซึ่งไม่ทราบเกี่ยวกับโหมดการค้นหาจะประมวลผลความตั้งใจนี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
อัลบั้ม -
Audio.Albums.ENTRY_CONTENT_TYPE
-
เปิดเพลงจากอัลบั้มที่เฉพาะเจาะจง
ฟีเจอร์เพิ่มเติม
EXTRA_MEDIA_ALBUM
(ต้องระบุ): อัลบั้มEXTRA_MEDIA_ARTIST
: ศิลปิน"android.intent.extra.genre"
: ประเภทQUERY
(ต้องระบุ): สตริงที่มีชุดค่าผสมของอัลบั้มหรือศิลปิน เรามีบริการเสริมนี้ไว้เพื่อให้ใช้กับเวอร์ชันก่อนหน้าได้เสมอ แอปที่มีอยู่ซึ่งไม่ทราบเกี่ยวกับโหมดการค้นหาอาจประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้าง
เพลง -
"vnd.android.cursor.item/audio"
-
เล่นเพลงที่ต้องการ
ข้อมูลเพิ่มเติม:
EXTRA_MEDIA_ALBUM
: อัลบั้มEXTRA_MEDIA_ARTIST
: ศิลปิน"android.intent.extra.genre"
: ประเภทEXTRA_MEDIA_TITLE
(ต้องระบุ): ชื่อเพลงQUERY
(ต้องระบุ): สตริงที่มีชุดค่าผสมของอัลบั้ม ศิลปิน ประเภท หรือชื่อ เรามีตัวเลือกเพิ่มเติมนี้ไว้เสมอเพื่อให้ใช้กับเวอร์ชันก่อนหน้าได้ แอปที่มีอยู่ซึ่งไม่ทราบเกี่ยวกับโหมดการค้นหาจะประมวลผลความตั้งใจนี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
เพลย์ลิสต์ -
Audio.Playlists.ENTRY_CONTENT_TYPE
-
เปิดเพลย์ลิสต์ที่เฉพาะเจาะจงหรือเพลย์ลิสต์ที่ตรงกับเกณฑ์บางอย่างที่ระบุโดยฟีเจอร์เพิ่มเติม
ฟีเจอร์เพิ่มเติม
EXTRA_MEDIA_ALBUM
: อัลบั้มEXTRA_MEDIA_ARTIST
: ศิลปิน"android.intent.extra.genre"
: ประเภท"android.intent.extra.playlist"
: เพลย์ลิสต์EXTRA_MEDIA_TITLE
: ชื่อเพลงที่ใช้สร้างเพลย์ลิสต์QUERY
(ต้องระบุ): สตริงที่มีชุดค่าผสมของอัลบั้ม ศิลปิน แนวเพลง เพลย์ลิสต์ หรือชื่อ เรามีตัวเลือกเพิ่มเติมนี้ไว้เสมอเพื่อให้ใช้กับเวอร์ชันก่อนหน้าได้ แอปที่มีอยู่ซึ่งไม่ทราบเกี่ยวกับโหมดการค้นหาจะประมวลผลความตั้งใจนี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
ตัวอย่าง Intent
หากผู้ใช้ต้องการฟังเพลงจากศิลปินที่เฉพาะเจาะจง แอปค้นหาอาจสร้าง Intent ต่อไปนี้
Kotlin
fun playSearchArtist(artist: String) { val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply { putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist) putExtra(SearchManager.QUERY, artist) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playSearchArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); intent.putExtra(SearchManager.QUERY, artist); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เมื่อจัดการ Intent นี้ในกิจกรรม ให้ตรวจสอบค่าของ EXTRA_MEDIA_FOCUS
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"
- สตริงสำหรับ SMS
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
ตัวอย่าง 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 ต่อไปนี้ เมื่อแอปโทรศัพท์เปิดขึ้น แอปจะแสดงหมายเลขโทรศัพท์ และผู้ใช้ต้องแตะปุ่มโทรเพื่อเริ่มการโทร
หากต้องการโทรออกโดยตรง ให้ใช้การดําเนินการ ACTION_CALL
และระบุหมายเลขโทรศัพท์โดยใช้รูปแบบ URI ต่อไปนี้ เมื่อแอปโทรศัพท์เปิดขึ้น ระบบจะเริ่มการโทร ผู้ใช้ไม่จําเป็นต้องแตะปุ่มโทร
การดำเนินการ ACTION_CALL
กำหนดให้คุณเพิ่มสิทธิ์ CALL_PHONE
ลงในไฟล์ Manifest
<uses-permission android:name="android.permission.CALL_PHONE" />
หมายเลขโทรศัพท์ที่ถูกต้องคือหมายเลขที่ระบุไว้ใน IETF RFC 3966 ตัวอย่างที่ถูกต้องมีดังนี้
ตัวต่อสายของแอปโทรศัพท์จะปรับรูปแบบต่างๆ ให้ถูกต้อง เช่น หมายเลขโทรศัพท์ รูปแบบที่อธิบายจึงไม่จำเป็นอย่างเคร่งครัดในเมธอด 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 เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง
ค้นหาโดยใช้แอปที่เฉพาะเจาะจง
หากต้องการรองรับการค้นหาภายในบริบทของแอป ให้ประกาศตัวกรอง Intent ในแอปด้วยการดำเนินการ SEARCH_ACTION
ดังที่แสดงในตัวอย่างตัวกรอง Intent ต่อไปนี้
หมายเหตุ: เราไม่แนะนำให้ใช้ SEARCH_ACTION
สำหรับการค้นหาแอป
แต่ให้ใช้การดําเนินการ GET_THING
เพื่อใช้ประโยชน์จากการสนับสนุนการค้นหาในแอปในตัวของ Google Assistant ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบการดำเนินการของแอปของ Google Assistant
ตัวอย่างตัวกรอง 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
ตัวอย่าง 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 อย่างใดอย่างหนึ่งต่อไปนี้
ตัวอย่าง 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 อย่างใดอย่างหนึ่งต่อไปนี้ แล้วระบุรายละเอียดข้อความ เช่น หมายเลขโทรศัพท์ เรื่อง และเนื้อหาข้อความ โดยใช้คีย์เพิ่มเติมต่อไปนี้
ตัวอย่าง 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 ของเว็บ
หากต้องการเปิดหน้าเว็บ ให้ใช้การดำเนินการ ACTION_VIEW
และระบุ URL ของเว็บในข้อมูล Intent
ตัวอย่าง 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 ที่เฉพาะเจาะจงโดยทําดังนี้
ดูข้อมูลเพิ่มเติมได้ที่ออกคำสั่งเชลล์