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

时间:2015-12-16 01:31:56

标签: android android-intent intentfilter

我有一个应用程序通过共享功能从其他应用程序接收单个或多个图像文件。单个文件共享intent-filter工作没有问题,但是多个文件我遇到了一些问题。如果我选择图像和任何其他mime类型的组合,比如说PDF,那么共享选项会列出我的应用程序。我编写了intent-filter来只接受JPEG和PNG。如果在要共享的文件列表中未选择任何图像,则我的应用程序未列出,但它是图像和困扰我的其他文件的组合。下面是我写的意图过滤器。

       <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 / PNG时避免列出我的应用。感谢帮助!

1 个答案:

答案 0 :(得分:1)

经过大量的应用程序后发现不同的应用程序正在以不同的方式处理隐式意图。

  • 我发现ESExplorer会完全忽略intent-filter。如果我选择两个PDF并分享,我会看到我的打印机列出了完全违反我的mime类型设置(如上所示我的问题)。
  • 另一个名为BlackMoon文件浏览器的文件资源管理器应用程序做了正确的事情,只有在我将所有选定的应用程序都设置为JPEG或PNG时才会显示我的应用程序。如果我有一个除JPEG或PNG之外的文件,我的应用程序就不会列在应用程序列表中。
  • 我的LG Nexus 5谷歌下载做了一些奇怪的事情。如果我在仅选择除了图像以外的其他任何内容的PDF之后共享,我将不会列出应用程序,但它会列出我的应用程序我选择了一个组合。就像我选择了JPEG,两个PDF,一个.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被删除的情况。不想得到NullPointers。希望这有助于某人!