Popularne intencje

Intencja umożliwia rozpoczęcie aktywności w innej aplikacji przez opisanie Działanie, które chcesz wykonać, na przykład „wyświetlenie mapy”. lub „Zrób obraz”, w obiekcie Intent. Ten typ intencji nazywa się implikowaną, ponieważ nie określa komponentu aplikacji, który ma zostać uruchomiony, ale zamiast tego określa działanie i zawiera dane potrzebne do jego wykonania.

Gdy dzwonisz pod numer startActivity() lub startActivityForResult() i przekazać jej intencję niejawną, system rozwiązuje intencję do aplikacji, która może obsłużyć intencję i rozpocznie odpowiadające wartości 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 opisujemy 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ę. W każdej sekcji znajdziesz też informacje o tym, jak utworzyć filtr intencji, aby reklamować możliwość wykonania danej czynności przez Twoją aplikację.

Uwaga: jeśli na urządzeniu nie ma aplikacji, których można użyć uzyskać pośrednią intencję, a aplikacja ulega awarii, gdy wywołuje metodę startActivity(). Najpierw sprawdź, czy istnieje aplikacja do odbierania intencji, wywołaj resolveActivity() w obiekcie 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, przeczytaj najpierw artykuł Intencje i intencje”. Filtry.

Aby dowiedzieć się, jak uruchamiać w aplikacji intencje wymienione na tej stronie Więcej informacji znajdziesz w artykule Weryfikowanie intencji w narzędziu Android Debugowanie. Mostek.

Komendy głosowe Google

Google Voice, Actions uruchamia niektóre z intencji wymienionych na tej stronie w odpowiedzi na poleceń głosowych. 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, który reklamuje możliwość wykonania danego działania przez aplikację.

Tworzenie alarmu

Komendy głosowe Google

  • „Ustaw alarm na 7:00”

Aby utworzyć nowy alarm, użyj akcji ACTION_SET_ALARMi określ szczegóły alarmu, takie jak godzina i wiadomość, za pomocą podanych niżej opcji dodatkowych.

Uwaga: dostępne są tylko godziny, minuty i dodatkowe wiadomości. w Androidzie 2.3 (poziom API 9) i starszych. Inne dodatki są dostępne w wyższych wersjach platformy.

Działanie
ACTION_SET_ALARM
Identyfikator URI danych
Brak
Typ MIME
Brak
Dodatki
EXTRA_HOUR
Godzina alarmu.
EXTRA_MINUTES
Czas trwania alarmu w minutach.
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 klasy Calendar, np. MONDAY.

W przypadku alarmu jednorazowego nie należy określać opcji dodatkowej.

EXTRA_RINGTONE
Identyfikator URI content: określający dzwonek do użycia z alarmem lub VALUE_RINGTONE_SILENT, jeśli dzwonek ma nie być używany.

Aby użyć domyślnego dzwonka, nie określaj dodatkowego.

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ładowa intencja:

KotlinJava
fun createAlarm(message: String, hour: Int, minutes: Int) {
    val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_HOUR, hour)
        putExtra(AlarmClock.EXTRA_MINUTES, minutes)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void createAlarm(String message, int hour, int minutes) {
    Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_HOUR, hour)
            .putExtra(AlarmClock.EXTRA_MINUTES, minutes);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
Uwaga:

Aby można było wywołać intencję 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

Komendy głosowe Google

  • „ustaw minutnik na 5 minut”

Aby utworzyć odliczanie, użyj działania ACTION_SET_TIMER i określ licznik czasu takie jak czas trwania przy użyciu następujących dodatków.

Uwaga: ten zamiar jest dostępny w Androidzie 4.4 (poziom interfejsu API 19) i nowszych.

Działanie
ACTION_SET_TIMER
Identyfikator URI danych
Brak
Typ MIME
Brak
Dodatki
EXTRA_LENGTH
Czas trwania samowyzwalacza 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:

KotlinJava
fun startTimer(message: String, seconds: Int) {
    val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void startTimer(String message, int seconds) {
    Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
Uwaga:

Aby można było wywołać intencję ACTION_SET_TIMER, aplikacja musi mieć Uprawnienie SET_ALARM:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

Przykładowy filtr 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.

Działanie
ACTION_SHOW_ALARMS
Identyfikator URI danych
Brak
Typ MIME
Brak

Przykładowy filtr 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ę za pomocą Więcej informacji na ten temat znajdziesz w następnej sekcji.

Dodawanie wydarzenia do kalendarza

Aby dodać nowe wydarzenie do kalendarza użytkownika, użyj akcji ACTION_INSERTi określ URI danych za pomocą parametru Events.CONTENT_URI. Następnie możesz określić różne szczegóły wydarzenia, korzystając z poniższych opcji dodatkowych.

Działanie
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 zdarzenia.
DESCRIPTION
Opis wydarzenia.
EVENT_LOCATION
Lokalizacja wydarzenia.
EXTRA_EMAIL
Lista adresów e-mail zaproszonych osób rozdzielonych przecinkami.

Korzystając z konstant zdefiniowanych w klasie CalendarContract.EventsColumns, możesz podać znacznie więcej szczegółów zdarzenia.

Przykładowa intencja:

KotlinJava
fun addEvent(title: String, location: String, begin: Long, end: Long) {
    val intent = Intent(Intent.ACTION_INSERT).apply {
        data = Events.CONTENT_URI
        putExtra(Events.TITLE, title)
        putExtra(Events.EVENT_LOCATION, location)
        putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
        putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void addEvent(String title, String location, long begin, long end) {
    Intent intent = new Intent(Intent.ACTION_INSERT)
            .setData(Events.CONTENT_URI)
            .putExtra(Events.TITLE, title)
            .putExtra(Events.EVENT_LOCATION, location)
            .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
            .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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 typowe działania związane z aplikacjami 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 zwróć je

Aby otworzyć aplikację aparatu i odebrać zdjęcie lub film, użyj działania ACTION_IMAGE_CAPTURE lub ACTION_VIDEO_CAPTURE. Podaj również lokalizację identyfikatora URI, w której np. aparat, aby zapisać zdjęcie lub film, w EXTRA_OUTPUT dodatkowe.

Działanie
ACTION_IMAGE_CAPTURE lub
ACTION_VIDEO_CAPTURE
Schemat URI danych
Brak
Typ MIME
Brak
Dodatki
EXTRA_OUTPUT
identyfikator URI, w którym aplikacja aparatu zapisuje zdjęcie, lub wideo (jako obiekt Uri).

Po zwróceniu aplikacji aparatu koncentruje się na Twojej aktywności, czyli aplikacja otrzymuje wywołanie zwrotne onActivityResult(). ma dostęp do zdjęcia lub filmu pod podanym identyfikatorem URI wartością EXTRA_OUTPUT.

Uwaga: jeśli używasz ACTION_IMAGE_CAPTURE zrobić zdjęcie, aparat może też zwrócić pomniejszona kopia lub miniatura zdjęcia w wyniku Intent, zapisana jako Bitmap w dodatkowym polu o nazwie "data".

Przykład intencji:

KotlinJava
const val REQUEST_IMAGE_CAPTURE = 1
val locationForPhotos: Uri = ...

fun capturePhoto(targetFilename: String) {
    val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply {
        putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename))
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        val thumbnail: Bitmap = data.getParcelableExtra("data")
        // Do other work with full size photo saved in locationForPhotos.
        ...
    }
}
static final int REQUEST_IMAGE_CAPTURE = 1;
static final Uri locationForPhotos;

public void capturePhoto(String targetFilename) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.withAppendedPath(locationForPhotos, targetFilename));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelableExtra("data");
        // Do other work with full size photo saved in locationForPhotos.
        ...
    }
}

Aby to zrobić w przypadku Androida 12 (poziom interfejsu API 31) lub nowszego, zapoznaj się z poniższym przykładem intencji.

Przykładowa intencja:

KotlinJava
val REQUEST_IMAGE_CAPTURE = 1

private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // Display error state to the user.
    }
}
static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    } catch (ActivityNotFoundException e) {
        // Display error state to the user.
    }
}
</section></div>

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ładowy filtr 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 EXTRA_OUTPUT, a następnie zapisz uchwycony obraz lub film w lokalizacji określonej przez ten dodatkowy Intent i zadzwoń do setResult()Intent, który zawiera skompresowany miniaturę w dodatku o nazwie "data".

Uruchom aplikację aparatu w trybie zdjęć

Komendy głosowe Google

  • „zrób zdjęcie”

Aby otworzyć aplikację aparatu w trybie nieruchomego obrazu, użyj działania INTENT_ACTION_STILL_IMAGE_CAMERA.

Działanie
INTENT_ACTION_STILL_IMAGE_CAMERA
Schemat URI danych
Brak
Typ MIME
Brak
Dodatki
Brak

Przykład intencji:

KotlinJava
private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // Display error state to the user.
    }
}
public void capturePhoto(String targetFilename) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.withAppendedPath(locationForPhotos, targetFilename));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

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>

Uruchamianie aplikacji aparatu w trybie wideo

Komendy głosowe Google

  • „nagrywanie filmu”

Aby otworzyć aplikację aparatu w trybie wideo, użyj działania INTENT_ACTION_VIDEO_CAMERA.

Działanie
INTENT_ACTION_VIDEO_CAMERA
Schemat URI danych
Brak
Typ MIME
Brak
Dodatki
Brak

Przykład intencji:

KotlinJava
fun capturePhoto() {
    val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA)
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)
    }
}
public void capturePhoto() {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

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 dla aplikacji 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 kontaktowych, użyj działania ACTION_PICK i określ 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.

Działanie
ACTION_PICK
Schemat URI danych
Brak
Typ MIME
Contacts.CONTENT_TYPE

Przykład intencji:

KotlinJava
const val REQUEST_SELECT_CONTACT = 1

fun selectContact() {
    val intent = Intent(Intent.ACTION_PICK).apply {
        type = ContactsContract.Contacts.CONTENT_TYPE
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_SELECT_CONTACT)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
        val contactUri: Uri = data.data
        // Do something with the selected contact at contactUri.
        //...
    }
}
static final int REQUEST_SELECT_CONTACT = 1;

public void selectContact() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_CONTACT);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
        Uri contactUri = data.getData();
        // Do something with the selected contact at contactUri.
        ...
    }
}

Aby dowiedzieć się, jak pobrać dane kontaktowe po uzyskaniu identyfikatora URI kontaktu, przeczytaj artykuł Pobierz szczegóły dla kontaktu.

Pobierając identyfikator URI kontaktu za pomocą tej intencji, potrzebują READ_CONTACTS uprawnienia do odczytu podstawowych informacji o danym kontakcie, takich jak wyświetlana nazwa czy kontakt jest oznaczony 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.

Wybieranie konkretnych danych kontaktowych

Aby użytkownik wybrał z kontaktu określoną informację, na przykład: numeru telefonu, adresu e-mail lub innego typu danych, użyj funkcji ACTION_PICK i określ typ MIME na 1 następujących typów treści, takich jak CommonDataKinds.Phone.CONTENT_TYPE, aby uzyskać numer telefonu tego kontaktu.

Uwaga: w wielu przypadkach aplikacja musi mieć uprawnienie READ_CONTACTSdo wyświetlania określonych informacji o kontakcie.

Jeśli chcesz pobierać z konta kontaktu tylko jeden typ danych, ta metoda korzysta z tagu CONTENT_TYPE w Klasy ContactsContract.CommonDataKinds to większa wydajność niż za pomocą 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 dostarczony do wywołania zwrotnego onActivityResult() zawiera Identyfikator URI content: wskazujący wybrane dane kontaktu. Odpowiedź przyznaje Twojej aplikacji tymczasowe uprawnienia do odczytu tych danych kontaktów, nawet jeśli aplikacja nie ma uprawnienia READ_CONTACTS.

Działanie
ACTION_PICK
Schemat URI danych
Brak
Typ MIME
CommonDataKinds.Phone.CONTENT_TYPE
Wybierać z kontaktów za pomocą numeru telefonu.
CommonDataKinds.Email.CONTENT_TYPE
Wybierz z kontaktów z adresem e-mail.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
Wybierz spośród kontaktów z adresem pocztowym.

Możesz też użyć jednej z wielu innych wartości CONTENT_TYPE pod ContactsContract.

Przykładowa intencja:

KotlinJava
const val REQUEST_SELECT_PHONE_NUMBER = 1

fun selectContact() {
    // Start an activity for the user to pick a phone number from contacts.
    val intent = Intent(Intent.ACTION_PICK).apply {
        type = CommonDataKinds.Phone.CONTENT_TYPE
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) {
        // Get the URI and query the content provider for the phone number.
        val contactUri: Uri = data.data
        val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER)
        contentResolver.query(contactUri, projection, null, null, null).use { cursor ->
            // If the cursor returned is valid, get the phone number.
            if (cursor.moveToFirst()) {
                val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER)
                val number = cursor.getString(numberIndex)
                // Do something with the phone number.
                ...
            }
        }
    }
}
static final int REQUEST_SELECT_PHONE_NUMBER = 1;

public void selectContact() {
    // Start an activity for the user to pick a phone number from contacts.
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) {
        // Get the URI and query the content provider for the phone number.
        Uri contactUri = data.getData();
        String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(contactUri, projection,
                null, null, null);
        // If the cursor returned is valid, get the phone number.
        if (cursor != null && cursor.moveToFirst()) {
            int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
            String number = cursor.getString(numberIndex);
            // Do something with the phone number.
            //...
        }
    }
}

Wyświetlanie kontaktu

Aby wyświetlić szczegóły znanego kontaktu, użyj działania ACTION_VIEW i jako dane intencji podaj identyfikator URI kontaktu content:.

Istnieją dwa główne sposoby pobrania identyfikatora URI kontaktu:

  • Użyj identyfikatora URI kontaktu zwróconego przez działanie ACTION_PICK pokazane w poprzedniej sekcji. W tym przypadku nie są wymagane żadne uprawnienia aplikacji.
  • Bezpośredni dostęp do listy wszystkich kontaktów, zgodnie z opisem w sekcji Pobieranie listy kontaktów kontaktów. To podejście wymaga uprawnienia READ_CONTACTS.
Działanie
ACTION_VIEW
Schemat URI danych
content:<URI>
Typ MIME
Brak. Typ jest określany na podstawie identyfikatora URI kontaktu.

Przykład intencji:

KotlinJava
fun viewContact(contactUri: Uri) {
    val intent = Intent(Intent.ACTION_VIEW, contactUri)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void viewContact(Uri contactUri) {
    Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Edytowanie istniejącego kontaktu

Aby edytować znany kontakt, użyj ACTION_EDIT działanie, określ kontakt za pomocą identyfikatora URI content: jako dane intencji oraz uwzględnić wszelkie znane informacje kontaktowe w dodatkach określonych przez stałe w polu ContactsContract.Intents.Insert.

Istnieją dwa główne sposoby pobrania identyfikatora URI kontaktu:

  • Użyj identyfikatora URI kontaktu zwróconego przez działanie ACTION_PICK pokazane w poprzedniej sekcji. W tym przypadku nie są wymagane żadne uprawnienia aplikacji.
  • Otwórz bezpośrednio listę wszystkich kontaktów, korzystając z instrukcji w artykule Pobieranie listy kontaktów. To podejście wymaga uprawnienia READ_CONTACTS.
Działanie
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ładowa intencja:

KotlinJava
fun editContact(contactUri: Uri, email: String) {
    val intent = Intent(Intent.ACTION_EDIT).apply {
        data = contactUri
        putExtra(ContactsContract.Intents.Insert.EMAIL, email)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void editContact(Uri contactUri, String email) {
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setData(contactUri);
    intent.putExtra(Intents.Insert.EMAIL, email);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Więcej informacji na temat edytowania kontaktów można znaleźć w sekcji Modyfikowanie kontaktów kontaktów za pomocą intencji.

Wstaw kontakt

Aby wstawić nowy kontakt, użyj działania ACTION_INSERT. określ Contacts.CONTENT_TYPE jako typ MIME oraz uwzględnij wszelkie znane informacje kontaktowe w opcjach dodatkowych określonych przez stałe w polu ContactsContract.Intents.Insert.

Działanie
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:

KotlinJava
fun insertContact(name: String, email: String) {
    val intent = Intent(Intent.ACTION_INSERT).apply {
        type = ContactsContract.Contacts.CONTENT_TYPE
        putExtra(ContactsContract.Intents.Insert.NAME, name)
        putExtra(ContactsContract.Intents.Insert.EMAIL, email)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void insertContact(String name, String email) {
    Intent intent = new Intent(Intent.ACTION_INSERT);
    intent.setType(Contacts.CONTENT_TYPE);
    intent.putExtra(Intents.Insert.NAME, name);
    intent.putExtra(Intents.Insert.EMAIL, email);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Więcej informacji o wstawianiu kontaktu znajdziesz w artykule Modyfikowanie kontaktów za pomocą intencji.

Wysyłając e-mailem

Tworzenie e-maila z opcjonalnymi załącznikami to typowa czynność w aplikacjach do obsługi poczty e-mail. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację za pomocą Więcej informacji na ten temat znajdziesz w następnej sekcji.

Tworzenie e-maila z opcjonalnymi załącznikami

Aby utworzyć e-maila, wykonaj jedną z poniższych czynności w zależności od tego, czy dołączasz załączniki: i dołączyć szczegóły e-maila, takie jak adresat i temat, korzystając z dodatkowych kluczy.

Działanie
ACTION_SENDTO (jeśli nie ma załącznika) lub
ACTION_SEND (jeśli jest jeden załącznik) lub
ACTION_SEND_MULTIPLE (jeśli są liczne załączniki)
Schemat URI danych
Brak
Typ MIME
"text/plain"
"*/*"
Dodatki
Intent.EXTRA_EMAIL
Tablica ciągów znaków zawierająca wszystkie dane „To” adresy e-mail odbiorców.
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 tekstowy z treścią e-maila.
Intent.EXTRA_STREAM
Uri wskazujący załącznik. Jeśli używasz tagu ACTION_SEND_MULTIPLE to działanie, ArrayList zawierające wiele obiektów Uri.

Przykład intencji:

KotlinJava
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SEND).apply {
        type = "*/*"
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void composeEmail(String[] addresses, String subject, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("*/*");
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Jeśli chcesz mieć pewność, że Twoja intencja jest obsługiwana tylko przez aplikację do obsługi 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:

KotlinJava
fun composeEmail(addresses: Array<String>, subject: String) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:") // Only email apps handle this.
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // Only email apps handle this.
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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 stosunku do bieżącej aktywności cyklu życia, więc jeśli chcesz uzyskać do niej dostęp później, musisz zaimportować kopię, którą możesz przeczytać później.

Ta intencja umożliwia też użytkownikowi utworzenie nowego pliku. Dla: na przykład zamiast wybierać istniejące już zdjęcie, użytkownik może zrobić nowe zdjęcie aparatem.

Intencją wyniku przekazaną 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 wyboru tylko do tych, które są dostępne od dostawcy treści (identyfikator URI content:) dostępne jako strumień plików z openFileDescriptor(), dodaj kategorię CATEGORY_OPENABLE.

Na Androidzie 4.3 (poziom interfejsu API 18) i nowszych możesz też zezwolić użytkownikowi na wybranie wielu plików, dodając EXTRA_ALLOW_MULTIPLE do intencji z wartością true. Następnie możesz uzyskać dostęp do wszystkich wybranych plików w obiekcie ClipDatazwróconym przez funkcję getClipData().

Działanie
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 zamiaru zrobienia zdjęcia:

KotlinJava
const val REQUEST_IMAGE_GET = 1

fun selectImage() {
    val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
        type = "image/*"
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_GET)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) {
        val thumbnail: Bitmap = data.getParcelableExtra("data")
        val fullPhotoUri: Uri = data.data
        // Do work with photo saved at fullPhotoUri.
        ...
    }
}
static final int REQUEST_IMAGE_GET = 1;

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_GET);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelable("data");
        Uri fullPhotoUri = data.getData();
        // Do work with photo saved at fullPhotoUri.
        ...
    }
}

Przykładowy filtr intencji, który wyświetli zdjęcie:

<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>

Otwieranie pliku określonego typu

Zamiast pobierać kopię pliku, który trzeba zaimportować do aplikacji, na Androidzie za pomocą działania ACTION_GET_CONTENT w wersji 4.4 lub nowszej możesz zamiast tego poprosić o otwarcie pliku zarządzanego przez inną aplikację przez za pomocą działania ACTION_OPEN_DOCUMENT i określić typ MIME. Aby też umożliwić użytkownikowi tworzenie nowego dokumentu, w którym aplikacja może zapisywać, 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_DOCUMENTuż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_DOCUMENTACTION_CREATE_DOCUMENT zawsze określają wybrany plik jako identyfikator URI content:, który jest obsługiwany przez DocumentsProvider. Plik cookie możesz otworzyć plik z: openFileDescriptor() i zapytanie o jego szczegóły za pomocą kolumn z kolumny DocumentsContract.Document.

Zwrócony identyfikator URI zapewnia aplikacji długoterminowy dostęp do pliku z możliwością odczytu. z uprawnieniami do zapisu. Akcja ACTION_OPEN_DOCUMENT jest szczególnie przydatna, 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 EXTRA_ALLOW_MULTIPLE określa intencję, ustaw wartość true. Jeśli użytkownik wybierze tylko 1 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 musi zadeklarować kategorię CATEGORY_OPENABLE. W razie potrzeby możesz określić więcej niż jeden typ MIME, dodając tablicę typów MIME z dodatkowym parametrem EXTRA_MIME_TYPES. W takim przypadku musisz ustawić podstawowy typ MIME w parametrze setType() na "*/*".

Działanie
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 chcesz użyć tego dodatkowego, musisz ustawić podstawowy typ MIME w setType() do "*/*".
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 zasadą ACTION_CREATE_DOCUMENT, aby określić pierwszą nazwę pliku.
EXTRA_LOCAL_ONLY
Wartość logiczna określająca, czy zwrócony plik musi być dostępny bezpośrednio z do urządzenia, bez konieczności pobierania 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 zamiaru zrobienia zdjęcia:

KotlinJava
const val REQUEST_IMAGE_OPEN = 1

fun selectImage2() {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        type = "image/*"
        addCategory(Intent.CATEGORY_OPENABLE)
    }
    // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
    startActivityForResult(intent, REQUEST_IMAGE_OPEN)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) {
        val fullPhotoUri: Uri = data.data
        // Do work with full size photo saved at fullPhotoUri.
        ...
    }
}
static final int REQUEST_IMAGE_OPEN = 1;

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("image/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
    startActivityForResult(intent, REQUEST_IMAGE_OPEN);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) {
        Uri fullPhotoUri = data.getData();
        // Do work with full size photo saved at fullPhotoUri.
        ...
    }
}

Aplikacje innych firm nie mogą odpowiedzieć na intencję za pomocą parametru Działanie ACTION_OPEN_DOCUMENT. Zamiast tego system otrzymuje i wyświetla wszystkie pliki dostępne w różnych aplikacjach w ujednoliconym interfejsie.

Aby udostępniać pliki aplikacji w tym interfejsie i umożliwiać otwieranie ich przez inne aplikacje, 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>

Aby dowiedzieć się więcej o tym, jak umożliwić otwieranie plików zarządzanych przez Twoją aplikację z innych aplikacji, przeczytaj artykuł Otwieranie plików za pomocą platformy dostępu do pamięci masowej.

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ę

Komendy głosowe Google

  • „Zamów mi taksówkę”
  • „Zadzwoń mi samochód”

(dotyczy tylko Wear OS)

Aby zamówić taksówkę, użyj czynności ACTION_RESERVE_TAXI_RESERVATION.

Uwaga: aplikacje muszą poprosić użytkownika o potwierdzenie, zanim wykonają to działanie.

Działanie
ACTION_RESERVE_TAXI_RESERVATION
Identyfikator URI danych
Brak
Typ MIME
Brak
Dodatki
Brak

Przykład intencji:

KotlinJava
fun callCar() {
    val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void callCar() {
    Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Przykładowy filtr 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 typowym 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.

Pokaż lokalizację 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.

Działanie
ACTION_VIEW
Schemat identyfikatora URI danych
geo:latitude,longitude
Pokaż mapę przy danej długości i szerokoś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. Powiększenie: 1 wskazuje całą Ziemię w środku współrzędnych geograficznych. 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ę w polu „mój adres pocztowy”, który 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 identyfikatorze URI geo muszą zakodować. Na przykład ciąg tekstowy 1st & Pike, Seattle zmieni się na 1st%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:

KotlinJava
fun showMap(geoLocation: Uri) {
    val intent = Intent(Intent.ACTION_VIEW).apply {
        data = geoLocation
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void showMap(Uri geoLocation) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(geoLocation);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Przykładowy filtr 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 typowe działania w aplikacjach do odtwarzania muzyki i filmów – m.in. informacje, których potrzebujesz aby utworzyć filtr intencji i reklamować możliwość wykonania poszczególnych działań przez aplikację.

Odtwarzanie pliku multimedialnego

Aby odtworzyć plik muzyczny, użyj działania ACTION_VIEW i określić lokalizację identyfikatora URI pliku w danych intencji.

Działanie
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 potrzebuje Twoja aplikacja.

Przykładowa intencja:

KotlinJava
fun playMedia(file: Uri) {
    val intent = Intent(Intent.ACTION_VIEW).apply {
        data = file
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void playMedia(Uri file) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(file);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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;

Komendy głosowe Google

  • „włącz michaela jacksona Billie jean”

Aby odtwarzać muzykę na podstawie zapytania wyszukiwania, użyj intencji 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 tej intencji uwzględnij ciąg znaków EXTRA_MEDIA_FOCUS , który określa zamierzony tryb wyszukiwania. Tryb wyszukiwania może na przykład określać, czy wyszukiwanie dotyczy nazwy wykonawcy lub utworu.

Działanie
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 dodatków. Jeśli na przykład użytkownik jest zainteresowany słuchaniem konkretnego utworu, zamiar może mieć 3 dodatkowe materiały: tytuł utworu, wykonawcę i album. Ta intencja obsługuje te tryby wyszukiwania dla każdej wartości EXTRA_MEDIA_FOCUS:

Dowolna"vnd.android.cursor.item/*"

odtwarzać dowolną muzykę, Aplikacja odbierająca odtwarza muzykę na podstawie inteligentnego wyboru, takiego jak jako ostatniej playlisty, której odsłuchiwał użytkownik.

Dodatkowe dodatki:

  • QUERY (wymagany): pusty ciąg znaków. Ten dodatek jest zawsze zapewnia zgodność wsteczną. Istniejące aplikacje, które nie znają trybów wyszukiwania, mogą przetwarzać ten zamiar jako wyszukiwanie nieustrukturyzowane.

Nieuporządkowane"vnd.android.cursor.item/*"

odtworzyć konkretny utwór, album lub gatunek na podstawie nieustrukturyzowanego zapytania; Aplikacje mogą generować użytkowników korzystających z tego trybu wyszukiwania, gdy nie potrafią określić, jakiego rodzaju treści chce których słuchają. W miarę możliwości używaj bardziej szczegółowych trybów wyszukiwania.

Dodatkowe dodatki:

  • QUERY (wymagany): ciąg znaków zawierający dowolną kombinację. informacje o wykonawcy, albumie, tytule lub gatunku.

GatunekAudio.Genres.ENTRY_CONTENT_TYPE

odtwarzać muzyki z konkretnego gatunku;

Dodatkowe dodatki:

  • "android.intent.extra.genre" (wymagany) – gatunek.
  • QUERY (wymagany): gatunek. Ten dodatek jest zawsze podawany dla zgodności wstecznej. Dotychczasowe aplikacje, które nie znają trybów wyszukiwania, mogą jako nieustrukturyzowane wyszukiwanie.

WykonawcaAudio.Artists.ENTRY_CONTENT_TYPE

odtwarzanie muzyki konkretnego wykonawcy;

Dodatkowe dodatki:

  • EXTRA_MEDIA_ARTIST (wymagany): wykonawca.
  • "android.intent.extra.genre": gatunek.
  • QUERY (wymagany): ciąg znaków zawierający dowolną kombinację wykonawcy lub gatunku. Ten dodatek zawsze zapewnia zgodność wsteczną. Istniejące aplikacje, które nie znają trybów wyszukiwania, mogą przetworzyć tę intencję jako nieustrukturyzowaną .

AlbumAudio.Albums.ENTRY_CONTENT_TYPE

włączyć muzykę z konkretnego albumu;

Dodatkowe dodatki:

  • 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 dodatkowa opcja jest zawsze udostępniana ze względu na zgodność wsteczną. Istniejące aplikacje, które nie wiedzą o trybach wyszukiwania, mogą przetworzyć tę intencję jako wyszukiwania w nieuporządkowanych danych.

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): tytuł utworu.
  • QUERY (wymagany): ciąg znaków zawierający dowolną kombinację albumu, wykonawcy, gatunku lub tytułu. Ten dodatek jest zawsze podawany w przypadku zgodność wsteczną. Istniejące aplikacje, które nie znają trybów wyszukiwania, mogą przetwarzać ten zamiar jako wyszukiwanie nieustrukturyzowane.

PlaylistaAudio.Playlists.ENTRY_CONTENT_TYPE

odtwarzanie określonej playlisty lub playlisty, która spełnia określone kryteria, z dodatkowymi funkcjami;

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, który jest przypisany do playlisty; na podstawie modelu atrybucji.
  • QUERY (wymagany): ciąg znaków zawierający dowolną kombinację albumu, wykonawcy, gatunku, playlisty lub tytułu. Ten dodatek jest zawsze zapewnia 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 posłuchać muzyki konkretnego wykonawcy, aplikacja do wyszukiwania może wygenerować tę intencję:

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

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 zasobach reklamowych, aby odtworzyć które pasują do zapytania. Widać to w przykładzie poniżej.

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

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

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

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

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

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

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

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

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

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

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

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

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

Nowa notatka

W aplikacjach do robienia notatek tworzenie notatek jest typową czynnością. 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ą poniższych dodatków.

Uwaga: aplikacje muszą poprosić użytkownika o potwierdzenie, zanim wykonają to działanie.

Działanie
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 wskazujący tekst notatki.

Przykład intencji:

KotlinJava
fun createNote(subject: String, text: String) {
    val intent = Intent(NoteIntents.ACTION_CREATE_NOTE).apply {
        putExtra(NoteIntents.EXTRA_NAME, subject)
        putExtra(NoteIntents.EXTRA_TEXT, text)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void createNote(String subject, String text) {
    Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE)
            .putExtra(NoteIntents.EXTRA_NAME, subject)
            .putExtra(NoteIntents.EXTRA_TEXT, text);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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

Nawiązywanie połączenia to typowa czynność w aplikacjach do obsługi telefonu. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następującej sekcji.

Zainicjowanie połączenia głosowego

Aby otworzyć aplikację telefonu i wybrać numer telefonu, użyj działania ACTION_DIAL i wskaż 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ń.

Komendy głosowe Google

  • „zadzwoń pod numer 555-5555”
  • „Zadzwoń do Boba”
  • „Zadzwoń na pocztę głosową”

Aby zadzwonić bezpośrednio, użyj działania ACTION_CALL i podaj numer telefonu za pomocą tego schematu URI. Po otwarciu aplikacji Telefon rozpocznie połączenie telefoniczne. Użytkownik nie musi klikać przycisku Zadzwoń.

Działanie ACTION_CALL wymaga dodania makra Uprawnienia CALL_PHONE do pliku manifestu:

<uses-permission android:name="android.permission.CALL_PHONE" />
Działanie
  • ACTION_DIAL – otwiera aplikację telefonu lub telefonu.
  • ACTION_CALL – nawiązuje połączenie telefoniczne (wymaga uprawnienia CALL_PHONE).
Schemat identyfikatora URI danych
  • tel:<phone-number>
  • voicemail:<phone-number>
Typ MIME
Brak

Prawidłowe numery telefonów to te określone w specyfikacji IETF RFC 3966. Przykłady prawidłowych treści:

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

Telefon w aplikacji Telefon dobrze sobie radzi z normalizacją schematów, takich jak: numerów telefonów. Oznacza to, że opisane schematy nie są wymagane w metodach Uri.parse(). 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:

KotlinJava
fun dialPhoneNumber(phoneNumber: String) {
    val intent = Intent(Intent.ACTION_DIAL).apply {
        data = Uri.parse("tel:$phoneNumber")
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void dialPhoneNumber(String phoneNumber) {
    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:" + phoneNumber));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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

Komendy głosowe Google

  • „wyszukaj filmy z kotami w myvideoapp”

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 Działania aplikacji dotyczącej Asystenta Google.

Działanie
"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 wyszukiwane hasło.

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>

Wyszukaj w internecie

Aby rozpocząć wyszukiwanie w internecie, użyj działania ACTION_WEB_SEARCH i podaj szukany ciąg w polu Dodatkowo SearchManager.QUERY.

Działanie
ACTION_WEB_SEARCH
Schemat URI danych
Brak
Typ MIME
Brak
Dodatki
SearchManager.QUERY
Ciąg wyszukiwania.

Przykładowa intencja:

KotlinJava
fun searchWeb(query: String) {
    val intent = Intent(Intent.ACTION_WEB_SEARCH).apply {
        putExtra(SearchManager.QUERY, query)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void searchWeb(String query) {
    Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
    intent.putExtra(SearchManager.QUERY, query);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Ustawienia

Aby otworzyć ekran w aplikacji Ustawienia systemu, gdy aplikacja wymaga od użytkownika wprowadzenia zmian, użyj jednej z tych akcji intencyjnych:

Działanie
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

Przykład intencji:

KotlinJava
fun openWifiSettings() {
    val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void openWifiSettings() {
    Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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ę za pomocą Więcej informacji na ten temat znajdziesz w następnej sekcji.

Tworzenie SMS-a/MMS-a z załącznikiem

Aby zainicjować SMS-a lub MMS-a, użyj jednego z poniższych działań intencji i określ wiadomość takie jak numer telefonu, temat i treść wiadomości, używając następujących dodatkowych klawiszy:

Działanie
ACTION_SENDTO lub
ACTION_SEND lub
ACTION_SEND_MULTIPLE
Schemat identyfikatora 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 tematu wiadomości (zwykle tylko w przypadku MMS-ów).
"sms_body"
Ciąg znaków dla wiadomości tekstowej.
EXTRA_STREAM
 Uri wskazujący obraz lub film do załączenia. Jeśli używasz działania ACTION_SEND_MULTIPLE, dodatkiem jest ArrayList obiektów Uri wskazujących obrazy lub filmy do załączenia.

Przykład intencji:

KotlinJava
fun composeMmsMessage(message: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        type = HTTP.PLAIN_TEXT_TYPE
        putExtra("sms_body", message)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setType(HTTP.PLAIN_TEXT_TYPE);
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Jeśli chcesz, aby intencja była obsługiwana tylko przez aplikację do obsługi SMS-ów, a nie przez e-maili lub aplikacji społecznościowych, a następnie użyj działania ACTION_SENDTO i uwzględnij schemat danych "smsto:", jak w tym przykładzie:

KotlinJava
fun composeMmsMessage(message: String, attachment: Uri) {
    val intent = Intent(Intent.ACTION_SEND).apply {
        data = Uri.parse("smsto:")  // Only SMS apps respond to this.
        putExtra("sms_body", message)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setData(Uri.parse("smsto:"));  // Only SMS apps respond to this.
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

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

Wczytywanie adresu URL to częste działanie w przeglądarkach. Utwórz filtr intencji, aby reklamować możliwość wykonania tego działania przez aplikację. Aby to zrobić, skorzystaj z informacji w następnej sekcji.

Wczytywanie internetowego adresu URL

Komendy głosowe Google

  • „otwórz example.com”

Aby otworzyć stronę internetową, użyj działania ACTION_VIEW i określić adres URL w danych intencji.

Działanie
ACTION_VIEW
Schemat URI danych
http:<URL>
https:<URL>
Typ MIME
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

Przykład intencji:

KotlinJava
fun openWebPage(url: String) {
    val webpage: Uri = Uri.parse(url)
    val intent = Intent(Intent.ACTION_VIEW, webpage)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}
public void openWebPage(String url) {
    Uri webpage = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Przykładowy filtr 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ę. Następnie: czy użytkownicy zainstalowali Twoją aplikację, linki w e-mailach lub na innych stronach internetowych kierujące do Twojej witryny; otwórz aplikację na Androida, a nie stronę internetową. Więcej informacji znajdziesz w artykule Obsługa linków aplikacji na Androida.

Począwszy od Androida 12 (poziom interfejsu API 31) ogólna intencja internetowa przestaje być aktywność w aplikacji tylko wtedy, gdy została ona zatwierdzona w określonej domenie zawarte w intencji internetowej. 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 odpowiada na obsługiwane intencje, możesz użyć metody adb, aby wywoływać określone intencje poprzez wykonanie następujące:

  1. Skonfiguruj urządzenie z Androidem na potrzeby tworzenia aplikacji lub użyj urządzenia wirtualnego.
  2. Zainstaluj wersję aplikacji, która obsługuje intencje, które chcesz obsługiwać.
  3. Uruchom intencję za pomocą polecenia adb:
    adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \
      -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
    

    Na przykład:

    adb shell am start -a android.intent.action.DIAL \
      -d tel:555-5555 -n org.example.MyApp/.MyActivity
    
  4. Jeśli zdefiniujesz wymagane filtry intencji, obsługuj intencję.

Więcej informacji: Wydaj polecenia powłoki.