[@capacitor/share] Android: sharing several images with text to WhatsApp only sends the text (intent type forced to */*)

Đang mở
#2,605 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 29 ngày

@RaphaelFakhri đang làm issue này rồi.

Từ ngày 21/10/2026.

  • #2618 của @RaphaelFakhri — đang mở

Đánh giá

Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức phù hợp với người mới
78/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
android, java
Lĩnh vực
mobile

Hướng nghiên cứu

Start at the SharePlugin.shareFiles entry point and inspect how MIME types and ACTION_SEND_MULTIPLE intents are built. Reproduce the issue with several JPEG URIs and text, then verify that WhatsApp receives every image and the text while mixed or unknown types retain the documented fallback behavior.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

platform: android

Bug Report

Plugin(s)

@capacitor/share 8.0.2

Capacitor Version
Latest Dependencies:
  @capacitor/cli: 8.5.2
  @capacitor/core: 8.5.2
  @capacitor/android: 8.5.2
  @capacitor/ios: 8.5.2
Installed Dependencies:
  @capacitor/ios: not installed
  @capacitor/cli: 8.5.2
  @capacitor/core: 8.5.2
  @capacitor/android: 8.5.2
Platform(s)

Android

Current Behavior

Sharing several image files together with a text to WhatsApp only delivers the text: WhatsApp drops all the images. Sharing a single image with the same text works.

In SharePlugin.shareFiles, the intent type is forced to */* as soon as more than one file is shared, even when every file has a known MIME type:

String type = getMimeType(file);
if (type == null || filesList.size() > 1) {
    type = "*/*";
}
intent.setType(type);

With three JPEG files, the ACTION_SEND_MULTIPLE intent is sent as */*, and WhatsApp treats it as a text-only share.

We confirmed it on a physical Android phone. Our logs showed the three files written to the cache and passed to Share.share, the plugin resolving with activityType: com.whatsapp, and still only the text reaching the conversation.

Expected Behavior

The intent should carry the common MIME type of the shared files, as Chrome's Web Share does: image/jpeg when all files are JPEG, image/* when they are mixed image types, and */* only when the types differ or are unknown. WhatsApp then receives all the images with the text.

Code Reproduction
import { Directory, Filesystem } from '@capacitor/filesystem'
import { Share } from '@capacitor/share'

// three small JPEGs written to the cache
const uris = []
for (const name of ['a.jpg', 'b.jpg', 'c.jpg']) {
  const { uri } = await Filesystem.writeFile({ path: `share/${name}`, data: JPEG_BASE64, directory: Directory.Cache, recursive: true })
  uris.push(uri)
}
await Share.share({ text: 'Three photos', files: uris })
// choose WhatsApp → only "Three photos" is sent
// with files: [uris[0]] → the photo and the text are sent
Other Technical Details

The following change fixes it for us. We apply it with patch-package, and three images plus the text now reach WhatsApp:

-                    String type = getMimeType(file);
-                    if (type == null || filesList.size() > 1) {
-                        type = "*/*";
-                    }
-                    intent.setType(type);
+                    String type = getMimeType(file);
+                    if (type == null) {
+                        sharedType = "*/*";
+                    } else if (sharedType == null) {
+                        sharedType = type;
+                    } else if (!sharedType.equals(type)) {
+                        boolean bothImages = sharedType.startsWith("image/") && type.startsWith("image/");
+                        sharedType = bothImages ? "image/*" : "*/*";
+                    }
+                    intent.setType(sharedType);

(sharedType is a String declared as null before the loop.)

We also set a ClipData covering every URI for ACTION_SEND_MULTIPLE, since the plugin currently only does it for a single file. That was not enough on its own: the MIME type was the deciding factor.

if (fileUris.size() > 1) {
    ClipData clipData = ClipData.newRawUri("", fileUris.get(0));
    for (int i = 1; i < fileUris.size(); i++) {
        clipData.addItem(new ClipData.Item(fileUris.get(i)));
    }
    intent.setClipData(clipData);
    intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, fileUris);
}

Related: #2474 (unknown extensions also fall back to */*, which WhatsApp likewise discards).

Ngôn ngữ chính
Java
Star
688
Fork
692
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của ionic-team/capacitor-plugins

Tất cả issue của ionic-team/capacitor-plugins

Issue tương tự

Thêm issue về Java

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.