Nhận dữ liệu đơn giản từ các ứng dụng khác

Giống như một ứng dụng có thể gửi dữ liệu đến các ứng dụng khác, ứng dụng đó cũng có thể nhận dữ liệu từ các ứng dụng khác. Hãy suy nghĩ về cách người dùng tương tác với ứng dụng của bạn và những kiểu dữ liệu mà bạn muốn nhận từ các ứng dụng khác. Ví dụ: một ứng dụng mạng xã hội có thể quan tâm đến việc nhận nội dung văn bản, chẳng hạn như một URL web thú vị, từ một ứng dụng khác.

Người dùng của các ứng dụng khác thường xuyên gửi dữ liệu đến ứng dụng của bạn thông qua Trang chia sẻ nội dung trong Android hoặc trình phân giải ý định. Các ứng dụng gửi dữ liệu đến ứng dụng của bạn phải đặt loại MIME cho dữ liệu đó. Ứng dụng của bạn có thể nhận dữ liệu do một ứng dụng khác gửi theo những cách sau:

  • Activity có thẻ intent-filter phù hợp trong tệp kê khai
  • Lối tắt chia sẻ do ứng dụng của bạn xuất bản.

Mục tiêu Chia sẻ trực tiếp là các liên kết sâu đến một Hoạt động cụ thể trong ứng dụng của bạn. Chúng thường đại diện cho một người hoặc một nhóm và Trang chia sẻ nội dung trong Android sẽ hiển thị các mục tiêu này. Ví dụ: một ứng dụng nhắn tin có thể cung cấp mục tiêu Chia sẻ trực tiếp cho một người có liên kết sâu trực tiếp đến cuộc trò chuyện với người đó. Hãy xem bài viết Cung cấp mục tiêu Chia sẻ trực tiếp để biết hướng dẫn chi tiết.

Hỗ trợ các loại MIME

Lý tưởng nhất là một ứng dụng phải có khả năng nhận được phạm vi rộng nhất có thể về các loại MIME. Ví dụ: một ứng dụng nhắn tin được thiết kế để gửi văn bản, hình ảnh và video lý tưởng nhất là hỗ trợ nhận text/*, image/*video/*. Dưới đây là một vài loại MIME phổ biến để gửi và nhận dữ liệu đơn giản trong Android.

Trình nhận đăng ký Trình gửi gửi
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Tiện ích mở rộng tệp được hỗ trợ application/pdf

Tham khảo sổ đăng ký chính thức của IANA về các loại phương tiện MIME.

Tạo mục tiêu chia sẻ tuyệt vời

Khi người dùng nhấn vào một mục tiêu chia sẻ được liên kết với một hoạt động cụ thể, họ sẽ có thể xác nhận và chỉnh sửa nội dung được chia sẻ trước khi sử dụng. Điều này đặc biệt quan trọng đối với dữ liệu văn bản.

Nhận dữ liệu bằng một hoạt động

Việc nhận dữ liệu bằng một hoạt động bao gồm cập nhật tệp kê khai, xử lý nội dung đến và đảm bảo rằng người dùng nhận ra ứng dụng của bạn.

Cập nhật tệp kê khai

Bộ lọc ý định thông báo cho hệ thống biết những ý định mà một thành phần ứng dụng chấp nhận. Tương tự như cách bạn tạo một ý định bằng thao tác ACTION_SEND trong bài học Gửi dữ liệu đơn giản đến các ứng dụng khác, bạn sẽ tạo bộ lọc ý định để nhận ý định bằng thao tác này. Bạn xác định một bộ lọc ý định trong tệp kê khai bằng phần tử <intent-filter>. Ví dụ: nếu ứng dụng của bạn xử lý việc nhận nội dung văn bản, thì tệp kê khai bao gồm một hoặc nhiều hình ảnh thuộc bất kỳ loại nào sẽ trông giống như đoạn mã sau:

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

Khi một ứng dụng khác cố gắng chia sẻ bất kỳ nội dung nào trong số này bằng cách tạo một ý định và truyền ý định đó đến startActivity(), ứng dụng của bạn sẽ được liệt kê dưới dạng một lựa chọn trong Trang chia sẻ nội dung trong Android hoặc trình phân giải ý định. Nếu người dùng chọn ứng dụng của bạn, thì thao tác này sẽ bắt đầu hoạt động tương ứng (.ui.MyActivity trong ví dụ trước). Sau đó, bạn có thể xử lý nội dung một cách thích hợp trong mã và giao diện người dùng.

Xử lý nội dung đến

Để xử lý nội dung do Intent gửi, hãy gọi getIntent() để lấy đối tượng Intent. Sau khi có đối tượng, bạn có thể kiểm tra nội dung của đối tượng đó để xác định việc cần làm tiếp theo. Nếu hoạt động này có thể được bắt đầu từ các phần khác của hệ thống (chẳng hạn như trình chạy), hãy cân nhắc điều này khi kiểm tra ý định.

Hãy đặc biệt cẩn thận để kiểm tra dữ liệu đến, bạn không bao giờ biết một số ứng dụng khác có thể gửi cho bạn những gì. Ví dụ: loại MIME không chính xác có thể được đặt hoặc hình ảnh được gửi có thể cực kỳ lớn. Ngoài ra, hãy nhớ xử lý dữ liệu nhị phân trong một luồng riêng biệt thay vì luồng chính ("UI").

Kotlin

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

Java

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

Việc cập nhật giao diện người dùng sau khi nhận dữ liệu có thể đơn giản như việc điền vào EditText hoặc có thể phức tạp hơn như áp dụng bộ lọc ảnh thú vị cho hình ảnh. Ứng dụng của bạn sẽ quyết định điều gì xảy ra tiếp theo.

Chia sẻ URL ảnh chụp màn hình

Khi chụp ảnh màn hình, bạn có thể chia sẻ ảnh chụp màn hình và mọi URL được liên kết. Điều này mang lại trải nghiệm người dùng phong phú hơn. Khi nhận URL, hãy nhớ lấy trường EXTRA_TEXT từ ý định, như minh hoạ trong ví dụ sau:

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    when {
        intent?.action == Intent.ACTION_SEND -> {
            if (intent.type?.startsWith("image/") == true) {
                handleSendImage(intent)
            }
         }
    ...
}
private fun handleSendImage(intent: Intent) {
    (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
     // Handle the EXTRA_TEXT as well
     intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
    // Update UI to reflect image being shared and the EXTRA_TEXT
    // if available
    }
}
...
}

Đảm bảo người dùng nhận ra ứng dụng của bạn

Ứng dụng của bạn được biểu thị bằng biểu tượngnhãn trong Trang chia sẻ nội dung trong Android và trình phân giải ý định. Cả hai đều được xác định trong tệp kê khai. Bạn có thể đặt nhãn hoạt động hoặc bộ lọc ý định để cung cấp thêm ngữ cảnh.

Kể từ Android 10 (cấp độ API 29), Trang chia sẻ nội dung trong Android chỉ sử dụng các biểu tượng được đặt trong tệp kê khai trên thẻ application. Android bỏ qua các biểu tượng được đặt trên thẻ intent-filteractivity.