Intent מאפשר לכם להתחיל פעילות באפליקציה אחרת על ידי תיאור הפעולה שאתם רוצים לבצע, כמו "הצגת מפה" או "צילום תמונה", באובייקט Intent. סוג ה-Intent הזה נקרא Intent משתמע כי הוא לא מציין את רכיב האפליקציה שצריך להפעיל, אלא מציין פעולה ומספק נתונים מסוימים לביצוע הפעולה.
כשמפעילים את startActivity() או את startActivityForResult() ומעבירים אליהן Intent מרומז, המערכת מפענחת את ה-Intent לאפליקציה שיכולה לטפל בו ומפעילה את ה-Activity התואם. אם יש יותר מאפליקציה אחת שיכולה לטפל ב-Intent, המערכת מציגה למשתמש תיבת דו-שיח לבחירת האפליקציה שבה הוא רוצה להשתמש.
בדף הזה מתוארות כמה כוונות משתמעות שאפשר להשתמש בהן כדי לבצע פעולות נפוצות, לפי סוג האפליקציה שמטפלת בכוונה. בכל קטע מוסבר גם איך ליצור מסנן Intent כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה.
אזהרה: אם אין במכשיר אפליקציות שיכולות לקבל Intent מרומז, האפליקציה תקרוס כשהיא תפעיל את startActivity(). כדי לוודא קודם שקיימת אפליקציה שיכולה לקבל את ה-Intent, צריך להפעיל את resolveActivity() באובייקט Intent. אם התוצאה היא לא null, יש לפחות אפליקציה אחת שיכולה לטפל ב-Intent, ואפשר להפעיל את startActivity(). אם התוצאה היא null, אל תשתמשו ב-Intent, ואם אפשר, השביתו את התכונה שמפעילה את ה-Intent.
אם אתם לא יודעים איך ליצור אובייקטים מסוג Intent או מסנני Intent, קודם קראו את המאמר אובייקטים מסוג Intent ומסנני Intent.
כדי להבין איך להפעיל את ה-Intent שמפורטים בדף הזה ממארח הפיתוח, עיינו בקטע אימות Intent באמצעות Android Debug Bridge.
פעולות קוליות של Google
Google Voice מפעיל חלק מה-intent שמפורטים בדף הזה בתגובה לפקודות קוליות. מידע נוסף זמין במאמר תחילת העבודה עם פעולות קוליות במערכת.
שעון מעורר
בהמשך מפורטות פעולות נפוצות של אפליקציות שעון מעורר, כולל המידע שצריך כדי ליצור מסנן Intent שמפרסם את היכולת של האפליקציה לבצע כל פעולה.
יצירת שעון מעורר
כדי ליצור התראה חדשה, משתמשים בפעולה ACTION_SET_ALARM ומציינים את פרטי ההתראה, כמו השעה וההודעה, באמצעות הפרמטרים הבאים.
הערה: רק השעה, הדקות והתוספות של ההודעה זמינות ב-Android מגרסה 2.3 (רמת API 9) ומטה. התוספות האחרות זמינות בגרסאות מתקדמות יותר של הפלטפורמה.
- פעולה
ACTION_SET_ALARM- URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
-
EXTRA_HOUR- השעה של השעון המעורר.
EXTRA_MINUTES- הדקות של ההתראה.
EXTRA_MESSAGE- הודעה מותאמת אישית לזיהוי ההתראה.
EXTRA_DAYS-
ArrayListשכולל את כל הימים בשבוע שבהם ההתראה הזו חוזרת. צריך להצהיר על כל יום באמצעות מספר שלם מהמחלקהCalendar, למשלMONDAY.אם רוצים להגדיר התראה חד-פעמית, לא מציינים את הפרמטר הזה.
EXTRA_RINGTONE
- מזהה URI מסוג
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" />
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
יצירת טיימר
כדי ליצור טיימר לספירה לאחור, משתמשים בפעולה ACTION_SET_TIMER ומציינים את פרטי הטיימר, כמו משך הזמן, באמצעות התוספות הבאות.
הערה: ה-Intent הזה זמין ב-Android מגרסה 4.4 (רמת API 19) ואילך.
- פעולה
ACTION_SET_TIMER- URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
-
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" />
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
הצג את כל ההתראות
כדי להציג את רשימת ההתראות, משתמשים בפעולה ACTION_SHOW_ALARMS.
לא הרבה אפליקציות מפעילות את ה-Intent הזה, כי הוא משמש בעיקר אפליקציות מערכת, אבל כל אפליקציה שמתנהגת כמו שעון מעורר יכולה להטמיע את מסנן ה-Intent הזה ולהגיב בהצגת רשימת ההתראות הנוכחיות.
הערה: ה-Intent הזה זמין ב-Android מגרסה 4.4 (רמת API 19) ואילך.
- פעולה
ACTION_SHOW_ALARMS- URI של נתונים
- ללא
- סוג MIME
- ללא
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
יומן
הוספת אירוע היא פעולה נפוצה באפליקציות של יומנים. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן Intent באמצעות המידע שבקטע הבא.
הוספת אירוע ביומן
כדי להוסיף אירוע חדש ליומן של המשתמש, משתמשים בפעולה ACTION_INSERT ומציינים את ה-URI של הנתונים באמצעות Events.CONTENT_URI.
לאחר מכן, אפשר לציין פרטים שונים של האירוע באמצעות התוספות הבאות.
- פעולה
ACTION_INSERT- URI של נתונים
Events.CONTENT_URI- סוג MIME
"vnd.android.cursor.dir/event"- תוספות
-
EXTRA_EVENT_ALL_DAY- ערך בוליאני שמציין אם זה אירוע של יום שלם.
EXTRA_EVENT_BEGIN_TIME- שעת ההתחלה של האירוע (באלפיות השנייה מאז ראשית זמן יוניקס).
EXTRA_EVENT_END_TIME- שעת הסיום של האירוע (באלפיות השנייה מאז ראשית זמן יוניקס).
TITLE- שם האירוע.
DESCRIPTION- תיאור האירוע.
EVENT_LOCATION- מיקום האירוע.
EXTRA_EMAIL- רשימה מופרדת בפסיקים של כתובות אימייל שמציינות את המוזמנים.
אפשר לציין עוד הרבה פרטי אירועים באמצעות הקבועים שמוגדרים בכיתה
CalendarContract.EventsColumns.
דוגמה לכוונה:
Kotlin
fun addEvent(title: String, location: String, begin: Long, end: Long) { val intent = Intent(Intent.ACTION_INSERT).apply { data = Events.CONTENT_URI putExtra(Events.TITLE, title) putExtra(Events.EVENT_LOCATION, location) putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void addEvent(String title, String location, long begin, long end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
מסנן Intent לדוגמה:
<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 EXTRA_OUTPUT.
- פעולה
ACTION_IMAGE_CAPTUREאו
ACTION_VIDEO_CAPTURE- סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
-
EXTRA_OUTPUT- מיקום ה-URI שבו אפליקציית המצלמה שומרת את קובץ התמונה או הווידאו (כאובייקט
Uri).
כשאפליקציית המצלמה מחזירה את המיקוד לפעילות שלכם – כלומר, האפליקציה מקבלת את הקריאה החוזרת (callback) של onActivityResult() – אתם יכולים לגשת לתמונה או לסרטון ב-URI שציינתם עם הערך EXTRA_OUTPUT.
הערה: כשמשתמשים ב-ACTION_IMAGE_CAPTURE כדי לצלם תמונה, יכול להיות שהמצלמה תחזיר גם עותק מוקטן או תמונה ממוזערת של התמונה בתוצאה Intent, שתישמר בתור Bitmap בשדה נוסף בשם "data".
דוגמה לכוונה:
Kotlin
const val REQUEST_IMAGE_CAPTURE = 1 val locationForPhotos: Uri = ... fun capturePhoto(targetFilename: String) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)) } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") // Do other work with full size photo saved in locationForPhotos. ... } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri locationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelableExtra("data"); // Do other work with full size photo saved in locationForPhotos. ... } }
כדי לעשות את זה כשעובדים ב-Android 12 (רמת API 31) ומעלה, אפשר לעיין בדוגמה הבאה ל-Intent.
דוגמה לכוונה:
Kotlin
val REQUEST_IMAGE_CAPTURE = 1 private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } catch (ActivityNotFoundException e) { // Display error state to the user. } } </section></div>
מידע נוסף על השימוש ב-Intent הזה לצילום תמונה, כולל איך ליצור Uri מתאים למיקום הפלט, זמין במאמרים צילום תמונות או צילום סרטונים.
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
כשמטפלים ב-Intent הזה, צריך לבדוק בפעילות אם יש את ה-extra EXTRA_OUTPUT ב-Intent הנכנס, ואז לשמור את התמונה או הסרטון שצולמו במיקום שצוין ב-extra הזה, ולקרוא ל-setResult() עם Intent שכולל תמונה ממוזערת דחוסה ב-extra בשם "data".
הפעלת אפליקציית מצלמה במצב תמונה סטטית
כדי לפתוח אפליקציית מצלמה במצב תמונה, משתמשים בפעולה INTENT_ACTION_STILL_IMAGE_CAMERA.
- פעולה
INTENT_ACTION_STILL_IMAGE_CAMERA- סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
- ללא
דוגמה לכוונה:
Kotlin
private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // Display error state to the user. } }
Java
public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
פותחים את אפליקציית המצלמה במצב וידאו.
כדי לפתוח אפליקציית מצלמה במצב וידאו, משתמשים בפעולה INTENT_ACTION_VIDEO_CAMERA.
- פעולה
INTENT_ACTION_VIDEO_CAMERA- סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
- ללא
דוגמה לכוונה:
Kotlin
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
Java
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
אפליקציית אנשי קשר/אנשים
בהמשך מפורטות פעולות נפוצות באפליקציות לניהול אנשי קשר, כולל המידע שצריך כדי ליצור מסנן Intent שמפרסם את היכולת של האפליקציה לבצע כל פעולה.
בחירת איש קשר
כדי שהמשתמש יבחר איש קשר וייתן לאפליקציה גישה לכל הפרטים של איש הקשר, צריך להשתמש בפעולה ACTION_PICK ולציין את סוג ה-MIME בתור Contacts.CONTENT_TYPE.
התוצאה Intent שמועברת לקריאה החוזרת (callback) של onActivityResult() מכילה את ה-URI של content: שמפנה לאיש הקשר שנבחר. התגובה מעניקה לאפליקציה הרשאות זמניות לקרוא את איש הקשר הזה באמצעות ה-API של ניהול אנשי הקשר, גם אם האפליקציה לא כוללת את ההרשאה READ_CONTACTS.
טיפ: אם אתם צריכים גישה רק לפרט ספציפי של איש קשר, כמו מספר טלפון או כתובת אימייל, עיינו בקטע הבא בנושא בחירת נתונים ספציפיים של אנשי קשר.
- פעולה
ACTION_PICK- סכמת URI של נתונים
- ללא
- סוג MIME
Contacts.CONTENT_TYPE
דוגמה לכוונה:
Kotlin
const val REQUEST_SELECT_CONTACT = 1 fun selectContact() { val intent = Intent(Intent.ACTION_PICK).apply { type = ContactsContract.Contacts.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { val contactUri: Uri = data.data // Do something with the selected contact at contactUri. //... } }
Java
static final int REQUEST_SELECT_CONTACT = 1; public void selectContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); // Do something with the selected contact at contactUri. ... } }
במאמר אחזור פרטים של איש קשר מוסבר איך לאחזר פרטים ליצירת קשר אחרי שמקבלים את ה-URI של איש הקשר.
כשמאחזרים את ה-URI של איש הקשר באמצעות ה-Intent הזה, בדרך כלל לא צריך את ההרשאה READ_CONTACTS כדי לקרוא פרטים בסיסיים של איש הקשר, כמו השם המוצג והאם איש הקשר מסומן בכוכב. אבל אם אתם מנסים לקרוא נתונים ספציפיים יותר על איש קשר מסוים, כמו מספר הטלפון או כתובת האימייל שלו, אתם צריכים את ההרשאה READ_CONTACTS.
בחירת נתונים ספציפיים של אנשי קשר
כדי שהמשתמש יבחר פרט מידע ספציפי מאיש קשר, כמו מספר טלפון, כתובת אימייל או סוג נתונים אחר, משתמשים בפעולה ACTION_PICK ומציינים את סוג ה-MIME לאחד מסוגי התוכן הבאים, כמו CommonDataKinds.Phone.CONTENT_TYPE כדי לקבל את מספר הטלפון של איש הקשר.
הערה: במקרים רבים, האפליקציה צריכה את ההרשאה READ_CONTACTS כדי להציג מידע ספציפי על איש קשר מסוים.
אם אתם צריכים לאחזר רק סוג אחד של נתונים מאיש קשר, השיטה הזו עם CONTENT_TYPE מהמחלקות ContactsContract.CommonDataKinds יעילה יותר משימוש ב-Contacts.CONTENT_TYPE, כפי שמוצג בסעיף הקודם. התוצאה מספקת לכם גישה ישירה לנתונים הרצויים בלי שתצטרכו לבצע שאילתה מורכבת יותר בניהול אנשי הקשר.
התוצאה Intent שנשלחה לקריאה החוזרת (callback) של onActivityResult() מכילה את ה-URI של content: שמפנה לנתוני איש הקשר שנבחר. התגובה מעניקה לאפליקציה הרשאות זמניות לקרוא את נתוני איש הקשר, גם אם האפליקציה לא כוללת את ההרשאה READ_CONTACTS.
- פעולה
ACTION_PICK- סכמת URI של נתונים
- ללא
- סוג MIME
-
CommonDataKinds.Phone.CONTENT_TYPE- בוחרים איש קשר עם מספר טלפון.
CommonDataKinds.Email.CONTENT_TYPE- בוחרים מתוך אנשי הקשר שיש להם כתובת אימייל.
CommonDataKinds.StructuredPostal.CONTENT_TYPE- בוחרים מתוך אנשי הקשר שיש להם כתובת דואר.
או אחד מהערכים הרבים האחרים של
CONTENT_TYPEמתחת ל-ContactsContract.
דוגמה לכוונה:
Kotlin
const val REQUEST_SELECT_PHONE_NUMBER = 1 fun selectContact() { // Start an activity for the user to pick a phone number from contacts. val intent = Intent(Intent.ACTION_PICK).apply { type = CommonDataKinds.Phone.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) { // Get the URI and query the content provider for the phone number. val contactUri: Uri = data.data val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER) contentResolver.query(contactUri, projection, null, null, null).use { cursor -> // If the cursor returned is valid, get the phone number. if (cursor.moveToFirst()) { val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER) val number = cursor.getString(numberIndex) // Do something with the phone number. ... } } } }
Java
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // Start an activity for the user to pick a phone number from contacts. Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { // Get the URI and query the content provider for the phone number. Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // If the cursor returned is valid, get the phone number. if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // Do something with the phone number. //... } } }
איך רואים את הפרטים של איש קשר
כדי להציג את הפרטים של איש קשר מוכר, משתמשים בפעולה ACTION_VIEW ומציינים את איש הקשר עם URI של content: כנתוני ה-Intent.
יש שתי דרכים עיקריות לאחזר את ה-URI של איש הקשר:
- משתמשים ב-URI של איש הקשר שהוחזר על ידי הפעולה
ACTION_PICKשמוצגת בקטע הקודם. הגישה הזו לא דורשת הרשאות שניתנות לאפליקציה. - לגשת ישירות לרשימה של כל אנשי הקשר, כמו שמתואר בקטע אחזור רשימה של אנשי קשר. כדי להשתמש בגישה הזו, צריך את ההרשאה
READ_CONTACTS.
- פעולה
ACTION_VIEW- סכמת URI של נתונים
content:<URI>- סוג MIME
- אין. הסוג נגזר מה-URI של איש הקשר.
דוגמה לכוונה:
Kotlin
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
עריכת איש קשר קיים
כדי לערוך איש קשר קיים, משתמשים בפעולה ACTION_EDIT, מציינים את איש הקשר באמצעות URI מסוג content: כנתוני ה-Intent, וכוללים את כל הפרטים הידועים של איש הקשר בתוספות שמצוינות על ידי קבועים ב-ContactsContract.Intents.Insert.
יש שתי דרכים עיקריות לאחזר את ה-URI של איש הקשר:
- משתמשים ב-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); } }
למידע נוסף על עריכת איש קשר, קראו את המאמר שינוי אנשי קשר באמצעות 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); } }
מידע נוסף על הוספת איש קשר זמין במאמר שינוי אנשי קשר באמצעות Intent.
אימייל
כתיבת אימייל עם קבצים מצורפים אופציונליים היא פעולה נפוצה באפליקציות אימייל. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן 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_STREAMUriשמפנה לקובץ המצורף. אם משתמשים בפעולהACTION_SEND_MULTIPLE, זהוArrayListשמכיל כמה אובייקטים מסוגUri.
דוגמה לכוונה:
Kotlin
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "*/*" putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
אם אתם רוצים לוודא שה-Intent שלכם יטופל רק על ידי אפליקציית אימייל, ולא על ידי אפליקציית הודעות טקסט או יישומים חברתיים, השתמשו בפעולה ACTION_SENDTO וכללו את סכימת הנתונים "mailto:", כמו בדוגמה הבאה:
Kotlin
fun composeEmail(addresses: Array<String>, subject: String) { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") // Only email apps handle this. putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // Only email apps handle this. intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
אחסון קבצים
בהמשך מפורטות פעולות נפוצות באפליקציות לאחסון קבצים, כולל המידע שצריך כדי ליצור מסנן Intent שמפרסם את היכולת של האפליקציה לבצע כל פעולה.
אחזור סוג קובץ ספציפי
כדי לבקש מהמשתמש לבחור קובץ כמו מסמך או תמונה ולהחזיר הפניה לאפליקציה, משתמשים בפעולה ACTION_GET_CONTENT ומציינים את סוג ה-MIME הרצוי. ההפניה לקובץ שמוחזרת לאפליקציה היא זמנית למחזור החיים הנוכחי של הפעילות, אז אם רוצים לגשת אליה מאוחר יותר, צריך לייבא עותק שאפשר לקרוא מאוחר יותר.
הכוונה הזו גם מאפשרת למשתמש ליצור קובץ חדש בתהליך. לדוגמה, במקום לבחור תמונה קיימת, המשתמש יכול לצלם תמונה חדשה במצלמה.
ה-intent של התוצאה שנשלח ל-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().
דוגמה ל-Intent לקבלת תמונה:
Kotlin
const val REQUEST_IMAGE_GET = 1 fun selectImage() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") val fullPhotoUri: Uri = data.data // Do work with photo saved at fullPhotoUri. ... } }
Java
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri. ... } }
דוגמה למסנן Intent להחזרת תמונה:
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumnsandContentResolver.openFileDescriptor(). --> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
פתיחת סוג קובץ ספציפי
במקום לאחזר עותק של קובץ שצריך לייבא לאפליקציה באמצעות הפעולה ACTION_GET_CONTENT, כשמריצים ב-Android מגרסה 4.4 ואילך, אפשר לבקש לפתוח קובץ שמנוהל על ידי אפליקציה אחרת באמצעות הפעולה ACTION_OPEN_DOCUMENT וציון סוג MIME.
כדי לאפשר למשתמש גם ליצור מסמך חדש שהאפליקציה יכולה לכתוב בו, צריך להשתמש בפעולה ACTION_CREATE_DOCUMENT.
לדוגמה, במקום לבחור מתוך מסמכי PDF קיימים, ה-Intent ACTION_CREATE_DOCUMENT מאפשר למשתמשים לבחור איפה הם רוצים ליצור מסמך חדש, למשל באפליקציה אחרת שמנהלת את האחסון של המסמך. לאחר מכן, האפליקציה מקבלת את מיקום ה-URI שבו היא יכולה לכתוב את המסמך החדש.
ה-intent שמועבר ל-method 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().
אם המשתמש בוחר יותר מפריט אחד, הפונקציה getData() מחזירה ערך null, וצריך לאחזר כל פריט מאובייקט ClipData שמוחזר על ידי getClipData().
הערה: ה-Intent חייב לציין סוג MIME וחייב להצהיר על הקטגוריה CATEGORY_OPENABLE. במקרה הצורך, אפשר לציין יותר מסוג MIME אחד על ידי הוספת מערך של סוגי MIME עם התוספת EXTRA_MIME_TYPES. אם עושים זאת, צריך להגדיר את סוג ה-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().
דוגמה ל-Intent לקבלת תמונה:
Kotlin
const val REQUEST_IMAGE_OPEN = 1 fun selectImage2() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) { val fullPhotoUri: Uri = data.data // Do work with full size photo saved at fullPhotoUri. ... } }
Java
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri. ... } }
אפליקציות של צד שלישי לא יכולות להגיב ל-Intent עם הפעולה ACTION_OPEN_DOCUMENT. במקום זאת, המערכת מקבלת את ה-intent הזה ומציגה את כל הקבצים שזמינים מאפליקציות שונות בממשק משתמש מאוחד.
כדי לספק את קובצי האפליקציה בממשק המשתמש הזה ולאפשר לאפליקציות אחרות לפתוח אותם, צריך להטמיע 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>
כדי לקבל מידע נוסף על האופן שבו אפשר לפתוח את הקבצים שמנוהלים על ידי האפליקציה שלכם מאפליקציות אחרות, קראו את המאמר פתיחת קבצים באמצעות Storage Access Framework.
פעולות מקומיות
הזמנת רכב היא פעולה מקומית נפוצה. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן Intent באמצעות המידע שבקטע הבא.
הזמנת מונית
כדי להזמין מונית, משתמשים בפעולה ACTION_RESERVE_TAXI_RESERVATION.
הערה: האפליקציות חייבות לבקש אישור מהמשתמש לפני ביצוע הפעולה הזו.
- פעולה
ACTION_RESERVE_TAXI_RESERVATION- URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
- ללא
דוגמה לכוונה:
Kotlin
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
מפות
הצגת מיקום במפה היא פעולה נפוצה באפליקציות של מפות. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן Intent באמצעות המידע שבקטע הבא.
הצגת מיקום במפה
כדי לפתוח מפה, משתמשים בפעולה ACTION_VIEW ומציינים את נתוני המיקום בנתוני ה-Intent באמצעות אחת מהסכימות הבאות.
- פעולה
ACTION_VIEW- סכמת URI של נתונים
-
geo:latitude,longitude- הצגת המפה בקו האורך ובקו הרוחב שצוינו.
דוגמה:
"geo:47.6,-122.3" geo:latitude,longitude?z=zoom- הצגת המפה בקו האורך ובקו הרוחב שצוינו ברמת זום מסוימת. ברמת זום 1 מוצג כל כדור הארץ, במרכז של lat,lng שצוינו. רמת הזום הגבוהה ביותר (הכי קרובה) היא 23.
דוגמה:
"geo:47.6,-122.3?z=11" geo:0,0?q=lat,lng(label)- הצגת המפה בקו האורך ובקו הרוחב שצוינו עם תווית מחרוזת.
דוגמה:
"geo:0,0?q=34.99,-106.61(Treasure)" geo:0,0?q=my+street+address- הצגת המיקום של "הכתובת שלי", שיכולה להיות כתובת ספציפית או שאילתת מיקום.
דוגמה:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"הערה: כל המחרוזות שמועברות ב-URI של
geoחייבות להיות מקודדות. לדוגמה, המחרוזת1st & Pike, Seattleהופכת ל-1st%20%26%20Pike%2C%20Seattle. רווחים במחרוזת מקודדים באמצעות%20או מוחלפים בסימן הפלוס (+).
- סוג MIME
- ללא
דוגמה לכוונה:
Kotlin
fun showMap(geoLocation: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = geoLocation } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void showMap(Uri geoLocation) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(geoLocation); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
מוזיקה או סרטונים
בהמשך מפורטות פעולות נפוצות באפליקציות של מוזיקה וסרטונים, כולל המידע שצריך כדי ליצור מסנן Intent שמפרסם את היכולת של האפליקציה לבצע כל פעולה.
הפעלת קובץ מדיה
כדי להפעיל קובץ מוזיקה, משתמשים בפעולה ACTION_VIEW ומציינים את מיקום ה-URI של הקובץ בנתוני ה-Intent.
- פעולה
ACTION_VIEW- סכמת URI של נתונים
-
file:<URI>content:<URI>http:<URL>
- סוג MIME
-
"audio/*""application/ogg""application/x-ogg""application/itunes"- או כל הרשאה אחרת שהאפליקציה דורשת.
דוגמה לכוונה:
Kotlin
fun playMedia(file: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = file } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playMedia(Uri file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(file); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:type="audio/*" /> <data android:type="application/ogg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
השמעת מוזיקה על סמך שאילתת חיפוש
כדי להשמיע מוזיקה על סמך שאילתת חיפוש, משתמשים ב-intent INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH. אפליקציה יכולה להפעיל את ה-Intent הזה בתגובה לפקודה הקולית של המשתמש להשמיע מוזיקה. האפליקציה שמקבלת את ה-Intent הזה מבצעת חיפוש במלאי שלה כדי להתאים תוכן קיים לשאילתה הנתונה, ומתחילה להפעיל את התוכן הזה.
ב-Intent הזה, צריך לכלול את המחרוזת הנוספת EXTRA_MEDIA_FOCUS, שמציינת את מצב החיפוש הרצוי. לדוגמה, מצב החיפוש יכול לציין אם החיפוש הוא של שם אומן או שם שיר.
- פעולה
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH- סכמת URI של נתונים
- ללא
- סוג MIME
- ללא
- תוספות
-
MediaStore.EXTRA_MEDIA_FOCUS(שדה חובה)-
מציין את מצב החיפוש: אם המשתמש מחפש אומן, אלבום, שיר או פלייליסט מסוימים. רוב מצבי החיפוש כוללים תוספות. לדוגמה, אם המשתמש רוצה להאזין לשיר מסוים, ל-Intent יכולות להיות שלוש תוספות: שם השיר, האומן והאלבום. ה-Intent הזה תומך במצבי החיפוש הבאים לכל ערך של
EXTRA_MEDIA_FOCUS:כל –
"vnd.android.cursor.item/*"-
אפשר להשמיע מוזיקה מכל סוג. האפליקציה המקבלת מפעילה מוזיקה על סמך בחירה חכמה, כמו הפלייליסט האחרון שהמשתמש האזין לו.
תוספות:
-
QUERY(חובה): מחרוזת ריקה. התוספת הזו תמיד מסופקת לצורך תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-intent הזה כחיפוש לא מובנה.
-
לא מובנה –
"vnd.android.cursor.item/*"-
השמעת שיר, אלבום או ז'אנר מסוימים משאילתת חיפוש לא מובנית. אפליקציות יכולות ליצור Intent עם מצב החיפוש הזה כשהן לא יכולות לזהות את סוג התוכן שהמשתמש רוצה להאזין לו. כדאי להשתמש במצבי חיפוש ספציפיים יותר כשאפשר.
תוספות:
QUERY(חובה): מחרוזת שמכילה שילוב כלשהו של האומן, האלבום, שם השיר או הז'אנר.
ז'אנר –
Audio.Genres.ENTRY_CONTENT_TYPE-
להשמיע מוזיקה מז'אנר מסוים.
תוספות:
"android.intent.extra.genre"(חובה) – הז'אנר.-
QUERY(חובה): הז'אנר. התוספת הזו תמיד מסופקת כדי לשמור על תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-intent הזה כחיפוש לא מובנה.
-
להשמיע מוזיקה של אומן מסוים.
תוספות:
-
EXTRA_MEDIA_ARTIST(חובה): האומן. -
"android.intent.extra.genre": הז'אנר. -
QUERY(חובה): מחרוזת שמכילה שילוב כלשהו של האומן או הז'אנר. התוספת הזו תמיד מסופקת לצורך תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-intent הזה כחיפוש לא מובנה.
-
אלבום –
Audio.Albums.ENTRY_CONTENT_TYPE-
להשמיע מוזיקה מאלבום מסוים.
תוספות:
-
EXTRA_MEDIA_ALBUM(חובה): האלבום. -
EXTRA_MEDIA_ARTIST: האומן. -
"android.intent.extra.genre": הז'אנר. -
QUERY(חובה): מחרוזת שמכילה שילוב כלשהו של האלבום או האומן. התוספת הזו תמיד מסופקת לצורך תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-Intent הזה כחיפוש לא מובנה.
-
שיר –
"vnd.android.cursor.item/audio"-
להשמיע שיר מסוים.
תוספות:
-
EXTRA_MEDIA_ALBUM: האלבום. -
EXTRA_MEDIA_ARTIST: האומן. -
"android.intent.extra.genre": הז'אנר. -
EXTRA_MEDIA_TITLE(חובה): שם השיר. -
QUERY(חובה): מחרוזת שמכילה שילוב כלשהו של האלבום, האומן, הז'אנר או שם השיר. התוספת הזו תמיד מסופקת לצורך תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-intent הזה כחיפוש לא מובנה.
-
פלייליסט –
Audio.Playlists.ENTRY_CONTENT_TYPE-
הפעלת פלייליסט מסוים או פלייליסט שתואם לקריטריונים מסוימים שצוינו בתוספות.
תוספות:
-
EXTRA_MEDIA_ALBUM: האלבום. -
EXTRA_MEDIA_ARTIST: האומן. -
"android.intent.extra.genre": הז'אנר. -
"android.intent.extra.playlist": הפלייליסט. -
EXTRA_MEDIA_TITLE: שם השיר שעליו מבוססת הפלייליסט. -
QUERY(חובה): מחרוזת שמכילה שילוב כלשהו של האלבום, האומן, הז'אנר, הפלייליסט או השם. התוספת הזו תמיד מסופקת לצורך תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-intent הזה כחיפוש לא מובנה.
-
דוגמה לכוונה:
אם המשתמש רוצה להאזין למוזיקה של אומן מסוים, אפליקציית חיפוש יכולה ליצור את ה-Intent הבא:
Kotlin
fun playSearchArtist(artist: String) { val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply { putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist) putExtra(SearchManager.QUERY, artist) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playSearchArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); intent.putExtra(SearchManager.QUERY, artist); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
כשמטפלים ב-intent הזה בפעילות, בודקים את הערך של EXTRA_MEDIA_FOCUS הנוסף ב-Intent הנכנס כדי לקבוע את מצב החיפוש. אחרי שהפעילות תזהה את מצב החיפוש, קוראים את הערכים של התוספות הנוספות של מצב החיפוש הספציפי הזה.
בעזרת המידע הזה, האפליקציה יכולה לבצע את החיפוש במלאי שלה כדי להפעיל את התוכן שתואם לשאילתת החיפוש. הדוגמה הבאה ממחישה את זה.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS) val query: String? = intent.getStringExtra(SearchManager.QUERY) // Some of these extras might not be available depending on the search mode. val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM) val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST) val genre: String? = intent.getStringExtra("android.intent.extra.genre") val playlist: String? = intent.getStringExtra("android.intent.extra.playlist") val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE) // Determine the search mode and use the corresponding extras. when { mediaFocus == null -> { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query) } mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> { if (query?.isNotEmpty() == true) { // 'Unstructured' search mode. playUnstructuredSearch(query) } else { // 'Any' search mode. playResumeLastPlaylist() } } mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> { // 'Genre' search mode. playGenre(genre) } mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Artist' search mode. playArtist(artist, genre) } mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> { // 'Album' search mode. playAlbum(album, artist) } mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> { // 'Song' search mode. playSong(album, artist, genre, title) } mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title) } } } }
Java
protected void onCreate(Bundle savedInstanceState) { //... Intent intent = this.getIntent(); if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); String query = intent.getStringExtra(SearchManager.QUERY); // Some of these extras might not be available depending on the search mode. String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); String genre = intent.getStringExtra("android.intent.extra.genre"); String playlist = intent.getStringExtra("android.intent.extra.playlist"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // Determine the search mode and use the corresponding extras. if (mediaFocus == null) { // 'Unstructured' search mode (backward compatible). playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // 'Any' search mode. playResumeLastPlaylist(); } else { // 'Unstructured' search mode. playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { // 'Genre' search mode. playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // 'Artist' search mode. playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // 'Album' search mode. playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // 'Song' search mode. playSong(album, artist, genre, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // 'Playlist' search mode. playPlaylist(album, artist, genre, playlist, title); } } }
הערה חדשה
יצירת פתק היא פעולה נפוצה באפליקציות לרישום הערות. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן Intent באמצעות המידע שבקטע הבא.
יצירת הערה
כדי ליצור פתק חדש, משתמשים בפעולה
ACTION_CREATE_NOTE ומציינים את פרטי הפתק, כמו הנושא והטקסט, באמצעות הפרטים הנוספים הבאים.
הערה: האפליקציות חייבות לבקש אישור מהמשתמש לפני ביצוע הפעולה הזו.
- פעולה
-
ACTION_CREATE_NOTE - סכמת URI של נתונים
- ללא
- סוג MIME
-
PLAIN_TEXT_TYPE - "*/*"
- תוספות
-
-
EXTRA_NAME - מחרוזת שמציינת את הכותרת או הנושא של הפתק.
-
EXTRA_TEXT - מחרוזת שמציינת את הטקסט של ההערה.
-
- פעולה
-
ACTION_DIAL– פתיחת החייגן או אפליקציית "טלפון".-
ACTION_CALL– מבצע שיחת טלפון (נדרשת ההרשאהCALL_PHONE)
- סכמת URI של נתונים
-
tel:<phone-number>voicemail:<phone-number>
- סוג MIME
- ללא
tel:2125551212tel:(212) 555 1212- פעולה
-
"com.google.android.gms.actions.SEARCH_ACTION"- תמיכה בשאילתות חיפוש מפעולות קוליות של Google.
- תוספות
-
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_STREAMUriשמצביע על התמונה או הסרטון שרוצים לצרף. אם משתמשים בפעולהACTION_SEND_MULTIPLE, התוספת הזו היאArrayListשל אובייקטים מסוגUriשמפנים לתמונות או לסרטונים שרוצים לצרף.
- פעולה
ACTION_VIEW- סכמת URI של נתונים
http:<URL>
https:<URL>- סוג MIME
-
"text/plain""text/html""application/xhtml+xml""application/vnd.wap.xhtml+xml"
- מגדירים מכשיר Android לפיתוח או משתמשים במכשיר וירטואלי.
- מתקינים גרסה של האפליקציה שמטפלת ב-Intent שרוצים לתמוך בהם.
- מפעילים Intent באמצעות
adb:adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \ -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
לדוגמה:
adb shell am start -a android.intent.action.DIAL \ -d tel:555-5555 -n org.example.MyApp/.MyActivity
- אם מגדירים את מסנני ה-Intent הנדרשים, צריך לטפל ב-Intent.
דוגמה לכוונה:
Kotlin
fun createNote(subject: String, text: String) { val intent = Intent(NoteIntents.ACTION_CREATE_NOTE).apply { putExtra(NoteIntents.EXTRA_NAME, subject) putExtra(NoteIntents.EXTRA_TEXT, text) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void createNote(String subject, String text) { Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE) .putExtra(NoteIntents.EXTRA_NAME, subject) .putExtra(NoteIntents.EXTRA_TEXT, text); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.CREATE_NOTE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </activity>
טלפון
התחלת שיחה היא פעולה נפוצה באפליקציות טלפון. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן Intent באמצעות המידע שבקטע הבא.
להתחיל שיחת טלפון
כדי לפתוח את אפליקציית הטלפון ולחייג למספר טלפון, משתמשים בפעולה ACTION_DIAL ומציינים מספר טלפון באמצעות סכמת ה-URI הבאה. כשאפליקציית הטלפון נפתחת, מספר הטלפון מוצג בה, והמשתמש צריך ללחוץ על הלחצן התקשרות כדי להתחיל את השיחה.
כדי לבצע שיחת טלפון ישירות, משתמשים בפעולה ACTION_CALL ומציינים מספר טלפון באמצעות סכמת ה-URI הבאה. כשאפליקציית הטלפון נפתחת, השיחה מתחילה. המשתמש לא צריך ללחוץ על הכפתור שיחה.
כדי לבצע את הפעולה ACTION_CALL, צריך להוסיף את ההרשאה CALL_PHONE לקובץ המניפסט:
<uses-permission android:name="android.permission.CALL_PHONE" />
מספרי טלפון תקינים הם אלה שמוגדרים ב-IETF RFC 3966. דוגמאות לפורמטים תקינים:
החייגן של אפליקציית "טלפון" יודע לנרמל סכמות, כמו מספרי טלפון. לכן, הסכימה שמתוארת לא נדרשת בהכרח בשיטה Uri.parse().
עם זאת, אם לא ניסיתם סכימה או שאתם לא בטוחים אם אפשר לטפל בה, השתמשו בשיטה Uri.fromParts() במקום זאת.
דוגמה לכוונה:
Kotlin
fun dialPhoneNumber(phoneNumber: String) { val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void dialPhoneNumber(String phoneNumber) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
חיפוש
בהמשך מפורטות פעולות נפוצות של אפליקציות חיפוש, כולל המידע שצריך כדי ליצור מסנן Intent שמפרסם את היכולת של האפליקציה לבצע כל פעולה.
חיפוש באמצעות אפליקציה ספציפית
כדי לתמוך בחיפוש בהקשר של האפליקציה, צריך להצהיר על מסנן Intent באפליקציה עם הפעולה SEARCH_ACTION, כמו שמוצג בדוגמה הבאה למסנן Intent.
הערה: לא מומלץ להשתמש ב-SEARCH_ACTION לחיפוש אפליקציות.
במקום זאת, צריך להטמיע את הפעולה GET_THING כדי להשתמש בתמיכה המובנית של Google Assistant בחיפוש בתוך האפליקציה. מידע נוסף זמין במסמכי התיעוד של Google Assistant בנושא פעולות באפליקציה.
מסנן Intent לדוגמה:
<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 ומציינים את מחרוזת החיפוש ב-extra SearchManager.QUERY.
דוגמה לכוונה:
Kotlin
fun searchWeb(query: String) { val intent = Intent(Intent.ACTION_WEB_SEARCH).apply { putExtra(SearchManager.QUERY, query) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void searchWeb(String query) { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, query); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
הגדרות
כדי לפתוח מסך באפליקציית ההגדרות של המערכת כשהאפליקציה שלכם דורשת מהמשתמש לשנות משהו, צריך להשתמש באחת מהפעולות הבאות של Intent:
דוגמה לכוונה:
Kotlin
fun openWifiSettings() { val intent = Intent(Settings.ACTION_WIFI_SETTINGS) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void openWifiSettings() { Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
העברת הודעות טקסט
כתיבת הודעת SMS או MMS עם קובץ מצורף היא פעולה נפוצה באפליקציות להעברת הודעות טקסט. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן Intent באמצעות המידע שבקטע הבא.
כתיבת הודעת SMS או MMS עם קובץ מצורף
כדי להתחיל הודעת טקסט ב-SMS או ב-MMS, משתמשים באחת מפעולות ה-Intent הבאות ומציינים את פרטי ההודעה, כמו מספר הטלפון, הנושא וגוף ההודעה, באמצעות המפתחות הנוספים הבאים.
דוגמה לכוונה:
Kotlin
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SENDTO).apply { type = HTTP.PLAIN_TEXT_TYPE putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType(HTTP.PLAIN_TEXT_TYPE); intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
כדי לוודא שה-Intent יטופל רק על ידי אפליקציית הודעות, ולא על ידי אפליקציות אחרות של אימייל או יישומים חברתיים, צריך להשתמש בפעולה ACTION_SENDTO ולכלול את סכימת הנתונים "smsto:", כמו בדוגמה הבאה:
Kotlin
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { data = Uri.parse("smsto:") // Only SMS apps respond to this. putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("smsto:")); // Only SMS apps respond to this. intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="text/plain" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
הערה: אם אתם מפתחים אפליקציית הודעות SMS/MMS, אתם צריכים להטמיע מסנני Intent לכמה פעולות נוספות כדי שהאפליקציה תהיה זמינה כאפליקציית סמס ברירת המחדל ב-Android מגרסה 4.4 ואילך. מידע נוסף זמין במאמרי העזרה בכתובת Telephony.
דפדפן אינטרנט
טעינה של כתובת URL היא פעולה נפוצה באפליקציות של דפדפני אינטרנט. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן Intent באמצעות המידע שבקטע הבא.
טעינת כתובת URL
כדי לפתוח דף אינטרנט, משתמשים בפעולה ACTION_VIEW ומציינים את כתובת ה-URL של הדף בנתוני ה-Intent.
דוגמה לכוונה:
Kotlin
fun openWebPage(url: String) { val webpage: Uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, webpage) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void openWebPage(String url) { Uri webpage = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, webpage); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
מסנן Intent לדוגמה:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <!-- Include the host attribute if you want your app to respond only to URLs with your app's domain. --> <data android:scheme="http" android:host="www.example.com" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The BROWSABLE category is required to get links from web pages. --> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> </activity>
טיפ: אם אפליקציית Android שלכם מספקת פונקציונליות דומה לזו של האתר, כדאי לכלול מסנן Intent לכתובות URL שמפנות לאתר. אם האפליקציה מותקנת אצל המשתמשים, קישורים מאימיילים או מדפי אינטרנט אחרים שמפנים לאתר שלכם יפתחו את האפליקציה ל-Android במקום את דף האינטרנט. מידע נוסף על טיפול ב-Android App Links
החל מ-Android 12 (רמת API 31), Intent גנרי של אינטרנט מפעיל פעילות באפליקציה רק אם האפליקציה אושרה לדומיין הספציפי שכלול ב-Intent הזה. אם האפליקציה לא מאושרת לדומיין, ה-intent באינטרנט יפנה לאפליקציית דפדפן ברירת המחדל של המשתמש.
אימות של אובייקטי Intent באמצעות Android Debug Bridge
כדי לוודא שהאפליקציה מגיבה ל-intent שאתם רוצים לתמוך בהם, אתם יכולים להשתמש בכלי adb כדי להפעיל intent ספציפיים:
מידע נוסף זמין במאמר הנפקת פקודות מעטפת.