Menerima data sederhana dari aplikasi lain

Sama seperti aplikasi dapat mengirim data ke aplikasi lain, aplikasi juga dapat menerima data dari aplikasi lain. Pikirkan cara pengguna berinteraksi dengan aplikasi Anda dan jenis data yang ingin Anda terima dari aplikasi lain. Misalnya, aplikasi jejaring sosial mungkin tertarik untuk menerima konten teks, seperti URL web yang menarik, dari aplikasi lain.

Di aplikasi yang menggunakan Compose Navigation, menerima data yang dikirim oleh aplikasi lain adalah proses dua langkah:

  1. Deklarasikan <intent-filter> dalam manifes: Anda tetap harus menambahkan filter intent ke Aktivitas Anda dalam file AndroidManifest.xml. Hal ini memberi tahu OS Android bahwa aplikasi Anda dapat menerima tindakan tertentu (seperti ACTION_SEND) dan jenis MIME (seperti text/plain).

  2. Tentukan navDeepLink di grafik Navigasi Compose Anda: Daripada mencegat dan mengurai Intent secara manual di dalam metode onCreate atau onNewIntent Aktivitas Anda, gunakan dukungan deep link Compose Navigation. Lampirkan navDeepLink yang cocok dengan tindakan dan jenis MIME langsung ke tujuan composable yang harus menampilkan konten. NavController akan secara otomatis mencegat Intent dan mengarahkan pengguna langsung ke layar tersebut.

Target Berbagi Langsung adalah deep link ke Activity tertentu dalam aplikasi Anda. Target ini sering kali merepresentasikan seseorang atau grup, dan ditampilkan di Android Sharesheet. Misalnya, aplikasi pesan dapat menyediakan target Berbagi Langsung untuk seseorang yang melakukan deep link langsung ke percakapan dengan orang tersebut. Lihat Memberikan target Berbagi Langsung untuk petunjuk mendetail.

Jenis MIME yang didukung

Idealnya, aplikasi harus dapat menerima rentang jenis MIME seluas mungkin. Misalnya, aplikasi pesan yang didesain untuk mengirim teks, gambar, dan video idealnya mendukung penerimaan text/*, image/*, dan video/*. Berikut beberapa jenis MIME umum untuk mengirim dan menerima data sederhana di Android.

Penerima mendaftar untuk Pengirim mengirim
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Ekstensi file yang didukung application/pdf

Lihat registry resmi jenis media MIME IANA.

Membuat target berbagi yang bagus

Saat pengguna mengetuk target berbagi yang terkait dengan aktivitas tertentu, mereka harus dapat mengonfirmasi dan mengedit konten yang dibagikan sebelum menggunakannya. Hal ini sangat penting untuk data teks.

Menerima data dengan aktivitas

Menerima data dengan aktivitas melibatkan pembaruan manifes, penanganan konten yang masuk, dan memastikan pengguna mengenali aplikasi Anda.

Mengupdate manifes Anda

Filter intent memberi tahu sistem intent mana yang diterima oleh komponen aplikasi. Mirip dengan cara Anda membuat intent dengan tindakan ACTION_SEND di pelajaran Mengirimkan data sederhana ke aplikasi lain, Anda membuat filter intent untuk menerima intent dengan tindakan ini. Anda menentukan filter intent dalam manifes menggunakan elemen <intent-filter>. Misalnya, jika aplikasi Anda menangani penerimaan konten teks, manifes yang mencakup satu atau beberapa gambar jenis apa pun akan terlihat seperti cuplikan berikut:

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

Saat aplikasi lain mencoba membagikan salah satu hal ini dengan membuat intent dan meneruskannya ke startActivity(), aplikasi Anda akan tercantum sebagai opsi di Android Sharesheet atau pemecah intent. Jika pengguna memilih aplikasi Anda, aktivitas yang sesuai akan dimulai (.ui.MyActivity dalam contoh sebelumnya). Kemudian, Anda yang harus menangani konten dengan tepat dalam kode dan UI Anda.

Menangani konten yang masuk

Untuk menangani konten yang dikirimkan oleh Intent, panggil getIntent() untuk mendapatkan objek Intent. Setelah memiliki objek, Anda dapat memeriksa isinya untuk menentukan tindakan selanjutnya. Jika aktivitas ini dapat dimulai dari bagian lain sistem (seperti peluncur), pertimbangkan hal ini saat memeriksa intent.

Berhati-hatilah saat memeriksa data yang masuk, Anda tidak pernah tahu apa yang mungkin dikirimkan oleh aplikasi lain kepada Anda. Misalnya, jenis MIME yang ditetapkan mungkin salah, atau gambar yang dikirim mungkin sangat besar. Selain itu, ingatlah untuk memproses data biner di thread terpisah, bukan di thread utama ("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
    }
}

Memperbarui UI setelah menerima data dapat sesederhana mengisi TextField, atau bisa lebih rumit seperti menerapkan filter foto yang menarik ke gambar. Terserah aplikasi Anda apa yang akan terjadi selanjutnya.

Berbagi URL screenshot

Saat mengambil screenshot, Anda dapat membagikan screenshot dan URL terkait. Hal ini memberikan pengalaman pengguna yang lebih kaya. Saat menerima URL, pastikan untuk mendapatkan kolom EXTRA_TEXT dari intent, seperti yang ditunjukkan dalam contoh berikut:

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
}

Memastikan pengguna mengenali aplikasi Anda

Aplikasi Anda ditampilkan oleh ikon dan label di lembar berbagi dan pemecah intent Android. Keduanya didefinisikan dalam manifes. Anda dapat menetapkan label filter intent atau aktivitas untuk memberikan lebih banyak konteks.

Mulai Android 10 (level API 29), Lembar berbagi Android hanya menggunakan ikon yang ditetapkan dalam manifes pada tag application Anda. Android mengabaikan ikon yang ditetapkan pada tag intent-filter dan activity.