כוונות נפוצות

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 שמפרסם את היכולת של האפליקציה לבצע כל פעולה.

יצירת שעון מעורר

פעולות קוליות של Google

  • "set an alarm for 7 am"

כדי ליצור התראה חדשה, משתמשים בפעולה 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>

יצירת טיימר

פעולות קוליות של Google

  • "set timer for 5 minutes"

כדי ליצור טיימר לספירה לאחור, משתמשים בפעולה 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".

הפעלת אפליקציית מצלמה במצב תמונה סטטית

פעולות קוליות של Google

  • "take a picture"

כדי לפתוח אפליקציית מצלמה במצב תמונה, משתמשים בפעולה 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>

פותחים את אפליקציית המצלמה במצב וידאו.

פעולות קוליות של Google

  • "תצלם סרטון"

כדי לפתוח אפליקציית מצלמה במצב וידאו, משתמשים בפעולה 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_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);
    }
}

אם אתם רוצים לוודא שה-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 supports OpenableColumns
             and ContentResolver.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 באמצעות המידע שבקטע הבא.

הזמנת מונית

פעולות קוליות של Google

  • "get me a taxi"
  • "תזמין לי מונית"

(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);
    }
}

מסנן 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>

השמעת מוזיקה על סמך שאילתת חיפוש

פעולות קוליות של Google

  • "play michael jackson billie jean"

כדי להשמיע מוזיקה על סמך שאילתת חיפוש, משתמשים ב-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 הזה כחיפוש לא מובנה.

אומן – Audio.Artists.ENTRY_CONTENT_TYPE

להשמיע מוזיקה של אומן מסוים.

תוספות:

  • ‫EXTRA_MEDIA_ARTIST (חובה): האומן.
  • ‫"android.intent.extra.genre": הז'אנר.
  • ‫QUERY (חובה): מחרוזת שמכילה שילוב כלשהו של האומן או הז'אנר. התוספת הזו תמיד מסופקת לצורך תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-intent הזה כחיפוש לא מובנה.

אלבום – Audio.Albums.ENTRY_CONTENT_TYPE

להשמיע מוזיקה מאלבום מסוים.

תוספות:

  • ‫EXTRA_MEDIA_ALBUM (חובה): האלבום.
  • ‫EXTRA_MEDIA_ARTIST: האומן.
  • ‫"android.intent.extra.genre": הז'אנר.
  • ‫QUERY (חובה): מחרוזת שמכילה שילוב כלשהו של האלבום או האומן. התוספת הזו תמיד מסופקת לצורך תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-Intent הזה כחיפוש לא מובנה.

שיר – "vnd.android.cursor.item/audio"

להשמיע שיר מסוים.

תוספות:

  • ‫EXTRA_MEDIA_ALBUM: האלבום.
  • ‫EXTRA_MEDIA_ARTIST: האומן.
  • ‫"android.intent.extra.genre": הז'אנר.
  • ‫EXTRA_MEDIA_TITLE (חובה): שם השיר.
  • ‫QUERY (חובה): מחרוזת שמכילה שילוב כלשהו של האלבום, האומן, הז'אנר או שם השיר. התוספת הזו תמיד מסופקת לצורך תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-intent הזה כחיפוש לא מובנה.

פלייליסט – Audio.Playlists.ENTRY_CONTENT_TYPE

הפעלת פלייליסט מסוים או פלייליסט שתואם לקריטריונים מסוימים שצוינו בתוספות.

תוספות:

  • ‫EXTRA_MEDIA_ALBUM: האלבום.
  • ‫EXTRA_MEDIA_ARTIST: האומן.
  • ‫"android.intent.extra.genre": הז'אנר.
  • ‫"android.intent.extra.playlist": הפלייליסט.
  • ‫EXTRA_MEDIA_TITLE: שם השיר שעליו מבוססת הפלייליסט.
  • ‫QUERY (חובה): מחרוזת שמכילה שילוב כלשהו של האלבום, האומן, הז'אנר, הפלייליסט או השם. התוספת הזו תמיד מסופקת לצורך תאימות לדורות קודמים. אפליקציות קיימות שלא מכירות את מצבי החיפוש יכולות לעבד את ה-intent הזה כחיפוש לא מובנה.

דוגמה לכוונה:

אם המשתמש רוצה להאזין למוזיקה של אומן מסוים, אפליקציית חיפוש יכולה ליצור את ה-Intent הבא:

Kotlin

fun playSearchArtist(artist: String) {
    val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply {
        putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE)
        putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist)
        putExtra(SearchManager.QUERY, artist)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Java

public void playSearchArtist(String artist) {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH);
    intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS,
                    MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE);
    intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist);
    intent.putExtra(SearchManager.QUERY, artist);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

מסנן Intent לדוגמה:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

כשמטפלים ב-intent הזה בפעילות, בודקים את הערך של EXTRA_MEDIA_FOCUS הנוסף ב-Intent הנכנס כדי לקבוע את מצב החיפוש. אחרי שהפעילות תזהה את מצב החיפוש, קוראים את הערכים של התוספות הנוספות של מצב החיפוש הספציפי הזה. בעזרת המידע הזה, האפליקציה יכולה לבצע את החיפוש במלאי שלה כדי להפעיל את התוכן שתואם לשאילתת החיפוש. הדוגמה הבאה ממחישה את זה.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) {

        val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS)
        val query: String? = intent.getStringExtra(SearchManager.QUERY)

        // Some of these extras might not be available depending on the search mode.
        val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM)
        val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST)
        val genre: String? = intent.getStringExtra("android.intent.extra.genre")
        val playlist: String? = intent.getStringExtra("android.intent.extra.playlist")
        val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE)

        // Determine the search mode and use the corresponding extras.
        when {
            mediaFocus == null -> {
                // 'Unstructured' search mode (backward compatible)
                playUnstructuredSearch(query)
            }
            mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> {
                if (query?.isNotEmpty() == true) {
                    // 'Unstructured' search mode.
                    playUnstructuredSearch(query)
                } else {
                    // 'Any' search mode.
                    playResumeLastPlaylist()
                }
            }
            mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Genre' search mode.
                playGenre(genre)
            }
            mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Artist' search mode.
                playArtist(artist, genre)
            }
            mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Album' search mode.
                playAlbum(album, artist)
            }
            mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> {
                // 'Song' search mode.
                playSong(album, artist, genre, title)
            }
            mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> {
                // 'Playlist' search mode.
                playPlaylist(album, artist, genre, playlist, title)
            }
        }
    }
}

Java

protected void onCreate(Bundle savedInstanceState) {
    //...
    Intent intent = this.getIntent();
    if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) {

        String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS);
        String query = intent.getStringExtra(SearchManager.QUERY);

        // Some of these extras might not be available depending on the search mode.
        String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM);
        String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST);
        String genre = intent.getStringExtra("android.intent.extra.genre");
        String playlist = intent.getStringExtra("android.intent.extra.playlist");
        String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE);

        // Determine the search mode and use the corresponding extras.
        if (mediaFocus == null) {
            // 'Unstructured' search mode (backward compatible).
            playUnstructuredSearch(query);

        } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) {
            if (query.isEmpty()) {
                // 'Any' search mode.
                playResumeLastPlaylist();
            } else {
                // 'Unstructured' search mode.
                playUnstructuredSearch(query);
            }

        } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) {
            // 'Genre' search mode.
            playGenre(genre);

        } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) {
            // 'Artist' search mode.
            playArtist(artist, genre);

        } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) {
            // 'Album' search mode.
            playAlbum(album, artist);

        } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) {
            // 'Song' search mode.
            playSong(album, artist, genre, title);

        } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) {
            // 'Playlist' search mode.
            playPlaylist(album, artist, genre, playlist, title);
        }
    }
}

הערה חדשה

יצירת פתק היא פעולה נפוצה באפליקציות לרישום הערות. כדי לפרסם את היכולת של האפליקציה לבצע את הפעולה הזו, צריך ליצור מסנן Intent באמצעות המידע שבקטע הבא.

יצירת הערה

כדי ליצור פתק חדש, משתמשים בפעולה ACTION_CREATE_NOTE ומציינים את פרטי הפתק, כמו הנושא והטקסט, באמצעות הפרטים הנוספים הבאים.

הערה: האפליקציות חייבות לבקש אישור מהמשתמש לפני ביצוע הפעולה הזו.

פעולה
ACTION_CREATE_NOTE
סכמת URI של נתונים
ללא
סוג MIME
PLAIN_TEXT_TYPE
"*/*"
תוספות
EXTRA_NAME
מחרוזת שמציינת את הכותרת או הנושא של הפתק.
EXTRA_TEXT
מחרוזת שמציינת את הטקסט של ההערה.

דוגמה לכוונה:

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 הבאה. כשאפליקציית הטלפון נפתחת, מספר הטלפון מוצג בה, והמשתמש צריך ללחוץ על הלחצן התקשרות כדי להתחיל את השיחה.

פעולות קוליות של Google

  • "call 555-5555"
  • "call bob"
  • "call voicemail"

כדי לבצע שיחת טלפון ישירות, משתמשים בפעולה ACTION_CALL ומציינים מספר טלפון באמצעות סכמת ה-URI הבאה. כשאפליקציית הטלפון נפתחת, השיחה מתחילה. המשתמש לא צריך ללחוץ על הכפתור שיחה.

כדי לבצע את הפעולה ACTION_CALL, צריך להוסיף את ההרשאה CALL_PHONE לקובץ המניפסט:

<uses-permission android:name="android.permission.CALL_PHONE" />
פעולה
  • ACTION_DIAL – פתיחת החייגן או אפליקציית "טלפון".
  • ‫ACTION_CALL – מבצע שיחת טלפון (נדרשת ההרשאה CALL_PHONE)
סכמת URI של נתונים
  • tel:<phone-number>
  • voicemail:<phone-number>
סוג MIME
ללא

מספרי טלפון תקינים הם אלה שמוגדרים ב-IETF RFC 3966. דוגמאות לפורמטים תקינים:

  • tel:2125551212
  • tel:(212) 555 1212

החייגן של אפליקציית "טלפון" יודע לנרמל סכמות, כמו מספרי טלפון. לכן, הסכימה שמתוארת לא נדרשת בהכרח בשיטה 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 שמפרסם את היכולת של האפליקציה לבצע כל פעולה.

חיפוש באמצעות אפליקציה ספציפית

פעולות קוליות של Google

  • "search for cat videos on myvideoapp"

כדי לתמוך בחיפוש בהקשר של האפליקציה, צריך להצהיר על מסנן Intent באפליקציה עם הפעולה SEARCH_ACTION, כמו שמוצג בדוגמה הבאה למסנן Intent.

הערה: לא מומלץ להשתמש ב-SEARCH_ACTION לחיפוש אפליקציות. במקום זאת, צריך להטמיע את הפעולה GET_THING כדי להשתמש בתמיכה המובנית של Google Assistant בחיפוש בתוך האפליקציה. מידע נוסף זמין במסמכי התיעוד של Google Assistant בנושא פעולות באפליקציה.

פעולה
"com.google.android.gms.actions.SEARCH_ACTION"
תמיכה בשאילתות חיפוש מפעולות קוליות של Google.
תוספות
QUERY
מחרוזת שמכילה את שאילתת החיפוש.

מסנן 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.

פעולה
ACTION_WEB_SEARCH
סכמת URI של נתונים
ללא
סוג MIME
ללא
תוספות
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:

פעולה
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
ללא

דוגמה לכוונה:

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 הבאות ומציינים את פרטי ההודעה, כמו מספר הטלפון, הנושא וגוף ההודעה, באמצעות המפתחות הנוספים הבאים.

פעולה
ACTION_SENDTO או
ACTION_SEND או
ACTION_SEND_MULTIPLE
סכמת URI של נתונים
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>

כל הסכמות האלה מטופלות באותו אופן.

סוג MIME
"text/plain"
"image/*"
"video/*"
תוספות
"subject"
מחרוזת לנושא ההודעה (בדרך כלל רק ל-MMS).
"sms_body"
מחרוזת להודעת SMS.
EXTRA_STREAM
Uri שמצביע על התמונה או הסרטון שרוצים לצרף. אם משתמשים בפעולה ACTION_SEND_MULTIPLE, התוספת הזו היא ArrayList של אובייקטים מסוג Uri שמפנים לתמונות או לסרטונים שרוצים לצרף.

דוגמה לכוונה:

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

פעולות קוליות של Google

  • "open example.com"

כדי לפתוח דף אינטרנט, משתמשים בפעולה ACTION_VIEW ומציינים את כתובת ה-URL של הדף בנתוני ה-Intent.

פעולה
ACTION_VIEW
סכמת URI של נתונים
http:<URL>
https:<URL>
סוג MIME
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

דוגמה לכוונה:

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 ספציפיים:

  1. מגדירים מכשיר Android לפיתוח או משתמשים במכשיר וירטואלי.
  2. מתקינים גרסה של האפליקציה שמטפלת ב-Intent שרוצים לתמוך בהם.
  3. מפעילים 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
    
  4. אם מגדירים את מסנני ה-Intent הנדרשים, צריך לטפל ב-Intent.

מידע נוסף זמין במאמר הנפקת פקודות מעטפת.