אינטנט מאפשר לכם להתחיל פעילות באפליקציה אחרת על ידי תיאור של פעולה שאתם רוצים לבצע, כמו 'הצגת מפה' או 'צילום תמונה', באובייקט Intent
. סוג ה-Intent הזה נקרא Intent משתמע כי הוא לא מציין את רכיב האפליקציה להפעלה, אלא מציין פעולה ומספק נתונים לביצוע הפעולה.
כשמתקשרים אל startActivity()
או אל startActivityForResult()
ומעבירים לו כוונה משתמעת, המערכת מפענחת את הכוונה לאפליקציה שיכולה לטפל בכוונה ומתחילה את Activity
המתאים שלה. אם יש יותר מאפליקציה אחת שיכולה לטפל ב-Intent, המערכת מציגה למשתמש תיבת דו-שיח שבה הוא יכול לבחור באיזו אפליקציה להשתמש.
בדף הזה מתוארים כמה intents מרומזים שאפשר להשתמש בהם כדי לבצע פעולות נפוצות, לפי סוג האפליקציה שמטפלת ב-intent. בכל קטע מוסבר גם איך ליצור מסנן כוונות כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה.
זהירות: אם אין במכשיר אפליקציות שיכולות לקבל כוונה משתמעת, האפליקציה קורסת כשהיא קוראת ל-startActivity()
. כדי לוודא קודם שאפליקציה קיימת כדי לקבל את הכוונה, קוראים ל-resolveActivity()
באובייקט Intent
. אם התוצאה היא לא null, יש לפחות אפליקציה אחת שיכולה לטפל ב-Intent, ואפשר לקרוא ל-startActivity()
. אם התוצאה היא null, לא משתמשים ב-intent, ואם אפשר, משביתים את התכונה שמפעילה את ה-intent.
אם אתם לא יודעים איך ליצור כוונות או מסנני כוונות, כדאי קודם לקרוא את המאמר כוונות ומסנני כוונות.
כדי ללמוד איך להפעיל את כוונות המשתמש שמופיעות בדף הזה ממארח הפיתוח, אפשר לעיין בקטע אימות כוונות המשתמש באמצעות Android Debug Bridge.
פעולות קוליות ב-Google Voice
Google Voice Actions מפעיל חלק מה-Intents שמופיעים בדף הזה בתגובה לפקודות קוליות. מידע נוסף זמין במאמר תחילת העבודה עם פעולות קוליות במערכת.
שעון מעורר
בהמשך מפורטות פעולות נפוצות באפליקציות של שעון מעורר, כולל המידע שדרוש ליצירת מסנן Intent לפרסום היכולת של האפליקציה לבצע כל פעולה.
יצירת שעון מעורר
כדי ליצור שעון מעורר חדש, משתמשים בפעולה ACTION_SET_ALARM
ומציינים פרטים של השעון המעורר, כמו השעה וההודעה, באמצעות התוספים הבאים.
הערה: רק השעה, הדקות ותוספות ההודעה זמינות ב-Android מגרסה 2.3 (רמת API 9) ומטה. התוספות האחרות זמינות בגרסאות מתקדמות יותר של הפלטפורמה.
- פעולה
ACTION_SET_ALARM
- URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
-
EXTRA_HOUR
- השעה של ההתראה.
EXTRA_MINUTES
- מספר הדקות של ההתראה.
EXTRA_MESSAGE
- הודעה מותאמת אישית לזיהוי האזעקה.
EXTRA_DAYS
- מחרוזת
ArrayList
שכוללת את כל ימי השבוע שבהם השעון המעורר הזה חוזר. כל יום צריך להיות מוצהר כמספר שלם מהמחלקהCalendar
, כמוMONDAY
.אם רוצים להגדיר התראה חד-פעמית, לא צריך לציין את התוספת הזו.
EXTRA_RINGTONE
- URI של
content:
רינגטון לשימוש עם ההתראה, אוVALUE_RINGTONE_SILENT
אם לא רוצים רינגטון.כדי להשתמש ברינגטון ברירת המחדל, לא מציינים את התוסף הזה.
EXTRA_VIBRATE
- ערך בוליאני שקובע אם השעון ירטוט כשהשעון המעורר יצלצל.
EXTRA_SKIP_UI
- ערך בוליאני שמציין אם האפליקציה שמגיבה צריכה לדלג על ממשק המשתמש שלה כשמגדירים את ההתראה. אם הערך הוא True, האפליקציה צריכה לדלג על ממשק המשתמש של האישור ולהגדיר את ההתראה שצוינה.
דוגמה לכוונת רכישה:
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" />
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
יצירת טיימר
כדי ליצור טיימר לספירה לאחור, משתמשים בפעולה ACTION_SET_TIMER
ומציינים את פרטי הטיימר, כמו משך הזמן, באמצעות התוספים הבאים.
הערה: האינטנט הזה זמין ב-Android מגרסה 4.4 (רמת API 19) ואילך.
- פעולה
ACTION_SET_TIMER
- URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
-
EXTRA_LENGTH
- משך הטיימר בשניות.
EXTRA_MESSAGE
- הודעה מותאמת אישית לזיהוי הטיימר.
EXTRA_SKIP_UI
- ערך בוליאני שמציין אם האפליקציה שמגיבה צריכה לדלג על ממשק המשתמש שלה כשהיא מגדירה את הטיימר. אם הערך הוא true, האפליקציה צריכה לדלג על ממשק המשתמש לאישור ולהתחיל את הטיימר שצוין.
דוגמה לכוונת רכישה:
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" />
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
הצג את כל ההתראות
כדי להציג את רשימת האזעקות, משתמשים בפעולה ACTION_SHOW_ALARMS
.
לא הרבה אפליקציות מפעילות את הכוונה הזו, כי היא משמשת בעיקר אפליקציות מערכת. עם זאת, כל אפליקציה שמתפקדת כשעון מעורר יכולה להטמיע את מסנן הכוונות הזה ולהגיב בהצגת רשימת ההתראות הנוכחיות.
הערה: האינטנט הזה זמין ב-Android מגרסה 4.4 (רמת API 19) ואילך.
- פעולה
ACTION_SHOW_ALARMS
- URI של נתונים
- ללא
- סוג MIME
- ללא
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
יומן
הוספת אירוע היא פעולה נפוצה באפליקציות יומן. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן כוונות באמצעות המידע שבקטע הבא.
הוספת אירוע ליומן
כדי להוסיף אירוע חדש ליומן של המשתמש, משתמשים ב-ACTION_INSERT
action ומציינים את ה-URI של הנתונים באמצעות Events.CONTENT_URI
.
לאחר מכן אפשר לציין פרטים שונים של האירוע באמצעות התוספים הבאים.
- פעולה
ACTION_INSERT
- URI של נתונים
Events.CONTENT_URI
- סוג MIME
"vnd.android.cursor.dir/event"
- תוספות
-
EXTRA_EVENT_ALL_DAY
- ערך בוליאני שמציין אם מדובר באירוע שנמשך כל היום.
EXTRA_EVENT_BEGIN_TIME
- שעת ההתחלה של האירוע (במילישניות מאז תחילת התקופה של זמן מערכת).
EXTRA_EVENT_END_TIME
- שעת הסיום של האירוע (אלפיות שנייה מאז תחילת התקופה של זמן מערכת).
TITLE
- שם האירוע.
DESCRIPTION
- תיאור האירוע.
EVENT_LOCATION
- המיקום של האירוע.
EXTRA_EMAIL
- רשימה של כתובות אימייל שמופרדות בפסיקים, שמציינת את המוזמנים.
אפשר לציין עוד הרבה פרטים על האירוע באמצעות הקבועים שמוגדרים במחלקה
CalendarContract.EventsColumns
.
דוגמה לכוונת רכישה:
Kotlin
fun addEvent(title: String, location: String, begin: Long, end: Long) { val intent = Intent(Intent.ACTION_INSERT).apply { data = Events.CONTENT_URI putExtra(Events.TITLE, title) putExtra(Events.EVENT_LOCATION, location) putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void addEvent(String title, String location, long begin, long end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="android.intent.action.INSERT" /> <data android:mimeType="vnd.android.cursor.dir/event" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
מצלמה
אלה פעולות נפוצות באפליקציות מצלמה, כולל המידע שדרוש ליצירת מסנן Intent כדי לפרסם את היכולת של האפליקציה לבצע כל פעולה.
צילום תמונה או סרטון והחזרתם
כדי לפתוח אפליקציית מצלמה ולקבל את התמונה או הסרטון שנוצרו, משתמשים בפעולה ACTION_IMAGE_CAPTURE
או ACTION_VIDEO_CAPTURE
. צריך גם לציין את מיקום ה-URI שבו רוצים שהמצלמה תשמור את התמונה או הסרטון, ב-EXTRA_OUTPUT
extra.
- פעולה
ACTION_IMAGE_CAPTURE
או
ACTION_VIDEO_CAPTURE
- סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
-
EXTRA_OUTPUT
- המיקום של ה-URI שבו אפליקציית המצלמה שומרת את התמונה או את קובץ הסרטון (כאובייקט
Uri
).
כשאפליקציית המצלמה מחזירה בהצלחה את המיקוד לפעילות שלכם – במילים אחרות, האפליקציה מקבלת את הקריאה החוזרת onActivityResult()
– אתם יכולים לגשת לתמונה או לסרטון ב-URI שציינתם עם הערך EXTRA_OUTPUT
.
הערה: כשמשתמשים ב-ACTION_IMAGE_CAPTURE
כדי לצלם תמונה, יכול להיות שהמצלמה תחזיר גם עותק מוקטן או תמונה ממוזערת של התמונה בתוצאה Intent
, שנשמרת כ-Bitmap
בשדה נוסף בשם "data"
.
דוגמה לכוונת רכישה:
Kotlin
const val REQUEST_IMAGE_CAPTURE = 1 val locationForPhotos: Uri = ... fun capturePhoto(targetFilename: String) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)) } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") // Do other work with full size photo saved in locationForPhotos. ... } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri locationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelableExtra("data"); // Do other work with full size photo saved in locationForPhotos. ... } }
כדי לעשות את זה כשעובדים על Android 12 (רמת API 31) ומעלה, אפשר להיעזר בדוגמה הבאה של Intent.
דוגמה לכוונת רכישה:
Kotlin
val REQUEST_IMAGE_CAPTURE = 1 private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } catch (ActivityNotFoundException e) { // Display error state to the user. } } </section></div>
מידע נוסף על השימוש ב-Intent הזה לצילום תמונה, כולל איך ליצור Uri
מתאים למיקום הפלט, זמין במאמרים צילום תמונות או צילום סרטונים.
דוגמה למסנן כוונות:
<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 הנכנס Intent
, ואז לשמור את התמונה או הסרטון שצולמו במיקום שצוין בתוסף הזה, ולהתקשר אל setResult()
עם Intent
שכולל תמונה ממוזערת דחוסה בתוסף בשם "data"
.
הפעלת אפליקציית מצלמה במצב תמונת סטילס
כדי לפתוח אפליקציית מצלמה במצב תמונה סטטית, משתמשים בפעולה INTENT_ACTION_STILL_IMAGE_CAMERA
.
- פעולה
INTENT_ACTION_STILL_IMAGE_CAMERA
- סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
- ללא
דוגמה לכוונת רכישה:
Kotlin
private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
הפעלת אפליקציית מצלמה במצב וידאו
כדי לפתוח אפליקציית מצלמה במצב וידאו, משתמשים בפעולה INTENT_ACTION_VIDEO_CAMERA
.
- פעולה
INTENT_ACTION_VIDEO_CAMERA
- סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
- ללא
דוגמה לכוונת רכישה:
Kotlin
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
Java
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
אפליקציית אנשי הקשר
אלה פעולות נפוצות באפליקציות לניהול אנשי קשר, כולל המידע שצריך כדי ליצור מסנן כוונות לפרסום היכולת של האפליקציה לבצע כל פעולה.
בחירת איש קשר
כדי שהמשתמש יבחר איש קשר ויעניק לאפליקציה שלכם גישה לכל הפרטים ליצירת קשר, צריך להשתמש בפעולה ACTION_PICK
ולציין את סוג ה-MIME כ-Contacts.CONTENT_TYPE
.
התוצאה Intent
שמועברת אל הקריאה החוזרת onActivityResult()
מכילה את כתובת ה-URI content:
שמפנה לאיש הקשר שנבחר. התגובה מעניקה לאפליקציה הרשאות זמניות לקרוא את איש הקשר הזה באמצעות Contacts Provider API, גם אם האפליקציה לא כוללת את ההרשאה READ_CONTACTS
.
כדאי לדעת: אם אתם צריכים לגשת רק לפרט מסוים של איש הקשר, כמו מספר טלפון או כתובת אימייל, כדאי לעיין בקטע הבא כדי ללמוד איך לבחור נתונים ספציפיים של איש הקשר.
- פעולה
ACTION_PICK
- סכמת URI של נתונים
- ללא
- סוג MIME
Contacts.CONTENT_TYPE
דוגמה לכוונת רכישה:
Kotlin
const val REQUEST_SELECT_CONTACT = 1 fun selectContact() { val intent = Intent(Intent.ACTION_PICK).apply { type = ContactsContract.Contacts.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { val contactUri: Uri = data.data // Do something with the selected contact at contactUri. //... } }
Java
static final int REQUEST_SELECT_CONTACT = 1; public void selectContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); // Do something with the selected contact at contactUri. ... } }
כדי לקבל מידע על אחזור פרטים ליצירת קשר אחרי שיש לכם את ה-URI של איש הקשר, אפשר לקרוא את המאמר אחזור פרטים של איש קשר.
כשמאחזרים את ה-URI של איש הקשר באמצעות ה-Intent הזה, בדרך כלל לא צריך את ההרשאה READ_CONTACTS
לקרוא פרטים בסיסיים של איש הקשר, כמו השם לתצוגה והאם איש הקשר מסומן בכוכב. עם זאת, אם אתם מנסים לקרוא נתונים ספציפיים יותר על איש קשר מסוים, כמו מספר הטלפון או כתובת האימייל שלו, אתם צריכים את הרשאת READ_CONTACTS
.
בחירת נתונים ספציפיים ליצירת קשר
כדי שהמשתמש יבחר פרט ספציפי מאיש קשר, כמו מספר טלפון, כתובת אימייל או סוג נתונים אחר, משתמשים בפעולה ACTION_PICK
ומציינים את סוג ה-MIME לאחד מסוגי התוכן הבאים, כמו CommonDataKinds.Phone.CONTENT_TYPE
כדי לקבל את מספר הטלפון של איש הקשר.
הערה: במקרים רבים, האפליקציה צריכה את ההרשאה READ_CONTACTS
כדי להציג מידע ספציפי על איש קשר מסוים.
אם אתם צריכים לאחזר רק סוג אחד של נתונים מאנשי קשר, השיטה הזו עם המחלקות CONTENT_TYPE
from
ContactsContract.CommonDataKinds
יעילה יותר משימוש ב-Contacts.CONTENT_TYPE
, כמו שמוצג בקטע הקודם. התוצאה מספקת לכם גישה ישירה לנתונים הרצויים בלי שתצטרכו להריץ שאילתה מורכבת יותר אל ספק אנשי הקשר.
התוצאה Intent
שמועברת לקריאה החוזרת onActivityResult()
מכילה את ה-URI content:
שמפנה לנתוני איש הקשר שנבחרו. התגובה מעניקה לאפליקציה הרשאות זמניות לקרוא את נתוני אנשי הקשר האלה, גם אם האפליקציה לא כוללת את ההרשאה READ_CONTACTS
.
- פעולה
ACTION_PICK
- סכמת URI של נתונים
- ללא
- סוג MIME
-
CommonDataKinds.Phone.CONTENT_TYPE
- בוחרים איש קשר עם מספר טלפון.
CommonDataKinds.Email.CONTENT_TYPE
- בוחרים מתוך אנשי הקשר שיש להם כתובת אימייל.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
- בוחרים מתוך אנשי הקשר עם כתובת.
או אחד מתוך הרבה ערכים אחרים של
CONTENT_TYPE
בקטעContactsContract
.
דוגמה לכוונת רכישה:
Kotlin
const val REQUEST_SELECT_PHONE_NUMBER = 1 fun selectContact() { // Start an activity for the user to pick a phone number from contacts. val intent = Intent(Intent.ACTION_PICK).apply { type = CommonDataKinds.Phone.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) { // Get the URI and query the content provider for the phone number. val contactUri: Uri = data.data val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER) contentResolver.query(contactUri, projection, null, null, null).use { cursor -> // If the cursor returned is valid, get the phone number. if (cursor.moveToFirst()) { val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER) val number = cursor.getString(numberIndex) // Do something with the phone number. ... } } } }
Java
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // Start an activity for the user to pick a phone number from contacts. Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { // Get the URI and query the content provider for the phone number. Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // If the cursor returned is valid, get the phone number. if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // Do something with the phone number. //... } } }
הצגת איש קשר
כדי להציג את הפרטים של איש קשר מוכר, משתמשים בפעולה ACTION_VIEW
ומציינים את איש הקשר באמצעות URI של content:
כנתוני הכוונה.
יש שתי דרכים עיקריות לאחזר את ה-URI של איש הקשר:
- משתמשים ב-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:
כנתוני הכוונה, וכוללים פרטים מוכרים ליצירת קשר בתוספים שצוינו על ידי קבועים ב-ContactsContract.Intents.Insert
.
יש שתי דרכים עיקריות לאחזר את ה-URI של איש הקשר בפעם הראשונה:
- משתמשים ב-URI של איש הקשר שמוחזר על ידי הפעולה
ACTION_PICK
שמוצגת בקטע הקודם. הגישה הזו לא דורשת הרשאות לאפליקציה. - אפשר לגשת ישירות לרשימה של כל אנשי הקשר, כמו שמתואר במאמר איך מאחזרים רשימה של אנשי קשר. הגישה הזו דורשת את ההרשאה
READ_CONTACTS
.
- פעולה
ACTION_EDIT
- סכמת URI של נתונים
content:<URI>
- סוג MIME
- הסוג נגזר מכתובת ה-URI של איש הקשר.
- תוספות
- אחד או יותר מהתוספים שהוגדרו ב-
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); } }
הוספה של איש קשר
כדי להוסיף איש קשר חדש, משתמשים בפעולה ACTION_INSERT
, מציינים את Contacts.CONTENT_TYPE
כסוג ה-MIME וכוללים את פרטי איש הקשר הידועים בתוספים שצוינו על ידי קבועים ב-ContactsContract.Intents.Insert
.
- פעולה
ACTION_INSERT
- סכמת URI של נתונים
- ללא
- סוג MIME
Contacts.CONTENT_TYPE
- תוספות
- אחד או יותר מהתוספים שהוגדרו ב-
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); } }
מידע נוסף על הוספת אנשי קשר זמין במאמר שינוי אנשי קשר באמצעות כוונות.
אימייל
יצירת אימייל עם קבצים מצורפים אופציונליים היא פעולה נפוצה באפליקציות אימייל. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן כוונות באמצעות המידע שבקטע הבא.
איך כותבים אימייל עם קבצים מצורפים אופציונליים
כדי לכתוב אימייל, משתמשים באחת מהפעולות הבאות בהתאם לשאלה אם רוצים לצרף קבצים או לא, וכוללים את פרטי האימייל כמו הנמען והנושא באמצעות המקשים הנוספים שמופיעים ברשימה.
- פעולה
ACTION_SENDTO
(אם אין קובץ מצורף) או
ACTION_SEND
(אם יש קובץ מצורף אחד) או
ACTION_SEND_MULTIPLE
(אם יש כמה קבצים מצורפים)- סכמת URI של נתונים
- ללא
- סוג MIME
-
"text/plain"
"*/*"
- תוספות
-
Intent.EXTRA_EMAIL
- מערך מחרוזות של כל כתובות האימייל של הנמענים בשדה 'אל'.
Intent.EXTRA_CC
- מערך מחרוזות של כל כתובות האימייל של הנמענים בעותק.
Intent.EXTRA_BCC
- מערך מחרוזות של כל כתובות האימייל של הנמענים ב'עותק מוסתר'.
Intent.EXTRA_SUBJECT
- מחרוזת עם נושא האימייל.
Intent.EXTRA_TEXT
- מחרוזת עם תוכן האימייל.
Intent.EXTRA_STREAM
Uri
שמפנה לקובץ המצורף. אם משתמשים בפעולהACTION_SEND_MULTIPLE
, במקום זאת מדובר ב-ArrayList
שמכיל כמה אובייקטים מסוגUri
.
דוגמה לכוונת רכישה:
Kotlin
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "*/*" putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
אם רוצים לוודא שהכוונה תטופל רק על ידי אפליקציית אימייל, ולא על ידי אפליקציית הודעות טקסט או אפליקציה חברתית, צריך להשתמש ב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); } }
דוגמה למסנן כוונות:
<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>
אחסון קבצים
בהמשך מפורטות פעולות נפוצות באפליקציות לאחסון קבצים, כולל המידע שצריך כדי ליצור מסנן כוונות לפרסום היכולת של האפליקציה לבצע כל פעולה.
אחזור של סוג קובץ ספציפי
כדי לבקש מהמשתמש לבחור קובץ כמו מסמך או תמונה ולהחזיר הפניה לאפליקציה שלכם, משתמשים בפעולה ACTION_GET_CONTENT
ומציינים את סוג ה-MIME הרצוי. הפניה לקובץ שמוחזרת לאפליקציה היא זמנית למחזור החיים הנוכחי של הפעילות, ולכן אם רוצים לגשת אליה מאוחר יותר, צריך לייבא עותק שאפשר לקרוא מאוחר יותר.
הכוונה הזו מאפשרת למשתמש גם ליצור קובץ חדש בתהליך. לדוגמה, במקום לבחור תמונה קיימת, המשתמש יכול לצלם תמונה חדשה עם המצלמה.
הכוונה של התוצאה שמועברת אל ה-method onActivityResult()
כוללת נתונים עם URI שמפנה אל הקובץ.
ה-URI יכול להיות כל דבר, כמו URI של http:
, URI של file:
או URI של content:
. עם זאת, אם רוצים להגביל את הקבצים שאפשר לבחור רק לקבצים שאפשר לגשת אליהם מספק תוכן (URI content:
) ושזמינים כסטרימינג של קבצים עם openFileDescriptor()
, צריך להוסיף את הקטגוריה CATEGORY_OPENABLE
ל-Intent.
ב-Android מגרסה 4.3 (רמת API 18) ואילך, אפשר גם לאפשר למשתמש לבחור כמה קבצים על ידי הוספת EXTRA_ALLOW_MULTIPLE
ל-Intent, עם הערך true
.
אחר כך תוכלו לגשת לכל אחד מהקבצים שנבחרו בClipData
אובייקט שמוחזר על ידי getClipData()
.
- פעולה
ACTION_GET_CONTENT
- סכמת URI של נתונים
- ללא
- סוג MIME
- סוג ה-MIME שמתאים לסוג הקובץ שהמשתמש צריך לבחור.
- תוספות
-
EXTRA_ALLOW_MULTIPLE
- ערך בוליאני שקובע אם המשתמש יכול לבחור יותר מקובץ אחד בכל פעם.
EXTRA_LOCAL_ONLY
- ערך בוליאני שמצהיר אם הקובץ שמוחזר צריך להיות זמין ישירות מהמכשיר, במקום לדרוש הורדה משירות מרוחק.
- קטגוריה (אופציונלי)
-
CATEGORY_OPENABLE
- כדי להחזיר רק קבצים שאפשר לפתוח ושניתן לייצג כזרם קבצים
עם
openFileDescriptor()
.
דוגמה לכוונת משתמש לקבל תמונה:
Kotlin
const val REQUEST_IMAGE_GET = 1 fun selectImage() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") val fullPhotoUri: Uri = data.data // Do work with photo saved at fullPhotoUri. ... } }
Java
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri. ... } }
דוגמה למסנן כוונות להחזרת תמונה:
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
. --> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
פתיחה של סוג מסוים של קובץ
במקום לאחזר עותק של קובץ שצריך לייבא לאפליקציה, באמצעות הפעולה ACTION_GET_CONTENT
, כשמריצים ב-Android 4.4 ואילך, אפשר במקום זאת לבקש לפתוח קובץ שמנוהל על ידי אפליקציה אחרת באמצעות הפעולה ACTION_OPEN_DOCUMENT
וציון סוג MIME.
כדי לאפשר למשתמש גם ליצור מסמך חדש שהאפליקציה יכולה לכתוב בו, צריך להשתמש בפעולה ACTION_CREATE_DOCUMENT
.
לדוגמה, במקום לבחור מתוך מסמכי PDF קיימים, הכוונה ACTION_CREATE_DOCUMENT
מאפשרת למשתמשים לבחור איפה הם רוצים ליצור מסמך חדש, למשל באפליקציה אחרת שמנהלת את האחסון של המסמך. האפליקציה מקבלת את מיקום ה-URI שבו היא יכולה לכתוב את המסמך החדש.
בעוד שהכוונה שמועברת לשיטה onActivityResult()
מפעולת ACTION_GET_CONTENT
עשויה להחזיר URI מכל סוג, כוונת התוצאה מ-ACTION_OPEN_DOCUMENT
ו-ACTION_CREATE_DOCUMENT
תמיד מציינת את הקובץ שנבחר כ-URI של content:
שנתמך על ידי DocumentsProvider
. אפשר לפתוח את הקובץ באמצעות openFileDescriptor()
ולשאול שאילתות לגבי הפרטים שלו באמצעות עמודות מ-DocumentsContract.Document
.
ה-URI שמוחזר מעניק לאפליקציה גישת קריאה לקובץ לטווח ארוך, ואולי גם גישת כתיבה. הפעולה ACTION_OPEN_DOCUMENT
שימושית במיוחד כשרוצים לקרוא קובץ קיים בלי ליצור עותק שלו באפליקציה, או כשרוצים לפתוח ולערוך קובץ במקום.
אפשר גם לאפשר למשתמש לבחור כמה קבצים על ידי הוספת EXTRA_ALLOW_MULTIPLE
ל-Intent, שמוגדר ל-true
.
אם המשתמש בוחר רק פריט אחד, אפשר לאחזר את הפריט מ-getData()
.
אם המשתמש בוחר יותר מפריט אחד, הפונקציה getData()
מחזירה null, ובמקום זאת צריך לאחזר כל פריט מאובייקט ClipData
שמוחזר על ידי getClipData()
.
הערה: בכוונת השימוש חובה לציין סוג MIME וחובה להצהיר על הקטגוריה CATEGORY_OPENABLE
. אם צריך, אפשר לציין יותר מסוג MIME אחד על ידי הוספת מערך של סוגי MIME עם EXTRA_MIME_TYPES
extra. אם עושים זאת, צריך להגדיר את סוג ה-MIME הראשי ב-setType()
ל-"*/*"
.
- פעולה
ACTION_OPEN_DOCUMENT
או
ACTION_CREATE_DOCUMENT
- סכמת URI של נתונים
- ללא
- סוג MIME
- סוג ה-MIME שמתאים לסוג הקובץ שהמשתמש צריך לבחור.
- תוספות
-
EXTRA_MIME_TYPES
- מערך של סוגי MIME שמתאימים לסוגי הקבצים שהאפליקציה מבקשת. כשמשתמשים בתוספת הזו, צריך להגדיר את סוג ה-MIME הראשי ב-
setType()
ל-"*/*"
. EXTRA_ALLOW_MULTIPLE
- ערך בוליאני שקובע אם המשתמש יכול לבחור יותר מקובץ אחד בכל פעם.
EXTRA_TITLE
- לשימוש עם
ACTION_CREATE_DOCUMENT
כדי לציין שם קובץ ראשוני. EXTRA_LOCAL_ONLY
- ערך בוליאני שמצהיר אם הקובץ שמוחזר צריך להיות זמין ישירות מהמכשיר, במקום לדרוש הורדה משירות מרוחק.
- קטגוריה
-
CATEGORY_OPENABLE
- כדי להחזיר רק קבצים שאפשר לפתוח ושניתן לייצג כזרם קבצים
עם
openFileDescriptor()
.
דוגמה לכוונת משתמש לקבל תמונה:
Kotlin
const val REQUEST_IMAGE_OPEN = 1 fun selectImage2() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) { val fullPhotoUri: Uri = data.data // Do work with full size photo saved at fullPhotoUri. ... } }
Java
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri. ... } }
אפליקציות של צד שלישי לא יכולות להגיב לכוונת המשתמש באמצעות הפעולה ACTION_OPEN_DOCUMENT
. במקום זאת, המערכת מקבלת את האינטנט הזה ומציגה את כל הקבצים שזמינים מאפליקציות שונות בממשק משתמש מאוחד.
כדי לספק את קובצי האפליקציה בממשק המשתמש הזה ולאפשר לאפליקציות אחרות לפתוח אותם, צריך להטמיע 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>
מידע נוסף על פתיחת קבצים שמנוהלים על ידי האפליקציה מאפליקציות אחרות זמין במאמר פתיחת קבצים באמצעות framework של גישה לאחסון.
פעולות מקומיות
הזמנת מונית היא פעולה מקומית נפוצה. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, תוכלו ליצור מסנן כוונות באמצעות המידע שבקטע הבא.
הזמנת מונית
פעולות קוליות ב-Google Voice
- "get me a taxi" (תזמין לי מונית)
- "call me a car" (תזמין לי מונית)
(Wear OS בלבד)
כדי להזמין מונית, משתמשים בפעולה ACTION_RESERVE_TAXI_RESERVATION
.
הערה: האפליקציות חייבות לבקש אישור מהמשתמש לפני השלמת הפעולה הזו.
- פעולה
ACTION_RESERVE_TAXI_RESERVATION
- URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
- ללא
דוגמה לכוונת רכישה:
Kotlin
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
מפות
הצגת מיקום במפה היא פעולה נפוצה באפליקציות מפה. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן כוונות באמצעות המידע שבקטע הבא.
הצגת מיקום במפה
כדי לפתוח מפה, משתמשים בפעולה ACTION_VIEW
ומציינים את פרטי המיקום בנתוני הכוונה באמצעות אחת מהסכימות הבאות.
- פעולה
ACTION_VIEW
- סכמת URI של נתונים
-
geo:latitude,longitude
- הצגת המפה בקו האורך ובקו הרוחב שצוינו.
דוגמה:
"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
- Show the map at the given longitude and latitude at a certain zoom level. רמת זום של 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); } }
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
מוזיקה או סרטון
בהמשך מפורטות פעולות נפוצות באפליקציות של מוזיקה וסרטונים, כולל המידע שצריך כדי ליצור מסנן כוונות לפרסום היכולת של האפליקציה לבצע כל פעולה.
הפעלת קובץ מדיה
כדי להפעיל קובץ מוזיקה, משתמשים בפעולה ACTION_VIEW
ומציינים את מיקום ה-URI של הקובץ בנתוני הכוונה.
- פעולה
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); } }
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:type="audio/*" /> <data android:type="application/ogg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
הפעלת מוזיקה על סמך שאילתת חיפוש
פעולות קוליות ב-Google Voice
- "play michael jackson billie jean" (הפעלת השיר Billie Jean של מייקל ג'קסון)
כדי להפעיל מוזיקה על סמך שאילתת חיפוש, משתמשים ב-intent INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
. אפליקציה עשויה להפעיל את ה-intent הזה בתגובה לפקודה קולית של המשתמש להפעלת מוזיקה. אפליקציית היעד של האינטנט הזה מבצעת חיפוש במלאי שלה כדי להתאים תוכן קיים לשאילתה שצוינה, ומתחילה להפעיל את התוכן הזה.
בכוונת השימוש הזו, כוללים את המחרוזת EXTRA_MEDIA_FOCUS
extra, שמציינת את מצב החיפוש הרצוי. לדוגמה, מצב החיפוש יכול לציין אם החיפוש הוא של שם אומן או שם שיר.
- פעולה
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
-
MediaStore.EXTRA_MEDIA_FOCUS
(שדה חובה)-
מציין את מצב החיפוש: האם המשתמש מחפש אומן, אלבום, שיר או פלייליסט מסוימים. ברוב מצבי החיפוש אפשר להוסיף תוספים. לדוגמה, אם המשתמש רוצה להאזין לשיר מסוים, יכול להיות שלכוונת הרכישה יהיו שלוש תוספות נוספות: שם השיר, שם האומן ושם האלבום. הכוונה הזו תומכת במצבי החיפוש הבאים לכל ערך של
EXTRA_MEDIA_FOCUS
:כל –
"vnd.android.cursor.item/*"
-
אני רוצה להפעיל מוזיקה. האפליקציה המקבלת מנגנת מוזיקה על סמך בחירה חכמה, כמו הפלייליסט האחרון שהמשתמש האזין לו.
תוספות נוספות:
-
QUERY
(חובה): מחרוזת ריקה. התוספת הזו תמיד מסופקת לטובת תאימות לאחור. אפליקציות קיימות שלא תומכות במצבי חיפוש יכולות לעבד את הכוונה הזו כחיפוש לא מובנה.
-
לא מובנה –
"vnd.android.cursor.item/*"
-
להשמיע שיר, אלבום או ז'אנר מסוימים מתוך שאילתת חיפוש לא מובנית. אפליקציות יכולות ליצור כוונה באמצעות מצב החיפוש הזה אם הן לא מצליחות לזהות את סוג התוכן שהמשתמש רוצה להאזין לו. כדאי להשתמש במצבי חיפוש ספציפיים יותר כשזה אפשרי.
תוספות נוספות:
-
QUERY
(חובה): מחרוזת שמכילה כל שילוב של שם האומן, שם האלבום, שם השיר או הז'אנר.
-
ז'אנר –
Audio.Genres.ENTRY_CONTENT_TYPE
-
להשמיע מוזיקה מז'אנר מסוים.
תוספות נוספות:
-
"android.intent.extra.genre"
(חובה) – הז'אנר. -
QUERY
(חובה): הז'אנר. התוספת הזו תמיד מסופקת לצורך תאימות לאחור. אפליקציות קיימות שלא תומכות במצבי חיפוש יכולות לעבד את הכוונה הזו כחיפוש לא מובנה.
-
-
להשמיע מוזיקה של אומן מסוים.
תוספות נוספות:
-
EXTRA_MEDIA_ARTIST
(חובה): האומן. -
"android.intent.extra.genre"
: הז'אנר. -
QUERY
(חובה): מחרוזת שמכילה שילוב כלשהו של האומן או הז'אנר. התוספת הזו תמיד מסופקת לצורך תאימות לאחור. אפליקציות קיימות שלא תומכות במצבי חיפוש יכולות לעבד את הכוונה הזו כחיפוש לא מובנה.
-
Album -
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
(חובה): מחרוזת שמכילה כל שילוב של שם האלבום, האומן, הז'אנר, הפלייליסט או הכותרת. התוספת הזו תמיד מסופקת לטובת תאימות לאחור. אפליקציות קיימות שלא תומכות במצבי חיפוש יכולות לעבד את הכוונה הזו כחיפוש לא מובנה.
-
דוגמה לכוונת רכישה:
אם המשתמש רוצה להאזין למוזיקה של אומן מסוים, אפליקציית חיפוש עשויה ליצור את כוונת החיפוש הבאה:
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); } }
דוגמה למסנן כוונות:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
כשמטפלים בכוונה הזו בפעילות, בודקים את הערך של
EXTRA_MEDIA_FOCUS
extra בנתונים הנכנסים
Intent
כדי לקבוע את מצב החיפוש. אחרי שהפעילות מזהה את מצב החיפוש, היא קוראת את הערכים של התוספים הנוספים עבור מצב החיפוש הספציפי הזה.
בעזרת המידע הזה, האפליקציה יכולה לבצע את החיפוש במלאי שלה כדי להפעיל את התוכן שתואם לשאילתת החיפוש. הדוגמה הבאה ממחישה את זה.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS) val query: String? = intent.getStringExtra(SearchManager.QUERY) // Some of these extras might not be available depending on the search mode. val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM) val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST) val genre: String? = intent.getStringExtra("android.intent.extra.genre") val playlist: String? = intent.getStringExtra("android.intent.extra.playlist") val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE) // Determine the search mode and use the corresponding extras. when { mediaFocus == null -> { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query) } mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> { if (query?.isNotEmpty() == true) { // 'Unstructured' search mode. playUnstructuredSearch(query) } else { // 'Any' search mode. playResumeLastPlaylist() } } mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> { // 'Genre' search mode. playGenre(genre) } mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Artist' search mode. playArtist(artist, genre) } mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> { // 'Album' search mode. playAlbum(album, artist) } mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> { // 'Song' search mode. playSong(album, artist, genre, title) } mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title) } } } }
Java
protected void onCreate(Bundle savedInstanceState) { //... Intent intent = this.getIntent(); if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); String query = intent.getStringExtra(SearchManager.QUERY); // Some of these extras might not be available depending on the search mode. String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); String genre = intent.getStringExtra("android.intent.extra.genre"); String playlist = intent.getStringExtra("android.intent.extra.playlist"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // Determine the search mode and use the corresponding extras. if (mediaFocus == null) { // 'Unstructured' search mode (backward compatible). playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // 'Any' search mode. playResumeLastPlaylist(); } else { // 'Unstructured' search mode. playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { // 'Genre' search mode. playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // 'Artist' search mode. playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // 'Album' search mode. playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // 'Song' search mode. playSong(album, artist, genre, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title); } } }
הערה חדשה
יצירת הערה היא פעולה נפוצה באפליקציות לרישום הערות. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן כוונות באמצעות המידע שבקטע הבא.
יצירת הערה
כדי ליצור הערה חדשה, משתמשים בפעולה
ACTION_CREATE_NOTE
ומציינים פרטים כמו הנושא והטקסט באמצעות התוספים הבאים.
הערה: האפליקציות חייבות לבקש אישור מהמשתמש לפני השלמת הפעולה הזו.
- פעולה
-
ACTION_CREATE_NOTE
- סכמת URI של נתונים
- ללא
- סוג MIME
-
PLAIN_TEXT_TYPE
- "*/*"
- תוספות
-
-
EXTRA_NAME
- מחרוזת שמציינת את הכותרת או הנושא של ההערה.
-
EXTRA_TEXT
- מחרוזת שמציינת את הטקסט של ההערה.
-
- "call 555-5555" (להתקשר למספר 555-5555)
- "call bob"
- "call voicemail" (התקשרות לדואר הקולי)
- פעולה
-
-
ACTION_DIAL
– פתיחת החייגן או אפליקציית הטלפון. ACTION_CALL
– ביצוע שיחת טלפון (נדרשת הרשאהCALL_PHONE
)
-
- סכמת URI של נתונים
-
tel:<phone-number>
voicemail:<phone-number>
- סוג MIME
- ללא
tel:2125551212
tel:(212) 555 1212
- "search for cat videos on myvideoapp" (חיפוש סרטונים של חתולים באפליקציית הסרטונים שלי)
- פעולה
-
"com.google.android.gms.actions.SEARCH_ACTION"
- תמיכה בשאילתות חיפוש מפעולות קוליות ב-Google Voice.
- תוספות
-
QUERY
- מחרוזת שמכילה את שאילתת החיפוש.
- פעולה
ACTION_WEB_SEARCH
- סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
-
SearchManager.QUERY
- המחרוזת לחיפוש.
- פעולה
-
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS
למידע על מסכי הגדרות נוספים שזמינים, אפשר לעיין ב
Settings
מאמרי העזרה . - סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- פעולה
ACTION_SENDTO
או
ACTION_SEND
או
ACTION_SEND_MULTIPLE
- סכמת URI של נתונים
-
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>
כל התוכניות האלה מטופלות באותו אופן.
- סוג MIME
-
"text/plain"
"image/*"
"video/*"
- תוספות
-
"subject"
- מחרוזת לנושא ההודעה (בדרך כלל רק להודעות MMS).
"sms_body"
- מחרוזת להודעת הטקסט.
EXTRA_STREAM
- חץ
Uri
שמצביע על התמונה או הסרטון שרוצים לצרף. אם משתמשים בפעולהACTION_SEND_MULTIPLE
, התוסף הזה הואArrayList
שלUri
אובייקטים שמפנים לתמונות או לסרטונים לצירוף.
- פעולה
ACTION_VIEW
- סכמת URI של נתונים
http:<URL>
https:<URL>
- סוג MIME
-
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
- מגדירים מכשיר Android לפיתוח או משתמשים במכשיר וירטואלי.
- מתקינים גרסה של האפליקציה שמטפלת ב-Intents שרוצים לתמוך בהם.
- הפעלת כוונת שימוש באמצעות
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
- אם מגדירים את מסנני הכוונה הנדרשים, מטפלים בכוונה.
דוגמה לכוונת רכישה:
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); } }
דוגמה למסנן כוונות:
<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>
טלפון
יזום שיחה הוא פעולה נפוצה באפליקציות לטלפון. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן כוונות באמצעות המידע שבקטע הבא.
איך מתקשרים
כדי לפתוח את אפליקציית הטלפון ולחייג מספר טלפון, משתמשים בפעולה ACTION_DIAL
ומציינים מספר טלפון באמצעות סכימת ה-URI הבאה. כשאפליקציית הטלפון נפתחת, מוצג מספר הטלפון, והמשתמש צריך להקיש על הלחצן התקשרות כדי להתחיל את שיחת הטלפון.
פעולות קוליות ב-Google Voice
כדי להתקשר ישירות, משתמשים בפעולה ACTION_CALL
ומציינים מספר טלפון באמצעות סכמת ה-URI הבאה. כשפותחים את אפליקציית הטלפון, השיחה מתחילה. המשתמש לא צריך להקיש על הלחצן התקשרות.
כדי לבצע את הפעולה ACTION_CALL
, צריך להוסיף את ההרשאה CALL_PHONE
לקובץ המניפסט:
<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); } }
חיפוש
בהמשך מפורטות פעולות נפוצות באפליקציות לחיפוש, כולל המידע שדרוש ליצירת מסנן כוונות לפרסום היכולת של האפליקציה לבצע כל פעולה.
חיפוש באמצעות אפליקציה ספציפית
פעולות קוליות ב-Google Voice
כדי לתמוך בחיפוש בהקשר של האפליקציה, צריך להצהיר על מסנן Intent באפליקציה עם הפעולה SEARCH_ACTION
, כמו בדוגמה הבאה של מסנן Intent.
הערה: לא מומלץ להשתמש ב-SEARCH_ACTION
לחיפוש אפליקציות.
במקום זאת, כדאי להטמיע את הפעולה
GET_THING
כדי להשתמש בתמיכה המובנית של Google Assistant בחיפוש בתוך האפליקציה. מידע נוסף זמין במסמכי העזרה בנושא פעולות באפליקציות ב-Google Assistant.
דוגמה למסנן כוונות:
<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); } }
הגדרות
כדי לפתוח מסך באפליקציית ההגדרות של המערכת כשהאפליקציה שלכם דורשת מהמשתמש לשנות משהו, משתמשים באחת מפעולות הכוונה הבאות:
דוגמה לכוונת רכישה:
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 עם קובץ מצורף היא פעולה נפוצה באפליקציות לשליחת הודעות טקסט. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן כוונות באמצעות המידע שבקטע הבא.
כתיבת הודעת 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); } }
אם רוצים לוודא שהכוונה תטופל רק על ידי אפליקציה להודעות טקסט, ולא על ידי אפליקציות אחרות של אימייל או רשתות חברתיות, צריך להשתמש בפעולה 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); } }
דוגמה למסנן כוונות:
<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 באינטרנט היא פעולה נפוצה באפליקציות של דפדפני אינטרנט. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן כוונות באמצעות המידע שבקטע הבא.
טעינת כתובת URL של אתר
כדי לפתוח דף אינטרנט, משתמשים בפעולה ACTION_VIEW
ומציינים את כתובת ה-URL של האתר בנתוני הכוונה.
דוגמה לכוונת רכישה:
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); } }
דוגמה למסנן כוונות:
<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.
החל מ-Android 12 (רמת API 31), כוונת אינטרנט כללית מופנית לפעילות באפליקציה רק אם האפליקציה אושרה עבור הדומיין הספציפי שכלול בכוונת האינטרנט הזו. אם האפליקציה לא אושרה לדומיין, כוונת האינטרנט תופנה לאפליקציית דפדפן ברירת המחדל של המשתמש.
אימות כוונות באמצעות ממשק הגישור של Android (ADB)
כדי לוודא שהאפליקציה מגיבה לאינטנטים שאתם רוצים לתמוך בהם, אתם יכולים להשתמש בכלי adb
כדי להפעיל אינטנטים ספציפיים. לשם כך:
מידע נוסף זמין במאמר בנושא הפעלת פקודות של מעטפת.