Aplikacja może nie tylko wysyłać dane do innych aplikacji, ale też je od nich odbierać. Zastanów się, jak użytkownicy wchodzą w interakcje z Twoją aplikacją i jakie typy danych chcesz otrzymywać z innych aplikacji. Na przykład aplikacja społecznościowa może być zainteresowana otrzymywaniem treści tekstowych, takich jak ciekawy adres URL, z innej aplikacji.
W aplikacji korzystającej z Compose Navigation odbieranie danych wysłanych przez inną aplikację to proces dwuetapowy:
Zadeklaruj
<intent-filter>w pliku manifestu: nadal musisz dodać filtr intencji do działania w pliku AndroidManifest.xml. Informuje to system operacyjny Android, że Twoja aplikacja może odbierać określone działania (np. ACTION_SEND) i typy MIME (np. text/plain).Zdefiniuj element navDeepLink w grafie nawigacji Compose: zamiast ręcznie przechwytywać i parsować intencję w metodach onCreate lub onNewIntent aktywności, użyj obsługi precyzyjnych linków w nawigacji Compose. Dołącz element navDeepLink, który pasuje do działania i typu MIME, bezpośrednio do komponentu docelowego, który ma wyświetlać treści. Kontroler NavController automatycznie przechwyci Intent i skieruje użytkownika bezpośrednio na ten ekran.
Obiekty docelowe bezpośredniego udostępniania to precyzyjne linki do konkretnej Activity w aplikacji. Często reprezentują one osobę lub grupę, a arkusz udostępniania w Androidzie je wyświetla. Na przykład komunikator może udostępniać element docelowy udostępniania bezpośredniego dla osoby, która ma precyzyjny link do rozmowy z nią. Szczegółowe instrukcje znajdziesz w artykule Podawanie celów udostępniania bezpośredniego.
Obsługiwane typy MIME
Aplikacja powinna być w stanie odbierać jak najszerszy zakres typów MIME.
Na przykład aplikacja do obsługi wiadomości przeznaczona do wysyłania tekstu, obrazów i filmów powinna obsługiwać odbieranie text/*, image/* i video/*. Oto kilka typowych typów MIME do wysyłania i odbierania prostych danych na Androidzie.
| Odbiorcy rejestrują się w celu | Nadawcy wysyłają |
|---|---|
text/* |
|
image/* |
|
video/* |
|
| Obsługiwane rozszerzenia plików | application/pdf |
Zapoznaj się z oficjalnym rejestrem typów MIME IANA.
Tworzenie świetnych odbiorców udostępniania
Gdy użytkownik kliknie element docelowy udostępniania powiązany z określoną aktywnością, powinien mieć możliwość potwierdzenia i edytowania udostępnianych treści przed ich użyciem. Jest to szczególnie ważne w przypadku danych tekstowych.
Odbieranie danych za pomocą aktywności
Odbieranie danych za pomocą działania obejmuje aktualizację pliku manifestu, obsługę przychodzących treści i zapewnienie, że użytkownik rozpozna Twoją aplikację.
Aktualizowanie pliku manifestu
Filtry intencji informują system, które intencje akceptuje komponent aplikacji.
Podobnie jak w przypadku tworzenia intencji z działaniem ACTION_SEND w lekcji Wysyłanie prostych danych do innych aplikacji, tworzysz filtry intencji, aby odbierać intencje z tym działaniem. Filtr intencji definiuje się w pliku manifestu za pomocą elementu <intent-filter>.
Jeśli na przykład Twoja aplikacja obsługuje odbieranie treści tekstowych, plik manifestu, który zawiera co najmniej 1 obraz dowolnego typu, będzie wyglądać jak ten fragment kodu:
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
Gdy inna aplikacja spróbuje udostępnić dowolną z tych rzeczy, tworząc intencję i przekazując ją do startActivity(), Twoja aplikacja pojawi się jako opcja na arkuszu udostępniania w Androidzie lub w rozwiązaniu intencji. Jeśli użytkownik wybierze Twoją aplikację, rozpocznie się odpowiednia aktywność (.ui.MyActivity w przykładzie powyżej). Od Ciebie zależy, jak odpowiednio wykorzystasz te treści w kodzie i interfejsie.
Obsługa przychodzących treści
Aby obsłużyć treści dostarczone przez Intent, wywołaj funkcję
getIntent(), aby uzyskać obiekt Intent. Gdy obiekt będzie dostępny, możesz sprawdzić jego zawartość, aby określić, co zrobić dalej. Jeśli to działanie można rozpocząć z innych części systemu (np. z programu uruchamiającego), weź to pod uwagę podczas sprawdzania intencji.
Zwróć szczególną uwagę na sprawdzanie danych przychodzących. Nigdy nie wiadomo, co może Ci wysłać inna aplikacja. Może być na przykład ustawiony nieprawidłowy typ MIME lub wysyłany obraz może być bardzo duży. Pamiętaj też, aby przetwarzać dane binarne w osobnym wątku, a nie w wątku głównym („UI”).
@Composable fun SharesheetHandler() { val activity = LocalActivity.current val intent = activity?.intent when (intent?.action) { Intent.ACTION_SEND -> { if (intent.type == "text/plain") { handleSendText(intent) // Handle text being sent } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } Intent.ACTION_SEND_MULTIPLE -> { if (intent.type?.startsWith("image/") == true) { handleSendMultipleImages(intent) // Handle multiple images being sent } } else -> { // Handle other intents, such as being started from the home screen } } } private fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update UI state with the shared text } } private fun handleSendImage(intent: Intent) { val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java) imageUri?.let { // Update UI state with the shared image } } private fun handleSendMultipleImages(intent: Intent) { val imageUris = IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java) imageUris?.let { // Update UI state with the shared images } }
Aktualizacja interfejsu po otrzymaniu danych może być tak prosta jak wypełnienie elementu TextField lub bardziej skomplikowana, np. zastosowanie ciekawego filtra do zdjęcia. Dalsze działanie zależy od Twojej aplikacji.
Udostępnianie adresu URL zrzutu ekranu
Podczas robienia zrzutu ekranu możesz udostępnić zrzut i powiązany z nim adres URL.
Zapewnia to większą wygodę użytkownikom. Gdy otrzymasz adres URL, pobierz pole EXTRA_TEXT z intencji, jak pokazano w tym przykładzie:
IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let { // Handle the EXTRA_TEXT as well val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT) // Update UI state with the shared image and the EXTRA_TEXT if available }
Zadbaj o to, aby użytkownicy rozpoznawali Twoją aplikację
Aplikacja jest reprezentowana przez ikonę i etykietę w arkuszu udostępniania i rozwiązywaniu intencji na Androidzie. Oba te elementy są zdefiniowane w pliku manifestu. Możesz ustawić etykiety filtrów aktywności lub filtrów intencji, aby zapewnić więcej kontekstu.
Od Androida 10 (poziom interfejsu API 29) arkusz udostępniania w Androidzie używa tylko ikon ustawionych w pliku manifestu w tagu application. Android ignoruje ikony ustawione w tagach intent-filter i activity.