Otrzymuj proste dane z innych aplikacji

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 z innej aplikacji treści tekstowych, takich jak ciekawe adresy URL.

W przypadku aplikacji korzystającej z nawigacji Compose odbieranie danych wysyłanych przez inną aplikację to proces dwuetapowy:

  1. Zadeklaruj <intent-filter> w pliku manifestu: nadal musisz dodać filtr intencji do aktywności 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).

  2. Zdefiniuj navDeepLink w grafie nawigacji Compose: zamiast ręcznie przechwytywać i analizować intencję w metodach onCreate lub onNewIntent aktywności, użyj obsługi precyzyjnych linków w nawigacji Compose. Dołącz navDeepLink, który pasuje do działania i typu MIME, bezpośrednio do docelowego elementu composable, który ma wyświetlać treści. NavController automatycznie przechwyci intencję i przekieruje użytkownika bezpośrednio do tego ekranu.

Odbiorcy udostępniania bezpośredniego to precyzyjne linki do konkretnej Activity w aplikacji. Często reprezentują one osobę lub grupę i są wyświetlane w arkuszu udostępniania w Androidzie. Na przykład aplikacja do obsługi wiadomości może udostępniać odbiorcę udostępniania bezpośredniego dla osoby, który prowadzi bezpośrednio do rozmowy z tą osobą. Szczegółowe instrukcje znajdziesz w artykule Udostępnianie odbiorców udostępniania bezpośredniego.

Obsługa typów 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 typów text/*, image/* i video/*. Oto kilka najczęstszych typów MIME do wysyłania i odbierania prostych danych w Androidzie.

Odbiorcy rejestrują się w Nadawcy wysyłają
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Obsługiwane rozszerzenia plików application/pdf

Zapoznaj się z oficjalnym rejestrem typów MIME IANA.

Tworzenie skutecznych odbiorców udostępniania

Gdy użytkownik kliknie odbiorcę udostępniania powiązanego z konkretną 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ą aktywności obejmuje aktualizację pliku manifestu, obsługę treści przychodzących i dbanie o to, aby użytkownik rozpoznawał 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 definiujesz 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ć dowolny z tych elementów, tworząc intencję i przekazując ją do startActivity(), Twoja aplikacja zostanie wyświetlona jako opcja w arkuszu udostępniania w Androidzie lub w narzędziu do rozwiązywania intencji. Jeśli użytkownik wybierze Twoją aplikację, uruchomi to odpowiednią aktywność (.ui.MyActivity w poprzednim przykładzie). Następnie musisz odpowiednio obsłużyć treści w kodzie i interfejsie.

Obsługa treści przychodzących

Aby obsługiwać treści dostarczane przez Intent, wywołaj getIntent(), aby uzyskać obiekt Intent. Gdy masz już ten obiekt, możesz sprawdzić jego zawartość, aby określić, co zrobić dalej. Jeśli tę aktywność można uruchomić 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, ponieważ nigdy nie wiesz, co może wysłać inna aplikacja. Może na przykład zostać 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 context = LocalContext.current
    val intent = (context as? Activity)?.intent

    when (intent?.action) {
        ACTION_SEND -> {
            if ("text/plain" == intent.type) {
                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
        }
    }
}

fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update ViewModel state to change state of text being shared
    }
}

fun handleSendImage(intent: Intent) {
    IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image being shared
    }
}

fun handleSendMultipleImages(intent: Intent) {
    IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image(s) being shared
    }
}

Aktualizowanie interfejsu po otrzymaniu danych może być tak proste jak wypełnienie pola TextField lub bardziej skomplikowane, np. zastosowanie ciekawego filtra do zdjęcia. Dalsze działania zależą od Twojej aplikacji.

Udostępnianie adresu URL zrzutu ekranu

Podczas robienia zrzutu ekranu możesz udostępnić go wraz z powiązanym adresem URL. Zapewnia to lepsze wrażenia użytkownika. Podczas odbierania adresu URL pamiętaj, aby pobrać 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 ViewModel state to change state image being shared and the EXTRA_TEXT
    // if available
}

Dbanie o to, aby użytkownicy rozpoznawali Twoją aplikację

Twoja aplikacja jest reprezentowana przez jej ikonę i etykietę w arkuszu udostępniania Androida i w narzędziu do rozwiązywania intencji. Oba te elementy są zdefiniowane w pliku manifestu. Aby zapewnić więcej kontekstu, możesz ustawić etykiety aktywności lub filtru intencji.

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.