W tym dokumencie opisujemy kilka typowych przypadków użycia aplikacji, z innymi aplikacjami. W każdej sekcji znajdują się wskazówki na temat tego, jak osiągnąć funkcji z ograniczoną widocznością pakietów, co należy wziąć pod uwagę, aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego.
Gdy aplikacja kierowana na Androida 11 lub nowszego używa zamiaru
rozpocznie się aktywność w innej aplikacji, najprostszym sposobem jest wywołanie
intencję i obsługują
ActivityNotFoundException
w sytuacji, gdy żadna aplikacja nie jest dostępna.
Czy jej część zależy od informacji, czy wywołanie
startActivity()
mogą odnieść sukces, np. wyświetlając UI, dodać element do
<queries>
elementu aplikacji
pliku manifestu. Zwykle jest to element <intent>
.
Otwórz adresy URL
W tej sekcji opisujemy różne sposoby otwierania adresów URL w aplikacjach, które są kierowane Androida 11 lub nowszego,
Otwieraj adresy URL w przeglądarce lub innej aplikacji
Aby otworzyć adres URL, użyj intencji zawierającej
ACTION_VIEW
.
opisane w przewodniku pobierania
Adres URL. Po nawiązaniu połączenia z numerem startActivity()
używając tej intencji, zachodzi jedna z tych sytuacji:
- Adres URL otworzy się w aplikacji przeglądarki.
- Adres URL otwiera się w aplikacji, która obsługuje precyzyjny adres URL .
- Wyświetli się okno z prośbą o rozstrzygnięcie, w której użytkownik może wybrać aplikację, która otworzy adres URL.
Błąd
ActivityNotFoundException
występuje, ponieważ na urządzeniu nie ma zainstalowanej aplikacji na urządzeniu, na którym można otworzyć dany adres URL. (Jest to nietypowe).Zalecamy, aby aplikacja przechwytywała i obsługiwała błąd
ActivityNotFoundException
, jeśli wystąpi.
Metoda startActivity()
nie wymaga widoczności pakietów, aby
rozpocząć aktywność w innej aplikacji, nie musisz dodawać <queries>
element w pliku manifestu aplikacji lub wprowadź zmiany w dotychczasowym elemencie <queries>
. Dotyczy to zarówno niejawnych, jak i jawnych intencji, które otwierają adres URL.
Sprawdzanie, czy przeglądarka jest dostępna
W niektórych przypadkach aplikacja może sprawdzać, czy istnieje co najmniej jedna przeglądarka.
dostępna na urządzeniu lub określona przeglądarka jest ustawiona jako domyślna;
przed próbą otwarcia adresu URL. W takich przypadkach musisz dodać:
Element <intent>
w elemencie <queries>
w pliku manifestu:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" /> </intent>
Gdy wywołujesz funkcję queryIntentActivities()
i przekazujesz intencję internetową jako argument,
zwrócona lista zawiera w niektórych przypadkach dostępne aplikacje przeglądarki. Lista
nie uwzględnia aplikacji przeglądarek, jeśli użytkownik skonfigurował adres URL w taki sposób, aby otwierał się w
nie jest domyślną aplikacją.
Otwieranie adresów URL na kartach niestandardowych
Niestandardowe karty umożliwiają aplikacji dostosowywanie wyglądu i działania przeglądarki. Możesz otworzyć adres URL w
karta niestandardowa
bez konieczności dodawania ani zmieniania elementu <queries>
w manifeście aplikacji.
Warto jednak sprawdzić, czy urządzenie ma przeglądarkę, która obsługuje
Karty niestandardowe
lub wybierz konkretną przeglądarkę, którą chcesz uruchomić za pomocą kart niestandardowych
CustomTabsClient.getPackageName()
.
W takich przypadkach dodaj element <intent>
w ramach elementu <queries>
w pliku manifestu:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.support.customtabs.action.CustomTabsService" /> </intent>
Zezwalaj aplikacjom innym niż przeglądarki na obsługę adresów URL
Nawet jeśli aplikacja może otwierać adresy URL za pomocą kart niestandardowych, zalecamy
jeśli to możliwe, zezwól aplikacji innej niż przeglądarka na otwarcie adresu URL. Aby udostępnić tę funkcję w aplikacji, spróbuj wywołać startActivity()
za pomocą intencji, która ustawia flagę intencji FLAG_ACTIVITY_REQUIRE_NON_BROWSER
. Jeśli system zgłosi ActivityNotFoundException
, aplikacja może
a potem otwórz ten URL na karcie niestandardowej.
Jeśli intencja zawiera ten flag, wywołanie funkcji startActivity()
powoduje wywołanie funkcji ActivityNotFoundException
, gdy spełniony jest jeden z tych warunków:
- Połączenie spowodowałoby bezpośrednie uruchomienie aplikacji przeglądarki.
- W wyniku połączenia wyświetli się okno dialogowe, w którym opcje to przeglądarki.
Fragment kodu poniżej pokazuje, jak zaktualizować funkcje logiczne, aby korzystały z
Flaga intencji FLAG_ACTIVITY_REQUIRE_NON_BROWSER
:
Kotlin
try { val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply { // The URL should either launch directly in a non-browser app (if it's // the default) or in the disambiguation dialog. addCategory(CATEGORY_BROWSABLE) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER } startActivity(intent) } catch (e: ActivityNotFoundException) { // Only browser apps are available, or a browser is the default. // So you can open the URL directly in your app, for example in a // Custom Tab. openInCustomTabs(url) }
Java
try { Intent intent = new Intent(ACTION_VIEW, Uri.parse(url)); // The URL should either launch directly in a non-browser app (if it's the // default) or in the disambiguation dialog. intent.addCategory(CATEGORY_BROWSABLE); intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER); startActivity(intent); } catch (ActivityNotFoundException e) { // Only browser apps are available, or a browser is the default. // So you can open the URL directly in your app, for example in a // Custom Tab. openInCustomTabs(url); }
Unikanie okna z prośbą o rozstrzygnięcie wątpliwości
Jeśli chcesz uniknąć wyświetlania okna ujednoznacznienia, które użytkownicy mogą zobaczyć,
otwiera adres URL i wolą robić to samodzielnie w tych
możesz użyć intencji, która ustawi
FLAG_ACTIVITY_REQUIRE_DEFAULT
flagę intencji.
Jeśli intencja zawiera tę flagę, wywołanie startActivity()
powoduje wywołanie
ActivityNotFoundException
musi być zgłaszany, gdy wywołanie wyświetliło
Jeśli intencja zawiera zarówno tę flagę, jak i parametr
FLAG_ACTIVITY_REQUIRE_NON_BROWSER
flagę intencji, wywołanie do startActivity()
wywołuje ActivityNotFoundException
musi zostać zgłoszona, gdy zaistnieje jeden z tych warunków:
- Połączenie spowodowałoby bezpośrednie uruchomienie aplikacji przeglądarki.
- W wyniku połączenia wyświetli się okno umożliwiające wybór użytkownika.
Fragment kodu poniżej pokazuje, jak używać tabeli FLAG_ACTIVITY_REQUIRE_NON_BROWSER
i FLAG_ACTIVITY_REQUIRE_DEFAULT
razem:
Kotlin
val url = URL_TO_LOAD try { // For this intent to be invoked, the system must directly launch a // non-browser app. val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply { addCategory(CATEGORY_BROWSABLE) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER or FLAG_ACTIVITY_REQUIRE_DEFAULT } startActivity(intent) } catch (e: ActivityNotFoundException) { // This code executes in one of the following cases: // 1. Only browser apps can handle the intent. // 2. The user has set a browser app as the default app. // 3. The user hasn't set any app as the default for handling this URL. openInCustomTabs(url) }
Java
String url = URL_TO_LOAD; try { // For this intent to be invoked, the system must directly launch a // non-browser app. Intent intent = new Intent(ACTION_VIEW, Uri.parse(url)); intent.addCategory(CATEGORY_BROWSABLE); intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER | FLAG_ACTIVITY_REQUIRE_DEFAULT); startActivity(intent); } catch (ActivityNotFoundException e) { // This code executes in one of the following cases: // 1. Only browser apps can handle the intent. // 2. The user has set a browser app as the default app. // 3. The user hasn't set any app as the default for handling this URL. openInCustomTabs(url); }
Otwórz plik
Jeśli Twoja aplikacja obsługuje pliki lub załączniki, na przykład sprawdza, czy urządzenie może otworzyć dany plik, najłatwiej jest uruchomić działanie, które może obsłużyć plik. Aby to zrobić, użyj intencji obejmującej intencję ACTION_VIEW
wraz z identyfikatorem URI odpowiadającym konkretnemu plikowi. Jeśli na
urządzenia, aplikacja może wychwytywać ActivityNotFoundException
. W
obsługi wyjątków, możesz wyświetlić błąd lub spróbować obsłużyć plik
siebie.
Jeśli Twoja aplikacja musi wiedzieć z wyprzedzeniem, czy inna aplikacja może otworzyć dany plik, uwzględnij element <intent>
w tym fragmencie kodu jako część elementu <queries>
w pliku manifestu. Podaj typ pliku, jeśli znasz go już w momencie kompilacji.
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.VIEW" /> <!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". --> <data android:mimeType="application/pdf" /> </intent>
Następnie możesz sprawdzić, czy aplikacja jest dostępna, wywołując resolveActivity()
z zapytaniem.
Przyznawanie dostępu do identyfikatora URI
Uwaga: deklarowanie uprawnień dostępu do identyfikatora URI zgodnie z opisem w tej sekcji jest wymagany w przypadku aplikacji kierowanych na Androida 11 (poziom interfejsu API 30) lub nowszego oraz dla wszystkich aplikacji, niezależnie od wersji docelowej pakietu SDK eksportują, dostawców treści.
W przypadku aplikacji kierowanych na Androida 11 lub nowszego na
dostępu do identyfikatora URI treści, intencja aplikacji musi zadeklarować dostęp URI
uprawnienia
Możesz to zrobić, ustawiając jedną lub obie z tych flag intencji:
FLAG_GRANT_READ_URI_PERMISSION
.
oraz
FLAG_GRANT_WRITE_URI_PERMISSION
W Androidzie 11 i nowszych uprawnienia dostępu do identyfikatora URI zapewniają następujące funkcje do aplikacji, która odbiera intencję:
- odczytywać lub zapisywać dane reprezentowane przez identyfikator URI treści, w zależności od uprawnień danego identyfikatora URI.
- uzyskać wgląd w aplikację zawierającą dostawcę treści pasującego do zapytania, Uprawnienia dla identyfikatora URI. Aplikacja zawierająca dostawcę treści może być inna z aplikacji, która wysyła intencję.
Ten fragment kodu pokazuje, jak dodać flagę intencji uprawnień do identyfikatora URI aby inna aplikacja kierowana na Androida 11 lub nowszego mogła dane w identyfikatorze URI treści:
Kotlin
val shareIntent = Intent(Intent.ACTION_VIEW).apply { flags = Intent.FLAG_GRANT_READ_URI_PERMISSION data = CONTENT_URI_TO_SHARE_WITH_OTHER_APP }
Java
Intent shareIntent = new Intent(Intent.ACTION_VIEW); shareIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION); shareIntent.setData(CONTENT_URI_TO_SHARE_WITH_OTHER_APP);
Połącz z usługami
Gdy aplikacja musi wchodzić w interakcję z usługą, która nie jest widoczna
, możesz zadeklarować
odpowiednie działanie intencji w elemencie <queries>
. W poniższych sekcjach
podać przykłady za pomocą często używanych usług.
Połącz z mechanizmem zamiany tekstu na mowę
Jeśli Twoja aplikacja współpracuje z mechanizmem zamiany tekstu na mowę, dodaj te elementy
Element <intent>
w elemencie <queries>
w pliku manifestu:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.TTS_SERVICE" /> </intent>
Połącz się z usługą rozpoznawania mowy
Jeśli Twoja aplikacja współpracuje z usługą rozpoznawania mowy, dodaj te elementy:
Element <intent>
w elemencie <queries>
w pliku manifestu:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.speech.RecognitionService" /> </intent>
Połącz z usługami przeglądarki multimediów
Jeśli Twoja aplikacja jest przeglądarką multimediów kliencką
aplikacji, uwzględnij
następujący element <intent>
jako część elementu <queries>
plik manifestu:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.media.browse.MediaBrowserService" /> </intent>
Dodaj niestandardowe funkcje
Jeśli aplikacja musi wykonywać działania niestandardowe lub wyświetlać elementy możliwe do dostosowania
informacji na podstawie jego interakcji z innymi aplikacjami,
niestandardowe zachowanie za pomocą filtra intencji
podpisy jako
elementu <queries>
w pliku manifestu. W sekcjach poniżej
szczegółowe wskazówki dotyczące kilku typowych scenariuszy.
Zapytanie dotyczące aplikacji do SMS-ów
Jeśli Twoja aplikacja potrzebuje informacji o zestawie aplikacji do obsługi SMS-ów zainstalowanych na
urządzenia, na przykład aby sprawdzić, która jest jego domyślną modułem do obsługi SMS-ów,
dodaj ten element <intent>
jako część elementu <queries>
w
Twój plik manifestu:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.SENDTO"/> <data android:scheme="smsto" android:host="*" /> </intent>
Tworzenie niestandardowego arkusza udostępniania
W miarę możliwości używaj arkusza udostępniania udostępnianego przez system. Ewentualnie
dodaj ten element <intent>
jako część elementu <queries>
w
Twój plik manifestu:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.SEND" /> <!-- Replace with the MIME type that your app works with, if needed. --> <data android:mimeType="image/jpeg" /> </intent>
Proces tworzenia karty udostępniania w logice aplikacji, np. wywołanie funkcji queryIntentActivities()
, pozostaje niezmieniony w porównaniu z wersjami Androida starszymi niż 11.
Pokaż niestandardowe działania dotyczące zaznaczania tekstu
Gdy użytkownik zaznaczy tekst w aplikacji, pojawi się tekst zaznaczenia
pasek narzędzi
pokazuje zestaw operacji, które można wykonać na zaznaczonym tekście. Jeśli
pasek narzędzi pokazuje niestandardowe działania z innych aplikacji, w tym:
Element <intent>
w elemencie <queries>
w pliku manifestu:
<!-- Place inside the <queries> element. --> <intent> <action android:name="android.intent.action.PROCESS_TEXT" /> <data android:mimeType="text/plain" /> </intent>
Pokazywanie niestandardowych wierszy danych kontaktu
Aplikacje mogą dodawać dane niestandardowe wiersze Dostawca. Aby aplikacja do obsługi kontaktów mogła wyświetlać te dane niestandardowe, musi być mogą wykonywać te czynności:
- Przeczytaj plik
contacts.xml
z innych aplikacji. - Wczytaj ikonę odpowiadającą niestandardowemu typowi MIME.
Jeśli Twoja aplikacja to aplikacja do obsługi kontaktów, umieść w niej te elementy <intent>
elementu <queries>
w pliku manifestu:
<!-- Place inside the <queries> element. --> <!-- Lets the app read the contacts.xml file from other apps. --> <intent> <action android:name="android.accounts.AccountAuthenticator" /> </intent> <!-- Lets the app load an icon corresponding to the custom MIME type. --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="content" android:host="com.android.contacts" android:mimeType="vnd.android.cursor.item/*" /> </intent>