Intent ช่วยให้คุณเริ่มกิจกรรมในแอปอื่นได้โดยอธิบายการดำเนินการที่ต้องการทำ เช่น "ดูแผนที่" หรือ "ถ่ายภาพ" ในออบเจ็กต์ Intent
Intent ประเภทนี้เรียกว่า Intent โดยนัย เนื่องจากไม่ได้ระบุคอมโพเนนต์แอปที่จะเริ่มต้น แต่ระบุการดำเนินการและระบุข้อมูลบางส่วนที่จะใช้ดำเนินการ
เมื่อคุณโทรหา startActivity()
หรือstartActivityForResult()
จากนั้นส่ง Intent แบบไม่เจาะจงปลายทาง
แก้ปัญหา
Intent ของแอปที่สามารถจัดการ Intent และเริ่มต้น
Activity
ที่ตรงกัน หากมีแอปมากกว่า 1 แอป
ที่สามารถจัดการจุดประสงค์ได้ ระบบจะนำเสนอกล่องโต้ตอบเพื่อ
เลือกแอปที่จะใช้
หน้านี้อธิบายถึง Intent ที่ไม่ชัดหลายรายการที่คุณสามารถใช้เพื่อดำเนินการทั่วไป โดยจัดเรียงตามประเภทแอปที่จัดการ Intent ชิ้น จะแสดงวิธีสร้างความตั้งใจ ตัวกรองเพื่อโฆษณาความสามารถในการดำเนินการของแอป
ข้อควรระวัง: หากไม่มีแอปในอุปกรณ์ที่รับ Intent ที่ไม่ชัดได้ แอปจะขัดข้องเมื่อเรียกใช้ startActivity()
หากต้องการยืนยันก่อนว่ามีแอปที่จะรับ Intent ให้เรียกใช้ resolveActivity()
ในออบเจ็กต์ Intent
หากผลลัพธ์ไม่เป็นค่าว่าง มีค่าอย่างน้อย
แอปเดียวที่จัดการความตั้งใจได้ และโทรหา startActivity()
ได้อย่างปลอดภัย หากผลลัพธ์คือ
ไม่ใช้ Intent และหากเป็นไปได้ ให้ปิดใช้
ฟีเจอร์ที่เรียก Intent
หากคุณไม่คุ้นเคยกับวิธีสร้าง Intent หรือตัวกรอง Intent ให้อ่านIntent และ Intent ก่อน ตัวกรอง
หากต้องการทราบวิธีเริ่มการทำงานของ Intent ที่แสดงในหน้านี้จากการพัฒนาของคุณ โปรดดูยืนยัน Intent ด้วยการแก้ไขข้อบกพร่องของ Android บริดจ์
การสั่งงานด้วยเสียงของ Google
Google วอยซ์ การดำเนินการจะเริ่มการทำงานของ 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
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) } }
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
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) } }
public void startTimer(String message, int seconds) { Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
หากต้องการเรียกใช้ Intent ACTION_SET_TIMER
แอปของคุณต้องมีสิทธิ์ SET_ALARM
ดังนี้
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
ตัวอย่างตัวกรอง Intent
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
แสดงการเตือนทั้งหมด
หากต้องการแสดงรายการการปลุก ให้ใช้การดําเนินการ ACTION_SHOW_ALARMS
แม้ว่าจะมีแอปไม่มากนักที่เรียกใช้ Intent นี้ เนื่องจากแอประบบส่วนใหญ่ใช้ Intent นี้ แต่แอปใดก็ตามที่ทำงานแบบนาฬิกาปลุกก็สามารถใช้ตัวกรอง Intent นี้และตอบสนองด้วยการแสดงรายการการปลุกปัจจุบัน
หมายเหตุ: Intent นี้ใช้งานได้ ใน Android 4.4 (API ระดับ 19) ขึ้นไป
- การดำเนินการ
ACTION_SHOW_ALARMS
- Data URI
- ไม่มี
- ประเภท MIME
- ไม่มี
ตัวอย่างตัวกรอง Intent
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
ปฏิทิน
การเพิ่มกิจกรรมเป็นการดำเนินการทั่วไปสำหรับแอปปฏิทิน สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการนี้โดยใช้ ข้อมูลในหัวข้อต่อไปนี้
เพิ่มกิจกรรมในปฏิทิน
ในการเพิ่มกิจกรรมใหม่ลงในปฏิทินของผู้ใช้ ให้ใช้
ACTION_INSERT
การทำงาน และระบุ URI ข้อมูลโดยใช้
Events.CONTENT_URI
จากนั้นคุณสามารถระบุรายละเอียดต่างๆ ของกิจกรรม โดยใช้ส่วนเพิ่มเติมต่อไปนี้
- การดำเนินการ
ACTION_INSERT
- Data URI
Events.CONTENT_URI
- ประเภท MIME
"vnd.android.cursor.dir/event"
- พิเศษ
-
EXTRA_EVENT_ALL_DAY
- บูลีนที่ระบุว่าเป็นกิจกรรมตลอดทั้งวันหรือไม่
EXTRA_EVENT_BEGIN_TIME
- เวลาเริ่มต้นของเหตุการณ์ (มิลลิวินาทีตั้งแต่ Epoch)
EXTRA_EVENT_END_TIME
- เวลาสิ้นสุดของเหตุการณ์ (มิลลิวินาทีตั้งแต่ Epoch)
TITLE
- ชื่อกิจกรรม
DESCRIPTION
- คำอธิบายกิจกรรม
EVENT_LOCATION
- สถานที่จัดกิจกรรม
EXTRA_EMAIL
- รายการอีเมลที่คั่นด้วยคอมมาซึ่งระบุผู้ได้รับเชิญ
สามารถระบุรายละเอียดเหตุการณ์ได้อีกมากโดยใช้ค่าคงที่ที่ระบุไว้ใน
CalendarContract.EventsColumns
ชั้นเรียน
ตัวอย่าง Intent
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) } }
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
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. ... } }
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:
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. } }
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } catch (ActivityNotFoundException e) { // Display error state to the user. } } </section></div>
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ความตั้งใจนี้เพื่อถ่ายภาพ รวมถึง
วิธีสร้าง Uri
ที่เหมาะสมสำหรับตำแหน่งเอาต์พุต โปรดอ่าน
ถ่ายรูปหรือ
ถ่ายวิดีโอ
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
เมื่อจัดการ Intent นี้ ให้ตรวจหากิจกรรมส่วนเกินของ EXTRA_OUTPUT
ใน Intent
ที่เข้ามาใหม่ จากนั้นบันทึกรูปภาพหรือวิดีโอที่บันทึกไว้ที่
ตำแหน่งที่ระบุโดยพิเศษนั้น และเรียก setResult()
ด้วย Intent
ที่มีภาพขนาดย่อที่บีบอัดไว้ในพิเศษ
ชื่อ "data"
เริ่มแอปกล้องถ่ายรูปในโหมดภาพนิ่ง
หากต้องการเปิดแอปกล้องในโหมดภาพนิ่ง ให้ใช้การดำเนินการ INTENT_ACTION_STILL_IMAGE_CAMERA
- การดำเนินการ
INTENT_ACTION_STILL_IMAGE_CAMERA
- รูปแบบ URI ข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- เพิ่มเติม
- ไม่มี
ตัวอย่าง Intent
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. } }
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
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
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:
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. //... } }
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
ตัวอย่าง Intent
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. ... } } } }
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
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
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
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) } }
public void editContact(Uri contactUri, String email) { Intent intent = new Intent(Intent.ACTION_EDIT); intent.setData(contactUri); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขรายชื่อติดต่อได้ที่แก้ไขรายชื่อติดต่อโดยใช้ Intent
แทรกรายชื่อติดต่อ
หากต้องการแทรกรายชื่อติดต่อใหม่ ให้ใช้การดำเนินการ ACTION_INSERT
โดยระบุ Contacts.CONTENT_TYPE
เป็นประเภท MIME และใส่ข้อมูลติดต่อที่ทราบไว้ในส่วนเพิ่มเติมที่ระบุโดยค่าคงที่ใน ContactsContract.Intents.Insert
- การดำเนินการ
ACTION_INSERT
- รูปแบบ URI ข้อมูล
- ไม่มี
- ประเภท MIME
Contacts.CONTENT_TYPE
- เพิ่มเติม
- ส่วนเสริมอย่างน้อย 1 รายการที่กำหนดไว้ใน
ContactsContract.Intents.Insert
ตัวอย่าง Intent
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) } }
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
- อาร์เรย์สตริงของ "BCC" ทั้งหมด อีเมลของผู้รับ
Intent.EXTRA_SUBJECT
- สตริงที่มีเรื่องอีเมล
Intent.EXTRA_TEXT
- สตริงที่มีเนื้อหาของอีเมล
Intent.EXTRA_STREAM
Uri
ที่ชี้ไปที่ไฟล์แนบ หากใช้การดําเนินการACTION_SEND_MULTIPLE
แทน รายการนี้จะเป็นArrayList
ที่มีออบเจ็กต์Uri
หลายรายการ
ตัวอย่าง Intent
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) } }
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
หากคุณต้องการดูให้แน่ใจว่า Intent ของคุณได้รับการจัดการโดยแอปอีเมลเท่านั้น และไม่ใช่
ส่ง SMS หรือแอปโซเชียล จากนั้นใช้การดำเนินการ ACTION_SENDTO
และรวมรูปแบบข้อมูล "mailto:"
ดังที่แสดงในตัวอย่างต่อไปนี้
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) } }
public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // Only email apps handle this. intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
พื้นที่จัดเก็บไฟล์
ต่อไปนี้เป็นการดำเนินการทั่วไปสำหรับแอปพื้นที่เก็บข้อมูลไฟล์ รวมถึงข้อมูลที่จำเป็นในการสร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดำเนินการแต่ละรายการ
ดึงข้อมูลไฟล์บางประเภท
หากต้องการขอให้ผู้ใช้เลือกไฟล์ เช่น เอกสารหรือรูปภาพ แล้วส่งคืนข้อมูลอ้างอิงไปยัง
ในแอป ให้ใช้การดำเนินการ ACTION_GET_CONTENT
และระบุตามต้องการ
ประเภท MIME การอ้างอิงไฟล์ที่แสดงผลในแอปจะหายไปตามวงจรปัจจุบันของกิจกรรม ดังนั้นหากต้องการเข้าถึงในภายหลัง คุณต้องนําเข้าสําเนาที่อ่านได้ในภายหลัง
Intent นี้ยังช่วยให้ผู้ใช้สร้างไฟล์ใหม่ในกระบวนการได้อีกด้วย เช่น ผู้ใช้สามารถจับภาพใหม่ด้วยกล้องแทนที่จะเลือกรูปภาพที่มีอยู่
Intent ผลลัพธ์ที่ส่งไปยังเมธอด onActivityResult()
จะมีข้อมูลที่มี URI ที่ชี้ไปยังไฟล์
URI จะเป็นอะไรก็ได้ เช่น URI http:
, file:
URI หรือ content:
URI แต่ถ้าต้องการจำกัดไฟล์ที่เลือกได้ ให้มีเฉพาะไฟล์ที่สามารถเข้าถึงได้เท่านั้น
จากผู้ให้บริการเนื้อหา (URI content:
) และพร้อมใช้งานเป็นสตรีมไฟล์ด้วย
openFileDescriptor()
,
เพิ่ม
CATEGORY_OPENABLE
ให้เหมาะกับความตั้งใจของคุณ
ใน Android 4.3 (API ระดับ 18) ขึ้นไป
คุณยังให้ผู้ใช้เลือกหลายไฟล์ได้โดยการเพิ่ม
EXTRA_ALLOW_MULTIPLE
เป็น Intent แล้วตั้งค่าเป็น true
จากนั้นคุณจะเข้าถึงไฟล์ที่เลือกแต่ละรายการในClipData
ออบเจ็กต์ที่ getClipData()
แสดงผลได้
- การดำเนินการ
ACTION_GET_CONTENT
- รูปแบบ URI ข้อมูล
- ไม่มี
- ประเภท MIME
- ประเภท MIME ที่สอดคล้องกับประเภทไฟล์ที่ผู้ใช้ต้องเลือก
- พิเศษ
-
EXTRA_ALLOW_MULTIPLE
- บูลีนที่จะประกาศว่าผู้ใช้เลือกไฟล์ได้มากกว่า 1 ไฟล์พร้อมกันหรือไม่
EXTRA_LOCAL_ONLY
- บูลีนที่ประกาศว่าไฟล์ที่ส่งคืนต้องพร้อมใช้งานโดยตรงจาก อุปกรณ์ แทนที่จะต้องดาวน์โหลดจากบริการระยะไกล
- หมวดหมู่ (ไม่บังคับ)
-
CATEGORY_OPENABLE
- หากต้องการแสดงผลเฉพาะ "เปิดได้" ไฟล์ที่สามารถแสดงเป็นสตรีมไฟล์
ด้วย
openFileDescriptor()
ตัวอย่างความตั้งใจในการได้รูปภาพ
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. ... } }
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri. ... } }
ตัวอย่างตัวกรอง Intent เพื่อแสดงรูปภาพ
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
. --> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
เปิดไฟล์ประเภทที่ต้องการ
โดยใช้การดำเนินการ ACTION_GET_CONTENT
เมื่อทำงานใน Android แทนการเรียกข้อมูลสำเนาของไฟล์ที่คุณต้องนำเข้าไปยังแอป
4.4 ขึ้นไป คุณสามารถขอเปิดไฟล์ที่แอปอื่นจัดการโดย
โดยใช้การดำเนินการ ACTION_OPEN_DOCUMENT
และระบุประเภท MIME
หากต้องการให้ผู้ใช้สร้างเอกสารใหม่ที่แอปเขียนได้ด้วย ให้ใช้การดำเนินการ ACTION_CREATE_DOCUMENT
แทน
ตัวอย่างเช่น แทนที่จะเลือกจากเอกสาร PDF ที่มีอยู่ ACTION_CREATE_DOCUMENT
Intent จะช่วยให้ผู้ใช้เลือกตำแหน่งที่ต้องการสร้างเอกสารใหม่ได้ เช่น ภายในแอปอื่นที่จัดการพื้นที่เก็บข้อมูลของเอกสาร จากนั้นแอปจะได้รับตำแหน่ง URI ของตำแหน่ง
สามารถเขียนเอกสารใหม่
ขณะที่ความตั้งใจส่งไปถึง 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()
ตัวอย่างความตั้งใจในการได้รูปภาพ
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. ... } }
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri. ... } }
แอปของบุคคลที่สามไม่สามารถตอบสนองต่อความตั้งใจด้วย
การดำเนินการ ACTION_OPEN_DOCUMENT
รายการ แต่จะได้รับข้อมูลนี้
และแสดงไฟล์ทั้งหมดที่ใช้ได้จากแอปต่างๆ ในอินเทอร์เฟซผู้ใช้แบบรวม
หากต้องการแสดงไฟล์ของแอปใน UI นี้และอนุญาตให้แอปอื่นๆ เปิดไฟล์เหล่านั้น คุณต้องติดตั้งใช้งาน DocumentsProvider
และใส่ตัวกรอง Intent สำหรับ PROVIDER_INTERFACE
("android.content.action.DOCUMENTS_PROVIDER"
) ดังที่แสดงในตัวอย่างต่อไปนี้
<provider ... android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider>
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีทำให้ไฟล์ที่แอปจัดการสามารถเปิดจากแอปอื่นๆ ได้ที่เปิดไฟล์โดยใช้เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล
การกระทำเกี่ยวกับสถานที่
การโทรหารถเป็นการกระทำเกี่ยวกับสถานที่ที่พบบ่อย สร้างตัวกรอง Intent เพื่อโฆษณา สามารถดำเนินการนี้ได้โดยใช้ข้อมูลในส่วนต่อไปนี้
โทรเรียกรถ
หากต้องการเรียกแท็กซี่ ให้ใช้
ACTION_RESERVE_TAXI_RESERVATION
การดำเนินการ
หมายเหตุ: แอปต้องขอการยืนยันจากผู้ใช้ ก่อนดำเนินการนี้
- การดำเนินการ
ACTION_RESERVE_TAXI_RESERVATION
- Data URI
- ไม่มี
- ประเภท MIME
- ไม่มี
- เพิ่มเติม
- ไม่มี
ตัวอย่าง Intent
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ตัวอย่างตัวกรอง Intent:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
แผนที่
การแสดงตำแหน่งบนแผนที่เป็นการดำเนินการทั่วไปของแอปแผนที่ สร้างตัวกรอง Intent เพื่อโฆษณาความสามารถของแอปในการดําเนินการนี้โดยใช้ข้อมูลในส่วนต่อไปนี้
แสดงตำแหน่งบนแผนที่
หากต้องการเปิดแผนที่ ให้ใช้การทำงาน ACTION_VIEW
และระบุ
ข้อมูลตำแหน่งในข้อมูลความตั้งใจด้วยรูปแบบใดรูปแบบหนึ่งต่อไปนี้
- การดำเนินการ
ACTION_VIEW
- รูปแบบ URI ของข้อมูล
-
geo:latitude,longitude
- แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุ
ตัวอย่าง:
"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
- แสดงแผนที่ตามลองจิจูดและละติจูดที่ระบุในระดับการซูมที่กำหนด ระดับการซูม
1 แสดงโลกทั้งใบโดยมีศูนย์กลางอยู่ที่ละติจูด, lng ที่ระบุ สูงสุด
ระดับการซูม (ใกล้สุด) คือ 23
ตัวอย่าง:
"geo:47.6,-122.3?z=11"
geo:0,0?q=lat,lng(label)
- แสดงแผนที่ที่ลองจิจูดและละติจูดที่ระบุพร้อมป้ายกำกับสตริง
ตัวอย่าง:
"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address
- แสดงตำแหน่งสำหรับ "ที่อยู่ของฉัน" ซึ่งอาจเป็นที่อยู่หรือคำค้นหาตำแหน่งที่เฉพาะเจาะจง
ตัวอย่าง:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
หมายเหตุ: สตริงทั้งหมดที่ส่งผ่าน URI ของ
geo
จะต้อง มีการเข้ารหัส ตัวอย่างเช่น สตริง1st & Pike, Seattle
จะกลายเป็น1st%20%26%20Pike%2C%20Seattle
ช่องว่างในสตริงมีการเข้ารหัสด้วย%20
หรือแทนที่ด้วยเครื่องหมายบวก (+
)
- ประเภท MIME
- ไม่มี
ตัวอย่าง Intent:
fun showMap(geoLocation: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = geoLocation } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
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
fun playMedia(file: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = file } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
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
เพิ่มเติม ซึ่งระบุโหมดการค้นหาที่ต้องการ ตัวอย่างเช่น โหมดการค้นหาสามารถระบุได้ว่าเป็นการค้นหาชื่อศิลปินหรือชื่อเพลง
- การดำเนินการ
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- รูปแบบ URI ข้อมูล
- ไม่มี
- ประเภท MIME
- ไม่มี
- พิเศษ
-
MediaStore.EXTRA_MEDIA_FOCUS
(ต้องระบุ)-
ระบุโหมดการค้นหาว่าผู้ใช้กําลังมองหาศิลปิน อัลบั้ม เพลง หรือเพลย์ลิสต์ที่เฉพาะเจาะจงหรือไม่ โหมดการค้นหาส่วนใหญ่จะมีฟีเจอร์เพิ่มเติม เช่น หากผู้ใช้สนใจฟังเพลงบางเพลง เจตนาอาจมีค่าเพิ่มเติมอีก 3 รายการ ได้แก่ ชื่อเพลง ศิลปิน และอัลบั้ม เจตนานี้รองรับโหมดการค้นหาต่อไปนี้สําหรับค่า
EXTRA_MEDIA_FOCUS
แต่ละค่าAny -
"vnd.android.cursor.item/*"
-
เปิดเพลง แอปที่ใช้รับจะเปิดเพลงตามตัวเลือกอัจฉริยะ เช่น เป็นเพลย์ลิสต์ล่าสุดที่ผู้ใช้ฟัง
ฟีเจอร์เพิ่มเติม
QUERY
(ต้องระบุ): สตริงว่าง ส่วนเพิ่มเติมนี้เป็นแบบ ที่ระบุเพื่อความเข้ากันได้แบบย้อนหลัง แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาสามารถ ประมวลผลความตั้งใจนี้เป็นการค้นหาที่ไม่มีโครงสร้าง
ไม่เป็นโครงสร้าง -
"vnd.android.cursor.item/*"
-
เปิดเพลง อัลบั้ม หรือแนวเพลงที่ต้องการจากคำค้นหาที่ไม่มีโครงสร้าง แอปสร้างได้ ความตั้งใจในโหมดค้นหานี้ เมื่อไม่สามารถระบุประเภทเนื้อหาที่ผู้ใช้ต้องการได้ ฟัง ใช้โหมดการค้นหาที่เฉพาะเจาะจงมากขึ้นเมื่อเป็นไปได้
ฟีเจอร์เพิ่มเติม
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
(ต้องระบุ): สตริงที่มีชุดค่าผสมของอัลบั้มหรือศิลปิน ส่วนเกินนี้จะมีให้ไว้ก่อนหน้าเสมอ ความสามารถในการใช้งานร่วมกัน แอปที่มีอยู่ซึ่งไม่รู้จักโหมดการค้นหาสามารถประมวลผลจุดประสงค์นี้ในฐานะ แบบไม่มีโครงสร้าง
เพลง -
"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:
หากผู้ใช้ต้องการฟังเพลงจากศิลปินที่เจาะจง แอปค้นหาอาจสร้าง ความตั้งใจต่อไปนี้
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) } }
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
ขาเข้าเพื่อระบุโหมดการค้นหา เมื่อกิจกรรมระบุโหมดการค้นหาแล้ว ให้อ่านค่าของข้อมูลเพิ่มเติมสําหรับโหมดการค้นหานั้นๆ
เมื่อใช้ข้อมูลนี้ แอปจะทำการค้นหาภายในพื้นที่โฆษณาเพื่อเล่นเนื้อหาที่ตรงกับคำค้นหาได้ ตัวอย่างนี้จะแสดงในตัวอย่างต่อไปนี้
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) } } } }
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
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) } }
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:
fun dialPhoneNumber(phoneNumber: String) { val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
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
fun searchWeb(query: String) { val intent = Intent(Intent.ACTION_WEB_SEARCH).apply { putExtra(SearchManager.QUERY, query) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
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:
fun openWifiSettings() { val intent = Intent(Settings.ACTION_WIFI_SETTINGS) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
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:
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) } }
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:"
ดังที่แสดงในตัวอย่างต่อไปนี้
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) } }
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:
fun openWebPage(url: String) { val webpage: Uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, webpage) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
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 ที่เฉพาะเจาะจงโดยทำ
ดังต่อไปนี้
ดูข้อมูลเพิ่มเติมได้ที่ออกคำสั่งเชลล์