Realizowanie typowych przypadków użycia przy ograniczonej widoczności przesyłek.

W tym dokumencie opisujemy kilka typowych przypadków użycia, w których aplikacja wchodzi w interakcje z innymi aplikacjami. W każdej sekcji znajdziesz wskazówki, jak uzyskać funkcje aplikacji przy ograniczonej widoczności pakietów. Pamiętaj, że jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, musisz się zastanowić.

Gdy aplikacja kierowana na Androida 11 lub nowszego używa intencji rozpoczęcia działania w innej aplikacji, najprostszym sposobem jest wywołanie tej intencji i obsługę wyjątku ActivityNotFoundException, gdy nie jest dostępna żadna aplikacja.

Jeśli część aplikacji zależy od wiedzy, czy wywołanie startActivity() może się udać (np. od wyświetlenia interfejsu), dodaj element do elementu <queries> w pliku manifestu aplikacji. Zwykle jest to element <intent>.

Otwieraj adresy URL

W tej sekcji opisujemy różne sposoby otwierania adresów URL w aplikacji na Androida 11 lub nowszego.

Otwieraj adresy URL w przeglądarce lub innej aplikacji

Aby otworzyć adres URL, użyj intencji zawierającej działanie intencji ACTION_VIEW zgodnie z opisem w przewodniku wczytywania adresu URL strony internetowej. Po rozmowie z startActivity() z użyciem tej intencji ma miejsce jedna z tych sytuacji:

  • Adres URL otworzy się w przeglądarce.
  • Adres URL otwiera się w aplikacji, która obsługuje ten adres jako precyzyjny link.
  • Pojawi się okno wyboru, w którym użytkownik może wybrać aplikację, która otworzy adres URL.
  • Błąd ActivityNotFoundException występuje, gdy na urządzeniu nie ma aplikacji, za pomocą której można otworzyć adres URL. (To całkiem typowe).

    Zalecamy, aby aplikacja wychwytywała i przetwarzała parametr ActivityNotFoundException, jeśli się on pojawi.

Metoda startActivity() nie wymaga widoczności pakietu, aby rozpocząć działanie innej aplikacji, dlatego nie musisz dodawać elementu <queries> do pliku manifestu aplikacji ani wprowadzać żadnych zmian w istniejącym elemencie <queries>. Dotyczy to zarówno niejawnych, jak i jawnych intencji, które otwierają adres URL.

Sprawdzanie dostępności przeglądarki

W niektórych przypadkach przed otwarciem adresu URL aplikacja może chcieć sprawdzić, czy na urządzeniu jest dostępna co najmniej 1 przeglądarka lub czy konkretna przeglądarka jest domyślną przeglądarką. W takich przypadkach umieść ten 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 queryIntentActivities() i przekazujesz intencję internetową jako argument, zwracana lista w niektórych przypadkach będzie zawierać dostępne aplikacje przeglądarki. Lista nie obejmuje przeglądarek, jeśli użytkownik skonfigurował adres URL do otwierania ich w aplikacjach innych niż przeglądarki.

Otwieraj adresy URL na kartach niestandardowych

Karty niestandardowe pozwalają aplikacji dostosować wygląd i działanie przeglądarki. Możesz otworzyć adres URL na karcie niestandardowej bez konieczności dodawania ani zmiany elementu <queries> w pliku manifestu aplikacji.

Warto jednak sprawdzić, czy urządzenie ma przeglądarkę, która obsługuje karty niestandardowe, lub wybrać konkretną przeglądarkę, w której mają się one uruchamiać za pomocą CustomTabsClient.getPackageName(). W takich przypadkach umieść ten element <intent> w elemencie <queries> w pliku manifestu:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.support.customtabs.action.CustomTabsService" />
</intent>

Zezwalaj aplikacjom innych niż przeglądarki na obsługę adresów URL

Nawet jeśli Twoja aplikacja może otwierać adresy URL za pomocą kart niestandardowych, zalecamy, aby w miarę możliwości zezwolić na otwieranie adresów URL przez aplikacje inne niż przeglądarki. Aby udostępnić tę możliwość w swojej aplikacji, spróbuj wywołać funkcję startActivity() za pomocą intencji ustawiającej flagę intencji FLAG_ACTIVITY_REQUIRE_NON_BROWSER. Jeśli system wygeneruje ActivityNotFoundException, aplikacja może otworzyć adres URL na karcie niestandardowej.

Jeśli intencja zawiera tę flagę, wywołanie startActivity() spowoduje wywoływanie metody ActivityNotFoundException w przypadku wystąpienia jednego z tych warunków:

  • Połączenie spowodowałoby bezpośrednie uruchomienie aplikacji przeglądarki.
  • W wywołaniu wyświetliłoby się okno ujednoznacznienia, w którym dostępne są tylko przeglądarki.

Ten fragment kodu pokazuje, jak zaktualizować funkcje logiczne, aby używać flagi 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 jednoznacznego wyboru

Jeśli nie chcesz, by okno ujednoznacznienia było widoczne dla użytkowników po otwarciu adresu URL, i wolisz samodzielnie obsługiwać ten adres w takich sytuacjach, możesz użyć intencji, która ustawia flagę intencji FLAG_ACTIVITY_REQUIRE_DEFAULT.

Jeśli intencja zawiera tę flagę, wywołanie startActivity() spowoduje, że w żądaniu pojawi się okno ujednoznacznienia, które spowoduje wywoływanie ActivityNotFoundException.

Jeśli intencja zawiera zarówno tę flagę, jak i flagę intencji FLAG_ACTIVITY_REQUIRE_NON_BROWSER, wywołanie metody startActivity() powoduje wywoływanie ActivityNotFoundException w jednym z tych warunków:

  • Połączenie spowodowałoby bezpośrednie uruchomienie aplikacji przeglądarki.
  • Wywołanie spowodowałoby wyświetlenie użytkownikowi okna ujednoznacznienia.

Ten fragment kodu pokazuje, jak używać flag 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 aplikacja obsługuje pliki lub załączniki – np. sprawdza, czy urządzenie może je otworzyć, zazwyczaj najłatwiej jest uruchomić działanie obsługujące ten plik. Aby to zrobić, użyj intencji zawierającej działanie intencji ACTION_VIEW i identyfikator URI reprezentujący konkretny plik. Jeśli na urządzeniu nie jest dostępna żadna aplikacja, może ona przechwytywać ActivityNotFoundException. W logice obsługi wyjątków możesz wyświetlić błąd lub spróbować samodzielnie obsłużyć plik.

Jeśli aplikacja musi z wyprzedzeniem wiedzieć, czy inna aplikacja może otworzyć dany plik, umieść element <intent> w poniższym fragmencie kodu jako część elementu <queries> w pliku manifestu. Podaj typ pliku, jeśli wiesz, co jest w trakcie 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() zgodnie z Twoją intencją.

Przyznaj dostęp do identyfikatora URI

Uwaga: zadeklarowanie uprawnień dostępu do identyfikatora URI zgodnie z opisem w tej sekcji jest wymagane w przypadku aplikacji kierowanych na Androida 11 (poziom interfejsu API 30) lub nowszego i zalecanych w przypadku wszystkich aplikacji, niezależnie od docelowej wersji pakietu SDK i tego, czy eksportują swoich dostawców treści.

W przypadku aplikacji kierowanych na Androida 11 lub nowszego w celu uzyskiwania dostępu do identyfikatora URI treści intencja aplikacji musi zadeklarować uprawnienia dostępu do identyfikatora URI, ustawiając jedną lub obie z tych flag intencji: FLAG_GRANT_READ_URI_PERMISSION i FLAG_GRANT_WRITE_URI_PERMISSION.

W Androidzie 11 i nowszych uprawnienia dostępu do identyfikatora URI zapewniają aplikacji odbierającej intencję te możliwości:

  • W zależności od uprawnień związanych z identyfikatorem URI treści odczyt lub zapis danych reprezentowanych przez identyfikator URI treści.
  • Możesz uzyskać wgląd w aplikację zawierającą dostawcę treści pasującego do identyfikatora URI. Aplikacja zawierająca dostawcę treści może się różnić od aplikacji, która wysyła intencję.

Ten fragment kodu pokazuje, jak dodać flagę intencji związanej z uprawnieniami URI, aby inna aplikacja kierowana na Androida w wersji 11 lub nowszej mogła wyświetlać dane zawarte 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

Jeśli Twoja aplikacja musi wejść w interakcję z usługą, która nie jest widoczna automatycznie, możesz zadeklarować odpowiednie działanie intencji w elemencie <queries>. W sekcjach poniżej znajdziesz przykłady korzystania z najczęściej używanych usług.

Połącz się z mechanizmem zamiany tekstu na mowę

Jeśli Twoja aplikacja wchodzi w interakcję z mechanizmem zamiany tekstu na mowę, umieść w pliku manifestu w elemencie <queries> ten element <intent>:

<!-- 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, umieść w pliku manifestu w elemencie <queries> ten element <intent>:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.speech.RecognitionService" />
</intent>

Połącz się z usługami przeglądarki multimediów

Jeśli Twoja aplikacja jest przeglądarką multimediów klienckich, umieść w manifeście ten element <intent> w elemencie <queries>:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.media.browse.MediaBrowserService" />
</intent>

Dodaj niestandardowe funkcje

Jeśli Twoja aplikacja musi wykonywać działania możliwe do dostosowania lub wyświetlać informacje możliwe do dostosowania na podstawie interakcji z innymi aplikacjami, możesz oznaczyć to zachowanie niestandardowe za pomocą sygnałów filtra intencji w ramach elementu <queries> w pliku manifestu. W sekcjach poniżej znajdziesz szczegółowe wskazówki dotyczące kilku typowych scenariuszy.

Zapytanie dotyczące aplikacji do obsługi SMS-ów

Jeśli Twoja aplikacja potrzebuje informacji o zestawie aplikacji do obsługi SMS-ów zainstalowanych na urządzeniu (np. aby sprawdzić, która aplikacja jest domyślną aplikacją do obsługi SMS-ów), umieść w pliku manifestu element <intent> jako część elementu <queries>:

<!-- 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 dostarczonego przez system. Możesz też dodać ten element <intent> jako część elementu <queries> w pliku 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 arkusza udostępniania w logice aplikacji, np. wywołania queryIntentActivities(), pozostaje niezmieniony w porównaniu z wersjami Androida starszymi niż Android 11.

Pokaż niestandardowe działania zaznaczania tekstu

Gdy użytkownicy zaznaczą tekst w aplikacji, pasek narzędzi wyboru tekstu pokazuje zestaw możliwych operacji do wykonania na zaznaczonym tekście. Jeśli ten pasek narzędzi zawiera działania niestandardowe z innych aplikacji, umieść w pliku manifestu w elemencie <queries> ten element <intent>:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.PROCESS_TEXT" />
  <data android:mimeType="text/plain" />
</intent>

Wyświetlanie niestandardowych wierszy danych kontaktu

Aplikacje mogą dodawać niestandardowe wiersze danych do dostawcy kontaktów. Aby aplikacja do obsługi kontaktów wyświetlała te dane niestandardowe, musi mieć możliwość:

  1. Odczytaj plik contacts.xml z innych aplikacji.
  2. Wczytaj ikonę odpowiadającą niestandardowemu typowi MIME.

Jeśli Twoja aplikacja to aplikacja do obsługi kontaktów, umieść w pliku manifestu w elemencie <queries> te elementy <intent>:

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