Intent ช่วยให้คุณเริ่มกิจกรรมในแอปอื่นได้โดยอธิบายการดำเนินการที่ต้องการทำ เช่น "ดูแผนที่" หรือ "ถ่ายภาพ" ในออบเจ็กต์ Intent Intent ประเภทนี้เรียกว่า Intent โดยนัย เนื่องจากไม่ได้ระบุคอมโพเนนต์ของแอปที่จะเริ่ม แต่ระบุการดำเนินการและให้ข้อมูลบางอย่างเพื่อดำเนินการแทน
เมื่อคุณเรียกใช้ startActivity() หรือ startActivityForResult() และส่ง Intent โดยนัย ระบบจะแก้ไข Intent ไปยังแอปที่จัดการ Intent ได้และเริ่ม Activity ที่เกี่ยวข้อง หากมีแอปมากกว่า 1 แอปที่จัดการ Intent ได้ ระบบจะแสดงกล่องโต้ตอบให้ผู้ใช้เลือกแอปที่จะใช้
หน้านี้อธิบาย Intent โดยนัยหลายรายการที่คุณใช้เพื่อดำเนินการทั่วไปได้ โดยจัดระเบียบตามประเภทแอปที่จัดการ Intent แต่ละส่วนยังแสดงวิธีสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการด้วย
ข้อควรระวัง: หากไม่มีแอปในอุปกรณ์ที่สามารถรับ Intent โดยนัย แอปจะขัดข้องเมื่อเรียกใช้ startActivity() หากต้องการยืนยันก่อนว่ามีแอปที่จะรับ Intent ให้เรียกใช้ resolveActivity() ในออบเจ็กต์ Intent หากผลลัพธ์ไม่ใช่ค่า Null แสดงว่ามีแอปอย่างน้อย 1 แอปที่จัดการ Intent ได้ และเรียกใช้ startActivity() ได้อย่างปลอดภัย หากผลลัพธ์เป็น Null อย่าใช้ Intent และปิดใช้ฟีเจอร์ที่เรียกใช้ Intent หากเป็นไปได้
หากไม่คุ้นเคยกับวิธีสร้าง Intent หรือตัวกรอง Intent โปรดอ่าน Intent และตัวกรอง Intent ก่อน
หากต้องการดูวิธีเริ่ม Intent ที่แสดงในหน้านี้จากโฮสต์การพัฒนา โปรดดูส่วนยืนยัน Intent ด้วย Android Debug Bridge
การสั่งงานด้วยเสียงของ Google
การสั่งงานด้วยเสียงของ Google จะเริ่ม Intent บางรายการที่แสดงในหน้านี้เพื่อตอบสนองต่อคำสั่งเสียง ดูข้อมูลเพิ่มเติมได้ที่ เริ่มต้นใช้งานการสั่งงานด้วยเสียงของระบบ
นาฬิกาปลุก
ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปนาฬิกาปลุก รวมถึงข้อมูลที่คุณต้องใช้ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง
สร้างการตั้งปลุก
หากต้องการสร้างการปลุกใหม่ ให้ใช้การดำเนินการ ACTION_SET_ALARM และระบุรายละเอียดการปลุก เช่น เวลาและข้อความ โดยใช้ข้อมูลเพิ่มเติมต่อไปนี้
หมายเหตุ: เฉพาะชั่วโมง นาที และข้อความเพิ่มเติมเท่านั้นที่ใช้ได้ใน Android 2.3 (ระดับ API 9) และต่ำกว่า ส่วนสิทธิพิเศษอื่นๆ จะพร้อมใช้งานในแพลตฟอร์มเวอร์ชันที่สูงกว่า
- การดำเนินการ
ACTION_SET_ALARM- URI ข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- Extras
-
EXTRA_HOUR- ชั่วโมงสำหรับการปลุก
EXTRA_MINUTES- นาทีสำหรับการปลุก
EXTRA_MESSAGE- ข้อความที่กำหนดเองเพื่อระบุการปลุก
EXTRA_DAYSArrayListรวมถึงวันในสัปดาห์ที่การปลุกนี้จะเกิดซ้ำ แต่ละวันต้องประกาศด้วยจำนวนเต็มจากคลาสCalendarเช่นMONDAYสำหรับการปลุกแบบครั้งเดียว ไม่ต้องระบุข้อมูลเพิ่มเติมนี้
EXTRA_RINGTONE- URI
content:ที่ระบุเสียงเรียกเข้าที่จะใช้กับการปลุก หรือVALUE_RINGTONE_SILENTสำหรับไม่มีเสียงเรียกเข้าหากต้องการใช้เสียงเรียกเข้าเริ่มต้น ไม่ต้องระบุส่วนเสริมนี้
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
<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
- ไม่มี
- Extras
-
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
<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
<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"- Extras
-
EXTRA_EVENT_ALL_DAY- บูลีนที่ระบุว่ากิจกรรมนี้เป็นกิจกรรมตลอดวันหรือไม่
EXTRA_EVENT_BEGIN_TIME- เวลาเริ่มต้นของเหตุการณ์ (มิลลิวินาทีนับตั้งแต่ Epoch)
EXTRA_EVENT_END_TIME- เวลาสิ้นสุดของเหตุการณ์ (มิลลิวินาทีที่เริ่มนับมาตั้งแต่วันที่ 1 มกราคม ค.ศ. 1970)
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
<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
- ไม่มี
- Extras
-
EXTRA_OUTPUT- ตำแหน่ง URI ที่แอปกล้องบันทึกไฟล์รูปภาพหรือวิดีโอ (เป็นออบเจ็กต์
Uri)
เมื่อแอปกล้องคืนโฟกัสไปยังกิจกรรมของคุณได้สำเร็จ กล่าวคือ แอปของคุณได้รับ Callback 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
<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
- ไม่มี
- Extras
- ไม่มี
ตัวอย่างความตั้งใจ
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
- ไม่มี
- Extras
- ไม่มี
ตัวอย่างความตั้งใจ
Kotlin
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
Java
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
ตัวอย่างตัวกรอง Intent
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
แอปรายชื่อติดต่อ/ผู้คน
ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปจัดการรายชื่อติดต่อ รวมถึงข้อมูลที่คุณต้องใช้ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง
เลือกรายชื่อติดต่อ
หากต้องการให้ผู้ใช้เลือกรายชื่อติดต่อและให้สิทธิ์แอปเข้าถึงข้อมูลติดต่อทั้งหมด ให้ใช้การดำเนินการ ACTION_PICK และระบุประเภท MIME เป็น Contacts.CONTENT_TYPE
ผลลัพธ์ Intent ที่ส่งไปยัง Callback onActivityResult() จะมี URI content: ที่ชี้ไปยังรายชื่อติดต่อที่เลือก การตอบกลับจะให้สิทธิ์ชั่วคราวแก่แอปของคุณในการอ่านรายชื่อติดต่อนั้นโดยใช้ API ของ Contacts Provider แม้ว่าแอปของคุณจะไม่มีสิทธิ์ 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 ดังที่แสดงในส่วนก่อนหน้า ผลลัพธ์ที่ได้จะช่วยให้คุณเข้าถึงข้อมูลที่ต้องการได้โดยตรง โดยไม่ต้องทำการค้นหาที่ซับซ้อนมากขึ้นใน Contacts Provider
ผลลัพธ์ Intent ที่ส่งไปยัง Callback onActivityResult() ของคุณจะมี URI content: ที่ชี้ไปยังข้อมูลรายชื่อติดต่อที่เลือก การตอบกลับจะให้สิทธิ์ชั่วคราวแก่แอปของคุณในการอ่านข้อมูลรายชื่อติดต่อนั้น แม้ว่าแอปของคุณจะไม่มีสิทธิ์ READ_CONTACTS ก็ตาม
- การดำเนินการ
ACTION_PICK- สคีม URI ของข้อมูล
- ไม่มี
- ประเภท MIME
-
CommonDataKinds.Phone.CONTENT_TYPE- เลือกจากรายชื่อติดต่อที่มีหมายเลขโทรศัพท์
CommonDataKinds.Email.CONTENT_TYPE- เลือกจากรายชื่อติดต่อที่มีอีเมล
CommonDataKinds.StructuredPostal.CONTENT_TYPE- เลือกจากรายชื่อติดต่อที่มีที่อยู่ทางไปรษณีย์
หรือค่า
CONTENT_TYPEอื่นๆ อีกมากมายใน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 และระบุรายชื่อติดต่อด้วย URI content: เป็นข้อมูล 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 ระบุรายชื่อติดต่อด้วย URI content: เป็นข้อมูล Intent และรวมข้อมูลรายชื่อติดต่อที่รู้จักในส่วนเสริมที่ระบุโดยค่าคงที่ใน ContactsContract.Intents.Insert
การดึงข้อมูล URI ของรายชื่อติดต่อในเบื้องต้นทำได้ 2 วิธีหลักๆ ดังนี้
- ใช้ URI ของรายชื่อติดต่อที่แสดงผลโดยการดำเนินการ
ACTION_PICKที่แสดงในส่วนก่อนหน้า วิธีนี้ไม่จำเป็นต้องใช้สิทธิ์ของแอป - เข้าถึงรายชื่อติดต่อทั้งหมดโดยตรงตามที่อธิบายไว้ในหัวข้อเรียกข้อมูลรายชื่อติดต่อ วิธีนี้ต้องใช้สิทธิ์
READ_CONTACTS
- การดำเนินการ
ACTION_EDIT- สคีม URI ของข้อมูล
content:<URI>- ประเภท MIME
- ระบบจะอนุมานประเภทจาก URI ของผู้ติดต่อ
- Extras
- ข้อมูลเพิ่มเติมอย่างน้อย 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- Extras
- ข้อมูลเพิ่มเติมอย่างน้อย 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""*/*"
- Extras
-
Intent.EXTRA_EMAIL- อาร์เรย์สตริงของอีเมลผู้รับ "ถึง" ทั้งหมด
Intent.EXTRA_CC- อาร์เรย์สตริงของอีเมลผู้รับ "CC" ทั้งหมด
Intent.EXTRA_BCC- อาร์เรย์สตริงของอีเมลผู้รับ "สำเนาลับ" ทั้งหมด
Intent.EXTRA_SUBJECT- สตริงที่มีเรื่องอีเมล
Intent.EXTRA_TEXT- สตริงที่มีเนื้อหาของอีเมล
Intent.EXTRA_STREAMUriที่ชี้ไปยังไฟล์แนบ หากใช้การดำเนินการ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
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
พื้นที่จัดเก็บไฟล์
ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปพื้นที่เก็บข้อมูลไฟล์ รวมถึงข้อมูลที่คุณต้องใช้ในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละอย่าง
ดึงข้อมูลไฟล์บางประเภท
หากต้องการขอให้ผู้ใช้เลือกไฟล์ เช่น เอกสารหรือรูปภาพ และแสดงผลข้อมูลอ้างอิงไปยังแอปของคุณ ให้ใช้การดำเนินการ ACTION_GET_CONTENT และระบุประเภท MIME ที่ต้องการ การอ้างอิงไฟล์ที่แสดงผลไปยังแอปของคุณจะเปลี่ยนผ่านไปยังวงจรปัจจุบันของกิจกรรม ดังนั้นหากต้องการเข้าถึงในภายหลัง คุณต้องนำเข้าสำเนาที่อ่านได้ในภายหลัง
Intent นี้ยังช่วยให้ผู้ใช้สร้างไฟล์ใหม่ในกระบวนการได้ด้วย เช่น แทนที่จะเลือกรูปภาพที่มีอยู่ ผู้ใช้สามารถถ่ายรูปใหม่ด้วยกล้องได้
Intent ผลลัพธ์ที่ส่งไปยังเมธอด onActivityResult() ของคุณจะมีข้อมูลที่มี URI ที่ชี้ไปยังไฟล์
URI อาจเป็นอะไรก็ได้ เช่น URI ของ http:, URI ของ file: หรือ URI ของ content: อย่างไรก็ตาม หากต้องการจำกัดไฟล์ที่เลือกได้ให้เหลือเฉพาะไฟล์ที่เข้าถึงได้จาก Content Provider (URI content:) และพร้อมใช้งานเป็นสตรีมไฟล์ที่มี openFileDescriptor() ให้เพิ่มหมวดหมู่ CATEGORY_OPENABLE ลงใน Intent
ใน Android 4.3 (ระดับ API 18) ขึ้นไป คุณยังอนุญาตให้ผู้ใช้เลือกไฟล์หลายไฟล์ได้โดยเพิ่ม EXTRA_ALLOW_MULTIPLE ลงใน Intent โดยตั้งค่าเป็น true
จากนั้นคุณจะเข้าถึงไฟล์ที่เลือกแต่ละไฟล์ได้ในออบเจ็กต์ ClipData ที่ getClipData() แสดงผล
- การดำเนินการ
ACTION_GET_CONTENT- สคีม URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่ผู้ใช้ต้องเลือก
- Extras
-
EXTRA_ALLOW_MULTIPLE- บูลีนที่ประกาศว่าผู้ใช้สามารถเลือกไฟล์ได้มากกว่า 1 ไฟล์พร้อมกันหรือไม่
EXTRA_LOCAL_ONLY- บูลีนที่ประกาศว่าไฟล์ที่แสดงผลต้องพร้อมใช้งานโดยตรงจากอุปกรณ์หรือไม่ แทนที่จะต้องดาวน์โหลดจากบริการระยะไกล
- Category (ไม่บังคับ)
-
CATEGORY_OPENABLE- หากต้องการแสดงเฉพาะไฟล์ที่ "เปิดได้" ซึ่งแสดงเป็นสตรีมไฟล์ที่มี
openFileDescriptor()ได้
ตัวอย่าง Intent เพื่อรับรูปภาพ:
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 supportsOpenableColumnsandContentResolver.openFileDescriptor(). --> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
เปิดไฟล์บางประเภท
เมื่อใช้ Android 4.4 ขึ้นไป คุณสามารถขอเปิดไฟล์ที่จัดการโดยแอปอื่นได้โดยใช้การดำเนินการ ACTION_OPEN_DOCUMENT และระบุประเภท MIME แทนการเรียกข้อมูลสำเนาของไฟล์ที่ต้องนำเข้าแอปโดยใช้การดำเนินการ ACTION_GET_CONTENT
หากต้องการให้ผู้ใช้สร้างเอกสารใหม่ที่แอปของคุณเขียนได้ด้วย ให้ใช้การดำเนินการ ACTION_CREATE_DOCUMENT แทน
ตัวอย่างเช่น แทนที่จะเลือกจากเอกสาร PDF ที่มีอยู่ Intent 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 ที่สอดคล้องกับประเภทไฟล์ที่ผู้ใช้ต้องเลือก
- Extras
-
EXTRA_MIME_TYPES- อาร์เรย์ของประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่แอปของคุณขอ เมื่อใช้ส่วนเสริมนี้ คุณต้องตั้งค่าประเภท MIME หลักใน
setType()เป็น"*/*" EXTRA_ALLOW_MULTIPLE- บูลีนที่ประกาศว่าผู้ใช้สามารถเลือกไฟล์ได้มากกว่า 1 ไฟล์พร้อมกันหรือไม่
EXTRA_TITLE- ใช้กับ
ACTION_CREATE_DOCUMENTเพื่อระบุชื่อไฟล์เริ่มต้น EXTRA_LOCAL_ONLY- บูลีนที่ประกาศว่าไฟล์ที่แสดงผลต้องพร้อมใช้งานโดยตรงจากอุปกรณ์หรือไม่ แทนที่จะต้องดาวน์โหลดจากบริการระยะไกล
- หมวดหมู่
-
CATEGORY_OPENABLE- หากต้องการแสดงเฉพาะไฟล์ที่ "เปิดได้" ซึ่งแสดงเป็นสตรีมไฟล์ที่มี
openFileDescriptor()ได้
ตัวอย่าง Intent เพื่อรับรูปภาพ:
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- URI ข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- Extras
- ไม่มี
ตัวอย่างความตั้งใจ
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>
Maps
การแสดงตำแหน่งบนแผนที่เป็นการดำเนินการทั่วไปสำหรับแอปแผนที่ สร้างตัวกรอง 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
<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
<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 นี้จะทำการค้นหาภายในคลังของตนเพื่อจับคู่เนื้อหาที่มีอยู่กับคำค้นหาที่ระบุและเริ่มเล่นเนื้อหานั้น
ใน Intent นี้ ให้ใส่สตริง EXTRA_MEDIA_FOCUS
เพิ่มเติม ซึ่งระบุโหมดการค้นหาที่ต้องการ ตัวอย่างเช่น โหมดการค้นหาจะระบุได้ว่าการค้นหานั้นเป็นชื่อศิลปินหรือชื่อเพลง
- การดำเนินการ
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH- สคีม URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- Extras
-
MediaStore.EXTRA_MEDIA_FOCUS(ต้องระบุ)-
ระบุโหมดการค้นหาว่าผู้ใช้กำลังมองหาศิลปิน อัลบั้ม เพลง หรือเพลย์ลิสต์ที่เฉพาะเจาะจงหรือไม่ โหมดการค้นหาส่วนใหญ่จะใช้ส่วนเสริมเพิ่มเติม ตัวอย่างเช่น หากผู้ใช้สนใจฟังเพลงใดเพลงหนึ่ง Intent อาจมีข้อมูลเพิ่มเติม 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(ต้องระบุ): สตริงที่มีชุดค่าผสมของอัลบั้มหรือศิลปิน ระบบจะระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาจะประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
เพลง -
"vnd.android.cursor.item/audio"-
เปิดเพลงที่ต้องการ
บริการเสริมเพิ่มเติม
EXTRA_MEDIA_ALBUM: อัลบั้มEXTRA_MEDIA_ARTIST: ศิลปิน"android.intent.extra.genre": ประเภทEXTRA_MEDIA_TITLE(ต้องระบุ): ชื่อเพลงQUERY(ต้องระบุ): สตริงที่มีการผสมผสานระหว่างอัลบั้ม ศิลปิน แนวเพลง หรือชื่อเพลง ระบบจะระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาจะประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
เพลย์ลิสต์ -
Audio.Playlists.ENTRY_CONTENT_TYPE-
เล่นเพลย์ลิสต์ที่เฉพาะเจาะจงหรือเพลย์ลิสต์ที่ตรงกับเกณฑ์บางอย่างที่ระบุโดยส่วนเสริมเพิ่มเติม
บริการเสริมเพิ่มเติม
EXTRA_MEDIA_ALBUM: อัลบั้มEXTRA_MEDIA_ARTIST: ศิลปิน"android.intent.extra.genre": ประเภท"android.intent.extra.playlist": เพลย์ลิสต์EXTRA_MEDIA_TITLE: ชื่อเพลงที่ใช้เป็นพื้นฐานของเพลย์ลิสต์QUERY(ต้องระบุ): สตริงที่มีการผสมผสานระหว่างอัลบั้ม ศิลปิน แนวเพลง เพลย์ลิสต์ หรือชื่อเพลง ระบบจะระบุข้อมูลเพิ่มเติมนี้เสมอเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาจะประมวลผล Intent นี้เป็นการค้นหาที่ไม่มีโครงสร้างได้
ตัวอย่างความตั้งใจ
หากผู้ใช้ต้องการฟังเพลงจากศิลปินคนใดคนหนึ่ง แอปค้นหาอาจสร้าง Intent ต่อไปนี้
Kotlin
fun playSearchArtist(artist: String) { val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply { putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist) putExtra(SearchManager.QUERY, artist) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playSearchArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); intent.putExtra(SearchManager.QUERY, artist); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่างตัวกรอง Intent
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เมื่อจัดการ Intent นี้ในกิจกรรม ให้ตรวจสอบค่าของ EXTRA_MEDIA_FOCUS เพิ่มเติมใน Intent ที่เข้ามาเพื่อกำหนดโหมดการค้นหา เมื่อกิจกรรมของคุณระบุโหมดการค้นหาแล้ว ให้อ่านค่าของข้อมูลเพิ่มเติมสำหรับโหมดการค้นหานั้นๆ
เมื่อมีข้อมูลนี้ แอปของคุณจะทำการค้นหาภายในคลังเพื่อเล่นเนื้อหาที่ตรงกับคำค้นหาได้ ดังที่แสดงในตัวอย่างต่อไปนี้
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS) val query: String? = intent.getStringExtra(SearchManager.QUERY) // Some of these extras might not be available depending on the search mode. val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM) val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST) val genre: String? = intent.getStringExtra("android.intent.extra.genre") val playlist: String? = intent.getStringExtra("android.intent.extra.playlist") val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE) // Determine the search mode and use the corresponding extras. when { mediaFocus == null -> { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query) } mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> { if (query?.isNotEmpty() == true) { // 'Unstructured' search mode. playUnstructuredSearch(query) } else { // 'Any' search mode. playResumeLastPlaylist() } } mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> { // 'Genre' search mode. playGenre(genre) } mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Artist' search mode. playArtist(artist, genre) } mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> { // 'Album' search mode. playAlbum(album, artist) } mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> { // 'Song' search mode. playSong(album, artist, genre, title) } mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title) } } } }
Java
protected void onCreate(Bundle savedInstanceState) { //... Intent intent = this.getIntent(); if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); String query = intent.getStringExtra(SearchManager.QUERY); // Some of these extras might not be available depending on the search mode. String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); String genre = intent.getStringExtra("android.intent.extra.genre"); String playlist = intent.getStringExtra("android.intent.extra.playlist"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // Determine the search mode and use the corresponding extras. if (mediaFocus == null) { // 'Unstructured' search mode (backward compatible). playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // 'Any' search mode. playResumeLastPlaylist(); } else { // 'Unstructured' search mode. playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { // 'Genre' search mode. playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // 'Artist' search mode. playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // 'Album' search mode. playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // 'Song' search mode. playSong(album, artist, genre, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title); } } }
โน้ตใหม่
การสร้างโน้ตเป็นการดำเนินการที่พบบ่อยสำหรับแอปจดโน้ต สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้
สร้างโน้ต
หากต้องการสร้างโน้ตใหม่ ให้ใช้การดำเนินการ
ACTION_CREATE_NOTE และระบุรายละเอียดโน้ต เช่น เรื่องและข้อความ โดยใช้ข้อมูลเพิ่มเติมต่อไปนี้
หมายเหตุ: แอปต้องขอการยืนยันจากผู้ใช้ก่อนดำเนินการนี้ให้เสร็จสมบูรณ์
- การดำเนินการ
-
ACTION_CREATE_NOTE - สคีม URI ของข้อมูล
- ไม่มี
- ประเภท MIME
-
PLAIN_TEXT_TYPE - "*/*"
- Extras
-
-
EXTRA_NAME - สตริงที่ระบุชื่อหรือเรื่องของโน้ต
-
EXTRA_TEXT - สตริงที่ระบุข้อความของโน้ต
-
- การดำเนินการ
-
ACTION_DIAL- เปิดแป้นโทรศัพท์หรือแอปโทรศัพท์ACTION_CALL- โทรออก (ต้องใช้สิทธิ์CALL_PHONE)
- สคีม URI ของข้อมูล
-
tel:<phone-number>voicemail:<phone-number>
- ประเภท MIME
- ไม่มี
tel:2125551212tel:(212) 555 1212- การดำเนินการ
-
"com.google.android.gms.actions.SEARCH_ACTION"- รองรับคำค้นหาจากการสั่งงานด้วยเสียงของ Google
- Extras
-
QUERY- สตริงที่มีคำค้นหา
- การดำเนินการ
ACTION_WEB_SEARCH- สคีม URI ของข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- Extras
-
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/*"
- Extras
-
"subject"- สตริงสำหรับเรื่องของข้อความ (โดยปกติจะใช้สำหรับ MMS เท่านั้น)
"sms_body"- สตริงสำหรับ SMS
EXTRA_STREAMUriที่ชี้ไปยังรูปภาพหรือวิดีโอที่จะแนบ หากใช้การดำเนินการ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
<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 สำหรับการค้นหาในแอปแทน ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับ App Actions ของ 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 เพิ่มเติม
ตัวอย่างความตั้งใจ
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
<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
<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 ที่เฉพาะเจาะจงได้โดยทำดังนี้
ดูข้อมูลเพิ่มเติมได้ที่ออกคำสั่ง Shell