2015-12-16 17 views
1

我有一个应用程序通过共享功能从其他应用程序接收单个或多个图像文件。单个文件共享意图过滤器工作没有问题,但与多个文件我有一些问题。如果我选择图像和任何其他MIME类型的组合,比如说PDF,那么共享选项会列出我的应用程序。我已经编写了意图过滤器来仅接受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时列出我的应用程序。感谢帮助!

+0

究竟是什么问题? – greenapps

+0

@greenapps - 我试图从其他应用程序接收图像到我的应用程序。当我选择图像和PDF组合或图像或HTML组合并使用其他应用程序的共享功能时,我的应用程序会列在可处理mime类型的应用程序列表中。我不想那样。我希望只在选择图像时列出它,而不是图像和其他MIME类型的组合。在intent-filter中选择mimeTypes的要点。清楚了吗? – luckylukein

+0

很高兴你的应用总能进入列表。请在图像文件名称之间插入偶然的pdf文件名称,告诉问题是什么。 – greenapps

回答

1

经过大量的应用程序后,如果发现不同的应用程序处理隐含的意图不同。

  • 我发现ESExplorer会完全忽视意图过滤器。如果我选择两个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); 
          } 
         } 
        } 

不要忘记处理所有fileURIs被删除的情况。不想获得NullPointers。希望这可以帮助别人!

+0

感谢您的回答。但我的情况完全不同。我的应用程序将允许所有类型的文件,如视频,音频,文档,PDF和图像(单个/多个)。但是,如果我收到来自Google驱动器的文件,我收到了文件扩展名中的异常。我无法获得文件类型及其扩展名。你有什么想法吗? – Rotomac17

相关问题