Menerima data sederhana dari aplikasi lain

Selain dapat mengirim, aplikasi Anda juga dapat menerima data dari aplikasi lain. Pikirkan bagaimana pengguna berinteraksi dengan aplikasi Anda dan jenis data apa yang ingin Anda terima dari aplikasi lain. Misalnya, aplikasi jaringan sosial mungkin tertarik untuk menerima konten teks, seperti URL web yang menarik, dari aplikasi lain.

Pengguna aplikasi lain sering mengirim data ke aplikasi Anda melalui Android Sharesheet atau intent resolver. Aplikasi yang mengirim data ke aplikasi Anda harus menetapkan jenis MIME untuk data tersebut. Aplikasi Anda dapat menerima data yang dikirim oleh aplikasi lain dengan cara berikut:

  • Activity dengan tag intent-filter yang cocok di manifes
  • Sharing Shortcut yang dipublikasikan oleh aplikasi Anda.

Target Direct Share adalah deep link ke Aktivitas tertentu dalam aplikasi Anda. Target ini sering merepresentasikan seseorang atau grup, dan Android Sharesheet menunjukkannya. Misalnya, aplikasi pesan dapat menyediakan target Direct Share untuk orang yang memiliki deep link langsung ke percakapan dengan orang tersebut. Lihat Memberikan target Berbagi Langsung untuk petunjuk mendetail.

Mendukung jenis MIME

Idealnya, aplikasi harus dapat menerima sebanyak mungkin jenis MIME. Misalnya, aplikasi pesan yang dirancang untuk mengirim teks, gambar, dan video idealnya mendukung penerimaan text/*, image/*, dan video/*. Berikut ini 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 baik

Saat pengguna mengetuk target berbagi yang terkait dengan aktivitas tertentu, mereka harus dapat mengonfirmasi dan mengedit konten yang dibagikan itu 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. Serupa dengan saat Anda membuat intent dengan tindakan ACTION_SEND dalam tutorial Mengirim 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 menyertakan satu atau beberapa gambar dengan 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 intent resolver. Jika pengguna memilih aplikasi Anda, tindakan ini akan memulai aktivitas yang sesuai (.ui.MyActivity dalam contoh sebelumnya). Selanjutnya, Andalah yang harus menangani konten tersebut dengan benar dalam kode dan UI Anda.

Menangani konten yang masuk

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

Harap berhati-hati saat memeriksa data yang masuk, Anda tidak mengetahui data apa yang dikirim oleh aplikasi lain. Misalnya, jenis MIME yang ditetapkan mungkin salah, atau gambar yang dikirim mungkin sangat besar. Selain itu, ingat untuk memproses data biner dalam thread terpisah, bukan di thread utama ("UI").

override fun onCreate(savedInstanceState: Bundle?) {
   
...
   
when {
        intent
?.action == Intent.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 == Intent.ACTION_SEND_MULTIPLE
               
&& 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 to reflect text being shared
   
}
}

private fun handleSendImage(intent: Intent) {
   
(intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
       
// Update UI to reflect image being shared
   
}
}

private fun handleSendMultipleImages(intent: Intent) {
    intent
.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let {
       
// Update UI to reflect multiple images being shared
   
}
}
void onCreate (Bundle savedInstanceState) {
   
...
   
// Get intent, action and MIME type
   
Intent intent = getIntent();
   
String action = intent.getAction();
   
String type = intent.getType();

   
if (Intent.ACTION_SEND.equals(action) && type != null) {
       
if ("text/plain".equals(type)) {
            handleSendText
(intent); // Handle text being sent
       
} else if (type.startsWith("image/")) {
            handleSendImage
(intent); // Handle single image being sent
       
}
   
} else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
       
if (type.startsWith("image/")) {
            handleSendMultipleImages
(intent); // Handle multiple images being sent
       
}
   
} else {
       
// Handle other intents, such as being started from the home screen
   
}
   
...
}

void handleSendText(Intent intent) {
   
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
   
if (sharedText != null) {
       
// Update UI to reflect text being shared
   
}
}

void handleSendImage(Intent intent) {
   
Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
   
if (imageUri != null) {
       
// Update UI to reflect image being shared
   
}
}

void handleSendMultipleImages(Intent intent) {
   
ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
   
if (imageUris != null) {
       
// Update UI to reflect multiple images being shared
   
}
}

Mengupdate UI setelah menerima data dapat sesederhana mengisi EditText, atau lebih rumit seperti menerapkan filter foto yang menarik ke gambar. Aplikasi Anda dapat memilih tindakan apa yang akan dilakukan selanjutnya.

Memastikan pengguna mengenali aplikasi Anda

Aplikasi Anda direpresentasikan oleh ikon dan label di Android Sharesheet dan resolver intent. Keduanya didefinisikan dalam manifes. Anda dapat menetapkan label filter aktivitas atau intent untuk memberikan lebih banyak konteks.

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