Intencje umożliwiają rozpoczęcie działania w innej aplikacji poprzez opisanie czynności, którą chcesz wykonać, np. „wyświetl mapę” lub „zrób zdjęcie”, w obiekcie Intent
. Ten typ intencji nazywa się implikowaną, ponieważ nie określa komponentu aplikacji do uruchomienia, ale zamiast tego określa działanie i podaje dane potrzebne do jego wykonania.
Gdy wywołasz startActivity()
lub startActivityForResult()
i przekazujesz niejawny zamiar, system rozwiązuje zamiar na aplikację, która może go obsłużyć, i uruchamia odpowiednią funkcję Activity
. Jeśli istnieje więcej niż jedna aplikacja, która może obsłużyć dany zamiar, system wyświetli użytkownikowi okno, w którym będzie on mógł wybrać aplikację.
Na tej stronie opisaliśmy kilka domyślnych intencji, których możesz używać do wykonywania typowych działań. Są one uporządkowane według typu aplikacji, która obsługuje daną intencję. Każda sekcja zawiera też informacje o tym, jak utworzyć filtr intencji, aby reklamować możliwość wykonania danej czynności przez aplikację.
Uwaga: jeśli na urządzeniu nie ma aplikacji, która może odbierać niejawne intencje, aplikacja ulegnie awarii, gdy wywoła funkcję startActivity()
. Aby najpierw sprawdzić, czy istnieje aplikacja, która może odebrać intencję, wywołaj funkcję resolveActivity()
obiektu Intent
. Jeśli wynik jest inny niż null, istnieje co najmniej 1 aplikacja, która może obsłużyć intencję, i można bezpiecznie wywołać funkcję startActivity()
. Jeśli wynik jest pusty, nie używaj intencji i w miarę możliwości wyłącz funkcję, która ją wywołuje.
Jeśli nie wiesz, jak tworzyć intencje lub filtry intencji, najpierw przeczytaj artykuł Intencje i filtry intencji.
Aby dowiedzieć się, jak wywoływać intencje wymienione na tej stronie z hosta deweloperskiego, zapoznaj się z sekcją Sprawdzanie intencji za pomocą mostu debugowania Androida.
Komendy głosowe Google
Google Voice Działania wywołuje niektóre intencje wymienione na tej stronie w odpowiedzi na polecenia głosowe. Więcej informacji znajdziesz w artykule Pierwsze kroki z systemowymi działaniami głosowymi.
Budzik
Poniżej znajdziesz najczęstsze działania związane z aplikacjami budzików, w tym informacje potrzebne do utworzenia filtra intencji, aby reklamować możliwość wykonania danego działania przez aplikację.
Tworzenie alarmu
Aby utworzyć nowy alarm, użyj działania ACTION_SET_ALARM
i określ szczegóły alarmu, takie jak godzina i wiadomość, za pomocą podanych niżej opcji dodatkowych.
Uwaga: w Androidzie 2.3 (poziom interfejsu API 9) i starszych dostępne są tylko godzina, minuty i dodatkowe informacje o wiadomości. Pozostałe dodatki są dostępne w wyższych wersjach platformy.
- Czynność
ACTION_SET_ALARM
- Identyfikator URI danych
- Brak
- Typ MIME
- Brak
- Dodatki
-
EXTRA_HOUR
- Godzina alarmu.
EXTRA_MINUTES
- Minuty alarmu.
EXTRA_MESSAGE
- Niestandardowy komunikat identyfikujący alarm.
EXTRA_DAYS
-
ArrayList
zawierający wszystkie dni tygodnia, w których ma się powtarzać ten alarm. Każdy dzień musi być zadeklarowany za pomocą liczby całkowitej z klasyCalendar
, np.MONDAY
.W przypadku alarmu jednorazowego nie określaj tego dodatkowego parametru.
EXTRA_RINGTONE
- Identyfikator URI
content:
określający dzwonek do użycia z alarmem lubVALUE_RINGTONE_SILENT
, jeśli dzwonek ma nie być używany.Aby użyć domyślnego dzwonka, nie podawaj tego dodatku.
EXTRA_VIBRATE
- Wartość logiczna określająca, czy alarm ma wibrować.
EXTRA_SKIP_UI
- Wartość logiczna określająca, czy aplikacja odpowiadająca na wywołanie musi pominąć interfejs użytkownika podczas ustawiania alarmu. Jeśli to pole ma wartość „Prawda”, aplikacja musi pominąć interfejs potwierdzenia i ustawić określony alarm.
Przykład intencji:
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); } }
Aby wywołać działanie ACTION_SET_ALARM
, aplikacja musi mieć uprawnienie SET_ALARM
:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
Przykład filtra intencji:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Tworzenie minutnika
Aby utworzyć licznik odliczający, użyj działania ACTION_SET_TIMER
i określ szczegóły licznika, takie jak czas trwania, za pomocą tych dodatków.
Uwaga: ten zamiar jest dostępny w Androidzie 4.4 (poziom interfejsu API 19) i nowszych.
- Czynność
ACTION_SET_TIMER
- Identyfikator URI danych
- Brak
- Typ MIME
- Brak
- Dodatki
-
EXTRA_LENGTH
- Czas trwania timera w sekundach.
EXTRA_MESSAGE
- Niestandardowa wiadomość identyfikująca minutnik.
EXTRA_SKIP_UI
- Wartość logiczna określająca, czy aplikacja odpowiadająca na wywołanie musi pominąć interfejs użytkownika podczas ustawiania minutnika. Jeśli to pole ma wartość true, aplikacja musi pominąć interfejs potwierdzenia i uruchomić określony timer.
Przykład intencji:
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); } }
Aby wywołać działanie ACTION_SET_TIMER
, aplikacja musi mieć uprawnienie SET_ALARM
:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
Przykład filtra intencji:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Pokaż wszystkie alarmy
Aby wyświetlić listę alarmów, użyj czynności ACTION_SHOW_ALARMS
.
Chociaż niewiele aplikacji wywołuje ten zamiar, ponieważ jest on używany głównie przez aplikacje systemowe, każda aplikacja, która działa jak budzik, może zaimplementować ten filtr zamiaru i zareagować, wyświetlając listę bieżących alarmów.
Uwaga: ten zamiar jest dostępny w Androidzie 4.4 (poziom interfejsu API 19) i nowszych.
- Czynność
ACTION_SHOW_ALARMS
- Identyfikator URI danych
- Brak
- Typ MIME
- Brak
Przykład filtra intencji:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Kalendarz
Dodawanie wydarzenia to typowe działanie w przypadku aplikacji kalendarza. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następnej sekcji.
Dodawanie wydarzenia do kalendarza
Aby dodać nowe wydarzenie do kalendarza użytkownika, użyj akcji ACTION_INSERT
i określ URI danych za pomocą parametru Events.CONTENT_URI
.
Następnie możesz określić różne szczegóły zdarzenia za pomocą tych dodatkowych opcji.
- Czynność
ACTION_INSERT
- Identyfikator URI danych
Events.CONTENT_URI
- Typ MIME
"vnd.android.cursor.dir/event"
- Dodatki
-
EXTRA_EVENT_ALL_DAY
- Wartość logiczna określająca, czy jest to wydarzenie całodniowe.
EXTRA_EVENT_BEGIN_TIME
- Czas rozpoczęcia zdarzenia (w milisekundach od początku epoki).
EXTRA_EVENT_END_TIME
- Czas zakończenia zdarzenia (w milisekundach od początku epoki).
TITLE
- Nazwa wydarzenia.
DESCRIPTION
- Opis wydarzenia.
EVENT_LOCATION
- Lokalizacja wydarzenia.
EXTRA_EMAIL
- Lista adresów e-mail zaproszonych osób rozdzielona przecinkami.
Korzystając z konstant zdefiniowanych w klasie
CalendarContract.EventsColumns
, możesz podać znacznie więcej szczegółów zdarzenia.
Przykład intencji:
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); } }
Przykład filtra intencji:
<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>
Aparat
Poniżej znajdziesz listę typowych działań związanych z aplikacją aparatu, w tym informacje potrzebne do utworzenia filtra intencji, który reklamuje możliwość wykonania danego działania przez aplikację.
Zrób zdjęcie lub nagraj film i oddaj je
Aby otworzyć aplikację aparatu i otrzymać zdjęcie lub film, użyj działania ACTION_IMAGE_CAPTURE
lub ACTION_VIDEO_CAPTURE
. W dodatkowym polu EXTRA_OUTPUT
określ też lokalizację identyfikatora URI, w której aparat ma zapisywać zdjęcia lub filmy.
- Czynność
ACTION_IMAGE_CAPTURE
lub
ACTION_VIDEO_CAPTURE
- Schemat URI danych
- Brak
- Typ MIME
- Brak
- Dodatki
-
EXTRA_OUTPUT
- Lokalizacja identyfikatora URI, w której aplikacja aparatu zapisuje zdjęcie lub plik wideo (jako obiekt
Uri
).
Gdy aplikacja aparatu zwróci fokus na Twoją aktywność (czyli gdy aplikacja otrzyma wywołanie zwrotne onActivityResult()
), możesz uzyskać dostęp do zdjęcia lub filmu pod adresem URI określonym za pomocą wartości EXTRA_OUTPUT
.
Uwaga: gdy użyjesz parametru ACTION_IMAGE_CAPTURE
do zrobienia zdjęcia, aparat może też zwrócić zmniejszoną kopię lub miniaturę tego zdjęcia w wyniku Intent
, zapisaną jako Bitmap
w dodatkowym polu o nazwie "data"
.
Przykład intencji:
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. ... } }
Aby to zrobić w przypadku Androida 12 (poziom API 31) lub nowszego, zapoznaj się z tym przykładem intencji.
Przykład intencji:
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>
Więcej informacji o używaniu tego zamiaru do robienia zdjęć, w tym o tworzeniu odpowiedniego Uri
dla lokalizacji wyjściowej, znajdziesz w artykule Robienie zdjęć lub Robienie filmów.
Przykład filtra intencji:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Podczas obsługi tej intencji sprawdź, czy w przychodzącym Intent
jest dodatkowy element EXTRA_OUTPUT
, a następnie zapisz zrobione zdjęcie lub nagrany film w lokalizacji określonej przez ten dodatkowy element i wywołaj setResult()
z Intent
, który zawiera skompresowany miniaturę w dodatkowym elemencie o nazwie "data"
.
Uruchom aplikację aparatu w trybie zdjęć
Aby otworzyć aplikację aparatu w trybie zdjęć, użyj działania INTENT_ACTION_STILL_IMAGE_CAMERA
.
- Czynność
INTENT_ACTION_STILL_IMAGE_CAMERA
- Schemat URI danych
- Brak
- Typ MIME
- Brak
- Dodatki
- Brak
Przykład intencji:
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); } }
Przykład filtra intencji:
<activity ...> <intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Uruchom aplikację aparatu w trybie wideo.
Aby otworzyć aplikację aparatu w trybie wideo, użyj działania INTENT_ACTION_VIDEO_CAMERA
.
- Czynność
INTENT_ACTION_VIDEO_CAMERA
- Schemat URI danych
- Brak
- Typ MIME
- Brak
- Dodatki
- Brak
Przykład intencji:
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); } }
Przykład filtra intencji:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Aplikacja Kontakty/Osoby
Poniżej znajdziesz typowe działania związane z aplikacjami do zarządzania kontaktami, w tym informacje potrzebne do utworzenia filtra intencji, aby reklamować możliwość wykonania danego działania przez aplikację.
Wybierz kontakt
Aby umożliwić użytkownikowi wybranie kontaktu i udostępnienie aplikacji dostępu do wszystkich informacji o nim, użyj działania ACTION_PICK
i wskaż typ MIME jako Contacts.CONTENT_TYPE
.
Wynik Intent
zwrócony do wywołania zwrotnego onActivityResult()
zawiera identyfikator URI content:
wskazujący wybrany kontakt. Odpowiedź przyznaje Twojej aplikacji tymczasowe uprawnienia do odczytu tego kontaktu za pomocą interfejsu Contacts Provider API, nawet jeśli aplikacja nie zawiera uprawnienia READ_CONTACTS
.
Wskazówka: jeśli potrzebujesz dostępu tylko do określonych informacji kontaktowych, takich jak numer telefonu lub adres e-mail, zapoznaj się z następnym rozdziałem, aby wybrać określone dane kontaktowe.
- Czynność
ACTION_PICK
- Schemat URI danych
- Brak
- Typ MIME
Contacts.CONTENT_TYPE
Przykład intencji:
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. ... } }
Informacje o tym, jak poznać szczegóły kontaktu, gdy znasz jego identyfikator URI, znajdziesz w artykule Pobieranie szczegółów kontaktu.
Gdy pobierasz identyfikator URI kontaktu za pomocą tego zamiaru, zazwyczaj nie musisz mieć uprawnieńREAD_CONTACTS
do odczytu podstawowych informacji o tym kontakcie, takich jak wyświetlana nazwa czy oznaczenie gwiazdką. Jeśli jednak chcesz odczytywać bardziej szczegółowe dane o danym kontakcie, np. jego numer telefonu lub adres e-mail, musisz mieć uprawnienie READ_CONTACTS
.
Wybierz konkretne dane kontaktowe
Aby użytkownik mógł wybrać konkretny element informacji o kontaktach, np. numer telefonu, adres e-mail lub inny typ danych, użyj działania ACTION_PICK
i określ typ MIME jako jeden z tych typów treści, np. CommonDataKinds.Phone.CONTENT_TYPE
, aby uzyskać numer telefonu kontaktu.
Uwaga: w wielu przypadkach aplikacja musi mieć uprawnienie READ_CONTACTS
do wyświetlania określonych informacji o kontakcie.
Jeśli chcesz pobrać tylko jeden typ danych z kontaktu, ta metoda z użyciem funkcji CONTENT_TYPE
z klasy ContactsContract.CommonDataKinds
jest bardziej wydajna niż użycie funkcji Contacts.CONTENT_TYPE
, jak pokazano w poprzedniej sekcji. Wynik daje bezpośredni dostęp do odpowiednich danych bez konieczności wykonywania bardziej złożonego zapytania do dostawcy kontaktów.
Wynik Intent
zwrócony do wywołania zwrotnego onActivityResult()
zawiera identyfikator URI content:
wskazujący wybrane dane kontaktowe. Odpowiedź przyznaje Twojej aplikacji tymczasowe uprawnienia do odczytu tych danych kontaktów, nawet jeśli aplikacja nie ma uprawnienia READ_CONTACTS
.
- Czynność
ACTION_PICK
- Schemat URI danych
- Brak
- Typ MIME
-
CommonDataKinds.Phone.CONTENT_TYPE
- Wybierz kontakt z numerem telefonu.
CommonDataKinds.Email.CONTENT_TYPE
- Wybierz kontakty z adresem e-mail.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
- Wybierz kontakty z adresem pocztowym.
Możesz też użyć jednej z wielu innych wartości
CONTENT_TYPE
podContactsContract
.
Przykład intencji:
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. //... } } }
Wyświetlanie kontaktu
Aby wyświetlić szczegóły znanego kontaktu, użyj działania ACTION_VIEW
i jako dane intencji podaj URI kontaktu content:
.
Istnieją 2 podstawowe sposoby początkowego pobrania identyfikatora URI kontaktu:
- Użyj identyfikatora URI kontaktu zwróconego przez działanie
ACTION_PICK
pokazane w poprzedniej sekcji. Takie podejście nie wymaga żadnych uprawnień aplikacji. - Otwórz listę wszystkich kontaktów bezpośrednio, jak opisano w sekcji Pobieranie listy kontaktów. To podejście wymaga uprawnienia
READ_CONTACTS
.
- Czynność
ACTION_VIEW
- Schemat URI danych
content:<URI>
- Typ MIME
- Brak. Typ jest określany na podstawie identyfikatora URI kontaktu.
Przykład intencji:
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); } }
Edytowanie istniejącego kontaktu
Aby edytować znany kontakt, użyj działania ACTION_EDIT
, określ kontakt za pomocą identyfikatora URI content:
jako danych o intencji i uwzględnij wszystkie znane informacje kontaktowe w elementach dodatkowych określonych za pomocą stałych w ContactsContract.Intents.Insert
.
Istnieją 2 podstawowe sposoby pobierania identyfikatora URI kontaktu:
- Użyj identyfikatora URI kontaktu zwróconego przez działanie
ACTION_PICK
pokazane w poprzedniej sekcji. Takie podejście nie wymaga żadnych uprawnień aplikacji. - Otwórz listę wszystkich kontaktów bezpośrednio, jak opisano w sekcji Pobieranie listy kontaktów. To podejście wymaga uprawnienia
READ_CONTACTS
.
- Czynność
ACTION_EDIT
- Schemat URI danych
content:<URI>
- Typ MIME
- Typ jest określany na podstawie identyfikatora URI kontaktu.
- Dodatki
- Co najmniej 1 z opcji dodatkowych zdefiniowanych w sekcji
ContactsContract.Intents.Insert
, aby wypełnić pola danych kontaktowych.
Przykład intencji:
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); } }
Więcej informacji o edytowaniu kontaktu znajdziesz w artykule Modyfikowanie kontaktów za pomocą intencji.
Wstawianie kontaktu
Aby wstawić nowy kontakt, użyj działania ACTION_INSERT
, określ Contacts.CONTENT_TYPE
jako typ MIME i dodaj znane informacje o kontakcie w dodatkowych danych określonych za pomocą stałych w ContactsContract.Intents.Insert
.
- Czynność
ACTION_INSERT
- Schemat URI danych
- Brak
- Typ MIME
Contacts.CONTENT_TYPE
- Dodatki
- Co najmniej 1 z dodatków zdefiniowanych w
ContactsContract.Intents.Insert
.
Przykład intencji:
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); } }
Więcej informacji o wstawianiu kontaktów znajdziesz w artykule Modyfikowanie kontaktów za pomocą intencji.
Wysyłając e-mailem
Tworzenie e-maila z opcjonalnymi załącznikami jest typową czynnością w aplikacjach poczty e-mail. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następnej sekcji.
Tworzenie e-maila z opcjonalnymi załącznikami
Aby stworzyć e-maila, użyj jednej z tych czynności w zależności od tego, czy chcesz dołączyć załączniki, a także podaj szczegóły e-maila, takie jak odbiorca i temat, korzystając z wymienionych dodatkowych kluczy.
- Czynność
ACTION_SENDTO
(brak załącznika) lub
ACTION_SEND
(jeden załącznik) lub
ACTION_SEND_MULTIPLE
(wiele załączników)- Schemat URI danych
- Brak
- Typ MIME
-
"text/plain"
"*/*"
- Dodatki
-
Intent.EXTRA_EMAIL
- Tablica ciągów znaków zawierająca wszystkie adresy e-mail odbiorców z pola „Do”.
Intent.EXTRA_CC
- Tablica ciągów tekstowych zawierająca wszystkie adresy e-mail odbiorców w kopii.
Intent.EXTRA_BCC
- Tablica ciągów znaków zawierająca wszystkie adresy e-mail odbiorców w kopii „UDW”.
Intent.EXTRA_SUBJECT
- Ciąg tekstowy z tematem e-maila.
Intent.EXTRA_TEXT
- Ciąg z treścią e-maila.
Intent.EXTRA_STREAM
Uri
wskazujący załącznik. Jeśli używasz czynnościACTION_SEND_MULTIPLE
, jest to obiektArrayList
zawierający wiele obiektówUri
.
Przykład intencji:
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); } }
Jeśli chcesz mieć pewność, że Twoja intencja jest obsługiwana tylko przez aplikację poczty e-mail, a nie przez aplikację do obsługi wiadomości tekstowych ani aplikację społecznościową, użyj działania ACTION_SENDTO
i uwzględnij schemat danych "mailto:"
, jak w tym przykładzie:
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); } }
Przykład filtra intencji:
<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>
Miejsce na pliki
Poniżej znajdziesz typowe działania związane z aplikacjami do przechowywania plików, w tym informacje potrzebne do utworzenia filtra intencji, który reklamuje możliwość wykonania danej czynności przez aplikację.
Pobieranie określonego typu pliku
Aby poprosić użytkownika o wybranie pliku, np. dokumentu lub zdjęcia, i zwrócenie odwołania do Twojej aplikacji, użyj działania ACTION_GET_CONTENT
i określ odpowiedni typ MIME. Odwołanie do pliku zwrócone do aplikacji jest tymczasowe w ramach bieżącego cyklu życia aktywności, więc jeśli chcesz uzyskać do niego dostęp później, musisz zaimportować kopię, którą możesz odczytać w późniejszym czasie.
Ta intencja umożliwia też użytkownikowi utworzenie nowego pliku. Na przykład zamiast wybierać istniejące zdjęcie, użytkownik może zrobić nowe zdjęcie aparatem.
Intencją wyniku dostarczoną do metody onActivityResult()
są dane z identyfikatorem URI wskazującym na plik.
Identyfikator URI może być dowolny, np. http:
, file:
lub content:
. Jeśli jednak chcesz ograniczyć pliki do tych, które są dostępne od dostawcy treści (identyfikator URI content:
) i są dostępne jako strumień plików z openFileDescriptor()
, dodaj kategorię CATEGORY_OPENABLE
do intencji.
Na Androidzie 4.3 (poziom interfejsu API 18) i nowszych możesz też zezwolić użytkownikowi na wybranie wielu plików, dodając do intencji element EXTRA_ALLOW_MULTIPLE
z wartością true
.
Następnie możesz uzyskać dostęp do wszystkich wybranych plików w obiekcie ClipData
zwróconym przez funkcję getClipData()
.
- Czynność
ACTION_GET_CONTENT
- Schemat URI danych
- Brak
- Typ MIME
- Typ MIME odpowiadający typowi pliku, który musi wybrać użytkownik.
- Dodatki
-
EXTRA_ALLOW_MULTIPLE
- Wartość logiczna określająca, czy użytkownik może wybrać więcej niż 1 plik naraz.
EXTRA_LOCAL_ONLY
- Wartość logiczna określająca, czy zwrócony plik musi być dostępny bezpośrednio z urządzenia, a nie wymagać pobrania z usługi zdalnej.
- Kategoria (opcjonalnie)
-
CATEGORY_OPENABLE
- Aby zwrócić tylko „otwieralne” pliki, które można przedstawić jako strumień plików za pomocą
openFileDescriptor()
.
Przykład intencji polegającej na zrobieniu zdjęcia:
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. ... } }
Przykład filtra intencji z celem zwrócenia zdjęcia:
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
. --> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
Otwieranie określonego typu pliku
Zamiast pobierać kopię pliku, który musisz zaimportować do aplikacji, za pomocą działania ACTION_GET_CONTENT
, gdy aplikacja działa na Androidzie 4.4 lub nowszym, możesz zamiast tego poprosić o otworzenie pliku zarządzanego przez inną aplikację, używając działania ACTION_OPEN_DOCUMENT
i określając typ MIME.
Aby umożliwić użytkownikowi utworzenie nowego dokumentu, do którego Twoja aplikacja będzie mogła zapisywać dane, użyj zamiast tego działania ACTION_CREATE_DOCUMENT
.
Na przykład zamiast wybierać spośród istniejących dokumentów PDF, za pomocą intencji ACTION_CREATE_DOCUMENT
użytkownicy mogą wybrać, gdzie chcą utworzyć nowy dokument, na przykład w innej aplikacji, która zarządza miejscem na dane dokumentu. Aplikacja otrzymuje lokalizację identyfikatora URI, w której może zapisać nowy dokument.
Intencje przekazywane do metody onActivityResult()
z działania ACTION_GET_CONTENT
mogą zwracać identyfikator URI dowolnego typu, ale intencje wywołujące działanie ACTION_OPEN_DOCUMENT
i ACTION_CREATE_DOCUMENT
zawsze określają wybrany plik jako identyfikator URI content:
, który jest obsługiwany przez DocumentsProvider
. Możesz otworzyć plik za pomocą openFileDescriptor()
i zapytać o jego szczegóły za pomocą kolumn z DocumentsContract.Document
.
Zwrócony identyfikator URI przyznaje aplikacji długoterminowy dostęp do pliku z możliwością odczytu, a także ewentualnie z możliwością zapisu. Działanie ACTION_OPEN_DOCUMENT
jest szczególnie przydatne, gdy chcesz odczytać istniejący plik bez tworzenia jego kopii w aplikacji lub gdy chcesz otworzyć i zmodyfikować plik w miejscu.
Możesz też pozwolić użytkownikowi wybrać wiele plików, dodając do intencji element EXTRA_ALLOW_MULTIPLE
z wartością true
.
Jeśli użytkownik wybierze tylko jeden element, możesz go pobrać z getData()
.
Jeśli użytkownik wybierze więcej niż 1 element, funkcja getData()
zwróci wartość null. Zamiast tego musisz pobrać każdy element z obiektu ClipData
zwracanego przez funkcję getClipData()
.
Uwaga: intencja musi określać typ MIME i musi deklarować kategorię CATEGORY_OPENABLE
. W razie potrzeby możesz określić więcej niż jeden typ MIME, dodając tablicę typów MIME z dodatkową wartością EXTRA_MIME_TYPES
. W takim przypadku musisz ustawić podstawowy typ MIME w elemencie setType()
jako "*/*"
.
- Czynność
ACTION_OPEN_DOCUMENT
lub
ACTION_CREATE_DOCUMENT
- Schemat URI danych
- Brak
- Typ MIME
- Typ MIME odpowiadający typowi pliku, który musi wybrać użytkownik.
- Dodatki
-
EXTRA_MIME_TYPES
- Tablica typów MIME odpowiadających typom plików, których aplikacja potrzebuje. Jeśli korzystasz z tej opcji dodatkowej, musisz ustawić podstawowy typ MIME w elemencie
setType()
na"*/*"
. EXTRA_ALLOW_MULTIPLE
- Wartość logiczna określająca, czy użytkownik może wybrać więcej niż 1 plik naraz.
EXTRA_TITLE
- Do użycia z opcją
ACTION_CREATE_DOCUMENT
w celu określenia początkowej nazwy pliku. EXTRA_LOCAL_ONLY
- Wartość logiczna określająca, czy zwrócony plik musi być dostępny bezpośrednio z urządzenia, a nie wymagać pobrania z usługi zdalnej.
- Kategoria
-
CATEGORY_OPENABLE
- Aby zwrócić tylko „otwieralne” pliki, które można przedstawić jako strumień plików za pomocą
openFileDescriptor()
.
Przykład intencji polegającej na zrobieniu zdjęcia:
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. ... } }
Aplikacje innych firm nie mogą odpowiadać na intencje z działaniem ACTION_OPEN_DOCUMENT
. Zamiast tego system otrzymuje tę intencję i wyświetla wszystkie pliki dostępne w różnych aplikacjach w ujednoliconym interfejsie użytkownika.
Aby udostępniać pliki aplikacji w tym interfejsie i umożliwiać ich otwieranie innym aplikacjom, musisz zaimplementować DocumentsProvider
i uwzględnić filtr intencji PROVIDER_INTERFACE
("android.content.action.DOCUMENTS_PROVIDER"
), jak pokazano w tym przykładzie:
<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>
Więcej informacji o otwieraniu plików zarządzanych przez Twoją aplikację z innych aplikacji znajdziesz w artykule Otwieranie plików za pomocą platformy Storage Access Framework.
Działania lokalne
Zamawianie taksówki to typowe działanie lokalne. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następnej sekcji.
Zamów taksówkę
Aby zamówić taksówkę, użyj czynności ACTION_RESERVE_TAXI_RESERVATION
.
Uwaga: aplikacje muszą poprosić użytkownika o potwierdzenie przed wykonaniem tej czynności.
- Czynność
ACTION_RESERVE_TAXI_RESERVATION
- Identyfikator URI danych
- Brak
- Typ MIME
- Brak
- Dodatki
- Brak
Przykład intencji:
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); } }
Przykład filtra intencji:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Mapy
Wyświetlanie lokalizacji na mapie jest częstym działaniem w przypadku aplikacji mapowych. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następnej sekcji.
Wyświetlanie lokalizacji na mapie
Aby otworzyć mapę, użyj działania ACTION_VIEW
i określ informacje o lokalizacji w danych intencji za pomocą jednego z tych schematów.
- Czynność
ACTION_VIEW
- Schemat URI danych
-
geo:latitude,longitude
- Pokaż mapę w danej szerokości i długości geograficznej.
Przykład:
"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
- Pokaż mapę na danej długości i szerokości geograficznej przy określonym powiększeniu. Poziom powiększenia 1 pokazuje całą Ziemię, z centrum w danym punkcie lat,lng. Najwyższy (najbliższy) poziom powiększenia to 23.
Przykład:
"geo:47.6,-122.3?z=11"
geo:0,0?q=lat,lng(label)
- Wyświetlanie mapy na podanej długości i szerokości geograficznej z etykietą ciągu znaków.
Przykład:
"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address
- Pokaż lokalizację „mój adres ulicy”, która może być konkretnym adresem lub zapytaniem o lokalizację.
Przykład:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
Uwaga: wszystkie ciągi znaków przekazywane w za pomocą parametru
geo
w URI muszą być zakodowane. Na przykład ciąg znaków1st & Pike, Seattle
zmieni się na1st%20%26%20Pike%2C%20Seattle
. Spacje w ciągu są kodowane za pomocą znaku%20
lub zastępowane znakiem plusa (+
).
- Typ MIME
- Brak
Przykład intencji:
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); } }
Przykład filtra intencji:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Muzyka lub film
Poniżej znajdziesz najczęstsze działania w przypadku aplikacji muzycznych i wideo, w tym informacje potrzebne do utworzenia filtra intencji, aby reklamować możliwość wykonania danego działania w aplikacji.
Odtwarzanie pliku multimedialnego
Aby odtworzyć plik muzyczny, użyj działania ACTION_VIEW
i określ lokalizację identyfikatora URI pliku w danych intencji.
- Czynność
ACTION_VIEW
- Schemat URI danych
-
file:<URI>
content:<URI>
http:<URL>
- Typ MIME
-
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
- lub innych, których wymaga Twoja aplikacja.
Przykład intencji:
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); } }
Przykład filtra intencji:
<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>
odtwarzanie muzyki na podstawie zapytania wyszukiwania;
Aby odtwarzać muzykę na podstawie zapytania wyszukiwania, użyj inencji INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
. Aplikacja może wywołać tę intencję w odpowiedzi na polecenie głosowe użytkownika dotyczące odtwarzania muzyki. Aplikacja, która otrzymuje ten intencjonalny obiekt, wyszukuje w swoim katalogu treści pasujące do podanego zapytania i odtwarza je.
W tym zamiarze należy uwzględnić dodatkowy ciąg znaków EXTRA_MEDIA_FOCUS
, który określa docelowy tryb wyszukiwania. Na przykład tryb wyszukiwania może określać, czy wyszukiwanie dotyczy nazwy wykonawcy czy utworu.
- Czynność
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- Schemat URI danych
- Brak
- Typ MIME
- Brak
- Dodatki
-
MediaStore.EXTRA_MEDIA_FOCUS
(pole wymagane)-
Wskazuje tryb wyszukiwania: czy użytkownik szuka konkretnego wykonawcy, albumu, utworu czy playlisty. Większość trybów wyszukiwania wymaga dodatkowych informacji. Jeśli na przykład użytkownik chce posłuchać konkretnego utworu, jego zamiar może obejmować 3 dodatkowe elementy: tytuł utworu, wykonawcę i album. Ta intencja obsługuje te tryby wyszukiwania dla każdej wartości
EXTRA_MEDIA_FOCUS
:Dowolny –
"vnd.android.cursor.item/*"
-
odtwarzać dowolną muzykę, Aplikacja odbiorcza odtwarza muzykę na podstawie inteligentnego wyboru, np. ostatniej playlisty odsłuchanej przez użytkownika.
Dodatkowe funkcje:
QUERY
(wymagany): pusty ciąg znaków. Ta opcja jest zawsze udostępniana ze względu na zgodność wsteczną. Istniejące aplikacje, które nie znają trybów wyszukiwania, mogą przetwarzać ten zamiar jako wyszukiwanie nieustrukturyzowane.
Nieustrukturowany –
"vnd.android.cursor.item/*"
-
odtworzyć konkretny utwór, album lub gatunek na podstawie nieustrukturyzowanego zapytania; Aplikacje mogą generować zamiar w tym trybie wyszukiwania, gdy nie mogą zidentyfikować typu treści, które użytkownik chce odsłuchać. W miarę możliwości używaj bardziej szczegółowych trybów wyszukiwania.
Dodatkowe funkcje:
QUERY
(wymagany): ciąg znaków zawierający dowolną kombinację wykonawcy, albumu, tytułu utworu lub gatunku.
Gatunek –
Audio.Genres.ENTRY_CONTENT_TYPE
-
odtwarzanie muzyki określonego gatunku;
Dodatkowe funkcje:
"android.intent.extra.genre"
(wymagany) – gatunek.QUERY
(wymagany): gatunek. Ta opcja jest zawsze dostępna ze względu na zgodność wsteczną. Istniejące aplikacje, które nie znają trybów wyszukiwania, mogą przetwarzać ten zamiar jako wyszukiwanie nieustrukturyzowane.
Artysta –
Audio.Artists.ENTRY_CONTENT_TYPE
-
odtwarzanie muzyki konkretnego wykonawcy;
Dodatkowe funkcje:
EXTRA_MEDIA_ARTIST
(wymagany): wykonawca."android.intent.extra.genre"
: gatunek.QUERY
(wymagany): ciąg znaków zawierający dowolną kombinację wykonawcy lub gatunku. Ta opcja jest zawsze udostępniana ze względu na zgodność wsteczną. Istniejące aplikacje, które nie znają trybów wyszukiwania, mogą przetwarzać ten zamiar jako wyszukiwanie nieustrukturyzowane.
-
odtwarzanie muzyki z konkretnego albumu;
Dodatkowe funkcje:
EXTRA_MEDIA_ALBUM
(wymagany): album.EXTRA_MEDIA_ARTIST
: wykonawca."android.intent.extra.genre"
: gatunek.QUERY
(wymagany): ciąg znaków zawierający dowolną kombinację albumu lub wykonawcy. Ta opcja jest zawsze udostępniana ze względu na zgodność wsteczną. Istniejące aplikacje, które nie znają trybów wyszukiwania, mogą przetwarzać ten zamiar jako wyszukiwanie nieustrukturyzowane.
Utwór –
"vnd.android.cursor.item/audio"
-
odtworzenie konkretnego utworu;
Dodatkowe funkcje:
EXTRA_MEDIA_ALBUM
: album.EXTRA_MEDIA_ARTIST
: wykonawca."android.intent.extra.genre"
: gatunek.EXTRA_MEDIA_TITLE
(wymagany): nazwa utworu.QUERY
(wymagany): ciąg znaków zawierający dowolną kombinację albumu, wykonawcy, gatunku lub tytułu. Ta opcja jest zawsze udostępniana ze względu na zgodność wsteczną. Istniejące aplikacje, które nie znają trybów wyszukiwania, mogą przetwarzać ten zamiar jako wyszukiwanie nieustrukturyzowane.
Playlista –
Audio.Playlists.ENTRY_CONTENT_TYPE
-
odtwarzanie konkretnej playlisty lub playlisty, która spełnia określone kryteria, aby uzyskać dodatkowe opcje;
Dodatkowe funkcje:
EXTRA_MEDIA_ALBUM
: album.EXTRA_MEDIA_ARTIST
: wykonawca."android.intent.extra.genre"
: gatunek."android.intent.extra.playlist"
: playlista.EXTRA_MEDIA_TITLE
: nazwa utworu, na którym oparta jest playlista.QUERY
(wymagany): ciąg znaków zawierający dowolną kombinację albumu, wykonawcy, gatunku, playlisty lub tytułu. Ta opcja jest zawsze udostępniana ze względu na zgodność wsteczną. Istniejące aplikacje, które nie znają trybów wyszukiwania, mogą przetwarzać ten zamiar jako wyszukiwanie nieustrukturyzowane.
Przykład intencji:
Jeśli użytkownik chce słuchać muzyki danego wykonawcy, aplikacja wyszukiwania może wygenerować taki zamiar:
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); } }
Przykład filtra intencji:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Podczas obsługi tej intencji w swojej aktywności sprawdź wartość dodatkowego parametru EXTRA_MEDIA_FOCUS
w wejściowym parametrze Intent
, aby określić tryb wyszukiwania. Gdy Twoja aktywność zidentyfikuje tryb wyszukiwania, zapoznaj się z wartościami dodatkowych opcji w tym trybie.
Dzięki tym informacjom aplikacja może przeprowadzić wyszukiwanie w swoim katalogu, aby odtworzyć treści pasujące do zapytania wyszukiwania. Pokazuje to poniższy przykład.
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); } } }
Nowa notatka
Tworzenie notatek to typowa czynność w przypadku aplikacji do tworzenia notatek. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następnej sekcji.
Tworzenie notatki
Aby utworzyć nową notatkę, użyj działania
ACTION_CREATE_NOTE
i określ szczegóły notatki, takie jak temat i tekst, za pomocą podanych poniżej dodatków.
Uwaga: aplikacje muszą poprosić użytkownika o potwierdzenie przed wykonaniem tej czynności.
- Czynność
-
ACTION_CREATE_NOTE
- Schemat URI danych
- Brak
- Typ MIME
-
PLAIN_TEXT_TYPE
- "*/*"
- Dodatki
-
-
EXTRA_NAME
- Ciąg tekstowy wskazujący tytuł lub temat notatki.
-
EXTRA_TEXT
- Ciąg tekstowy zawierający treść notatki.
-
- Czynność
-
ACTION_DIAL
– otwiera aplikację Telefon lub Dialer.ACTION_CALL
– nawiązuje połączenie telefoniczne (wymaga uprawnieniaCALL_PHONE
).
- Schemat URI danych
-
tel:<phone-number>
voicemail:<phone-number>
- Typ MIME
- Brak
tel:2125551212
tel:(212) 555 1212
- Czynność
-
"com.google.android.gms.actions.SEARCH_ACTION"
- Obsługa zapytań wyszukiwania z usług komend głosowych Google.
- Dodatki
-
QUERY
- Ciąg tekstowy zawierający zapytanie.
- Czynność
ACTION_WEB_SEARCH
- Schemat URI danych
- Brak
- Typ MIME
- Brak
- Dodatki
-
SearchManager.QUERY
- Ciąg wyszukiwania.
- Czynność
-
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
Aby uzyskać więcej informacji o dodatkowych ekranach ustawień, zapoznaj się z dokumentacją
Settings
. - Schemat URI danych
- Brak
- Typ MIME
- Brak
- Czynność
ACTION_SENDTO
lub
ACTION_SEND
lub
ACTION_SEND_MULTIPLE
- Schemat URI danych
-
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>
Wszystkie te schematy są obsługiwane w ten sam sposób.
- Typ MIME
-
"text/plain"
"image/*"
"video/*"
- Dodatki
-
"subject"
- Ciąg znaków dla tematu wiadomości (zwykle tylko w przypadku MMS-ów).
"sms_body"
- Tekst SMS-a.
EXTRA_STREAM
-
Uri
wskazujący obraz lub film do załączenia. Jeśli używasz działaniaACTION_SEND_MULTIPLE
, ten dodatkowy element toArrayList
obiektówUri
wskazujących obrazy lub filmy do załączenia.
- Czynność
ACTION_VIEW
- Schemat URI danych
http:<URL>
https:<URL>
- Typ MIME
-
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
- Skonfiguruj urządzenie z Androidem na potrzeby tworzenia aplikacji lub użyj urządzenia wirtualnego.
- Zainstaluj wersję aplikacji, która obsługuje intencje, które chcesz obsługiwać.
- Wywołaj intent za pomocą
adb
:adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \ -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
Przykład:
adb shell am start -a android.intent.action.DIAL \ -d tel:555-5555 -n org.example.MyApp/.MyActivity
- Jeśli zdefiniujesz wymagane filtry intencji, obsługuj intencję.
Przykład intencji:
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); } }
Przykład filtra intencji:
<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>
Telefon
Rozpoczynanie połączeń jest częstym działaniem w przypadku aplikacji telefonicznych. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następnej sekcji.
Zainicjowanie połączenia głosowego
Aby otworzyć aplikację telefonu i wybrać numer telefonu, użyj działania ACTION_DIAL
i określ numer telefonu za pomocą tego schematu URI. Po otwarciu aplikacji telefonicznej wyświetlany jest numer telefonu. Aby rozpocząć połączenie, użytkownik musi kliknąć przycisk Zadzwoń.
Aby zadzwonić bezpośrednio, użyj działania ACTION_CALL
i podaj numer telefonu za pomocą tego schematu URI. Gdy otworzy się aplikacja Telefon, rozpocznie się połączenie. Użytkownik nie musi klikać przycisku Zadzwoń.
Aby wykonać działanie ACTION_CALL
, musisz dodać do pliku manifestu uprawnienia CALL_PHONE
:
<uses-permission android:name="android.permission.CALL_PHONE" />
Prawidłowe numery telefonów to te zdefiniowane w specyfikacji IETF RFC 3966. Przykłady prawidłowych treści:
Dialer w aplikacji Telefon dobrze radzi sobie z normalizacją schematów, takich jak numery telefonów. Oznacza to, że opisana wyżej metoda Uri.parse()
nie wymaga ściśle określonego schematu.
Jeśli jednak nie próbowałeś jeszcze żadnego schematu lub nie masz pewności, czy da się go zastosować, użyj zamiast tego metody Uri.fromParts()
.
Przykład intencji:
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); } }
Szukaj
Poniżej znajdziesz najczęstsze działania związane z aplikacją wyszukiwania, w tym informacje potrzebne do utworzenia filtra intencji, aby reklamować możliwość wykonania danego działania przez aplikację.
Wyszukiwanie w konkretnej aplikacji
Aby umożliwić wyszukiwanie w kontekście aplikacji, zadeklaruj w niej filtr intencji z działaniem SEARCH_ACTION
, jak w tym przykładzie filtra intencji.
Uwaga: nie zalecamy używania SEARCH_ACTION
do wyszukiwania aplikacji.
Zamiast tego zastosuj działanieGET_THING
, aby skorzystać z wbudowanego w Asystencie Google mechanizmu wyszukiwania w aplikacji. Więcej informacji znajdziesz w dokumentacji czynności w aplikacjach Asystenta Google.
Przykład filtra intencji:
<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>
Wyszukiwanie w internecie
Aby rozpocząć wyszukiwanie w internecie, użyj działania ACTION_WEB_SEARCH
i wskaż ciąg znaków w dodatku SearchManager.QUERY
.
Przykład intencji:
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); } }
Ustawienia
Aby otworzyć ekran w aplikacji Ustawienia systemu, gdy aplikacja wymaga od użytkownika wprowadzenia zmian, użyj jednej z tych akcji intencyjnych:
Przykład intencji:
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); } }
Wysyłanie SMS-ów
Tworzenie SMS-ów lub MMS-ów z załącznikiem jest częstym działaniem w przypadku aplikacji do obsługi wiadomości tekstowych. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następnej sekcji.
Tworzenie SMS-a/MMS-a z załącznikiem
Aby zainicjować wysyłanie SMS-a lub MMS-a, użyj jednej z tych akcji intencyjnych i określ szczegóły wiadomości, takie jak numer telefonu, temat i treść wiadomości, za pomocą podanych niżej dodatkowych kluczy.
Przykład intencji:
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); } }
Jeśli chcesz mieć pewność, że Twoja intencja jest obsługiwana tylko przez aplikację do obsługi wiadomości tekstowych, a nie przez inne aplikacje do obsługi poczty e-mail lub aplikacji społecznościowych, użyj działania ACTION_SENDTO
i uwzględnij schemat danych "smsto:"
, jak w tym przykładzie:
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); } }
Przykład filtra intencji:
<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>
Uwaga: jeśli opracowujesz aplikację do obsługi SMS-ów i MMS-ów, musisz zaimplementować filtry intencji dla kilku dodatkowych działań, aby była ona dostępna jako domyślna aplikacja do obsługi SMS-ów w wersji Androida 4.4 lub nowszej. Więcej informacji znajdziesz w dokumentacji na stronie Telephony
.
Przeglądarka
Ładowanie adresu URL strony internetowej jest typowym działaniem w przypadku aplikacji przeglądarek internetowych. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następnej sekcji.
Ładowanie adresu URL
Aby otworzyć stronę internetową, użyj działania ACTION_VIEW
i wskaż adres URL witryny w danych intencji.
Przykład intencji:
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); } }
Przykład filtra intencji:
<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>
Wskazówka: jeśli aplikacja na Androida zapewnia funkcje podobne do tych, które oferuje Twoja witryna, dodaj filtr intencji dla adresów URL, które wskazują na Twoją witrynę. Jeśli użytkownicy mają zainstalowaną Twoją aplikację, linki w e-mailach lub na innych stronach internetowych odsyłające do Twojej witryny otwierają aplikację na Androida zamiast strony internetowej. Więcej informacji znajdziesz w artykule Obsługa linków aplikacji na Androida.
Od Androida 12 (poziom interfejsu API 31) ogólny zamiar internetowy jest przekształcany w działanie w aplikacji tylko wtedy, gdy aplikacja jest zatwierdzona w przypadku konkretnej domeny zawartej w tym zamiarze internetowym. Jeśli aplikacja nie jest zatwierdzona w przypadku domeny, intencja internetowa zostanie przekierowana do domyślnej przeglądarki użytkownika.
Weryfikowanie intencji za pomocą Android Debug Bridge
Aby sprawdzić, czy aplikacja reaguje na intencje, które chcesz obsługiwać, możesz użyć narzędzia adb
, aby wywołać określone intencje. W tym celu:
Więcej informacji znajdziesz w artykule Wykonywanie poleceń w powłoce.