从其他应用程序接收多个文件无法按预期工作

Receiving multiple files from other apps does not work as intended

我有一个应用程序可以通过共享功能从其他应用程序接收单个或多个图像文件。单个文件共享 intent-filter 可以正常工作,但对于多个文件,我遇到了一些问题。如果我 select 图像和任何其他 mime 类型的组合,例如 PDF,则共享选项会列出我的应用程序。我编写了 intent-filter 以仅接受 JPEG 和 PNG。如果要共享的文件列表中没有 selected 图像,那么我的应用程序不会列出,但它是图像和其他文件的组合,这让我很困扰。下面是我写的 intent-filter。

       <intent-filter android:icon="@mipmap/ic_print_file_receiver"
            android:label="@string/app_name">
            <action android:name="android.intent.action.SEND_MULTIPLE" />
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="image/jpeg" />
            <data android:mimeType="image/png" />
        </intent-filter>

谁能帮我解决这个问题?我想避免在没有 JPEG/PNGs selected 时列出我的应用程序。感谢您的帮助!

如果发现不同的应用程序以不同的方式处理隐式意图,那么在检查了很多应用程序之后。

  • 我发现 ESExplorer 会完全忽略 intent-filter。如果我选择两个 PDF 并共享我会看到我的打印机列出,这完全违反我的 mime 类型设置(在我的问题上面显示)。
  • 另一个名为 BlackMoon 文件资源管理器的文件资源管理器应用程序做了正确的事情,并且仅当我将所有选定的应用程序都设置为 JPEG 或 PNG 时,它才会在我共享时显示我的应用程序。即使我有 JPEG 或 PNG 以外的文件,我的应用程序也不会列在应用程序列表中。
  • Google 在我的 LG Nexus 5 上下载时发生了一些奇怪的事情。如果我只选择除图像以外的任何其他 PDF 后共享,我的应用程序将不会列出,但它会列出我选择的组合的应用程序。就像我选择了一个 JPEG、两个 PDF、one.HTML 文件等。它只需要在要共享的文件列表中至少有一个 JPEG 或 PNG。

我有所有这些不同行为的组合。我认为处理此问题的最佳方法是在我的应用程序中对文件进行门控。所以这是我写的-

if (Intent.ACTION_SEND_MULTIPLE.equals(receivedIntent.getAction()) && receivedIntent.getType() != null){

                String type = receivedIntent.getType();
                ArrayList<Uri> filesListTemp = new ArrayList<>(filesList);
                // MimeTypes.ALL is */* - the mimetype passed when multiple files are passed as the shared received intent. If only Images then it would be image/*.
                if(TextUtils.equals(type, MimeTypes.ALL)){
                // Here filesListTemp is getIntent().getExtras().getParcelableArrayList(Intent.EXTRA_STREAM);
                    for(Uri fileURI : filesListTemp){
                        String mimeType = getActivity().getContentResolver().getType(fileURI);
                        Log.d(TAG, "mimeType of the file : " + mimeType);
                        if(mimeType != null){
                            if(!TextUtils.equals(mimeType, MimeTypes.JPG) && !TextUtils.equals(mimeType, MimeTypes.PNG)){
                                filesList.remove(fileURI);
                            }
                        } else {
                            String filePath = fileURI.getPath().toLowerCase();
                            if (!filePath.endsWith(".jpg") && !filePath.endsWith(".jpeg") && !filePath.endsWith(".png")) {
                                filesList.remove(fileURI);
                            }
                        }
                    }

不要忘记处理删除所有 fileURI 的情况。不想获得空指针。希望这对某人有所帮助!