具有一个活动的多文件扩展名/ mimetype intent-filters

时间:2012-02-09 17:22:04

标签: android android-intent android-manifest

男式,

我正在努力让我的Android应用程序可以响应正在打开的文件(通过匹配其扩展名)和mime类型(因此它们将在浏览器中运行)。

我遵循了这里的建议:

Android intent filter for a particular file extension?

但仍然没有运气。

我的android清单文件的相关部分如下:

<activity android:name="MuPDFActivity"
              android:label="@string/app_name"
      android:theme="@android:style/Theme.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="application/vnd.ms-xpsdocument"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="application/pdf"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="application/x-cbz"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <data android:scheme="file"/>
            <data android:mimeType="*/*"/>
            <data android:pathPattern=".*\\.xps"/>
            <data android:host="*"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <data android:scheme="file"/>
            <data android:mimeType="*/*"/>
            <data android:pathPattern=".*\\.pdf"/>
            <data android:host="*"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <data android:scheme="file"/>
            <data android:mimeType="*/*"/>
            <data android:pathPattern=".*\\.cbz"/>
            <data android:host="*"/>
        </intent-filter>
    </activity>

正如您所看到的,我希望为.pdf,.xps和.cbz文件调用该应用程序,以及具有相关mimetypes的文件。这里的局部测试似乎表明.pdf和application / pdf部分都在工作,但是尽可能地尝试.xps(并且可能是.cbz)部分不是。

我错过了一些明显的东西吗?每个Activity只能有一个mimetype / file模式吗?

非常感谢任何帮助。

谢谢,

罗宾

3 个答案:

答案 0 :(得分:2)

afaik,那就更像了(一个带有各种值的过滤器):

 <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.ms-xpsdocument"/>
        <data android:mimeType="application/pdf"/>
 </intent-filter>

另外,mime类型可能不正确吗?

答案 1 :(得分:2)

多个<data>是逻辑OR并单独处理。因此,您有一个标记为android:scheme但没有android:pathPattern,一个标记为android:pathPattern但没有android:host等等。所以<data>标签都没有完整,并且会有任何好处。

您应该使用:

    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data
          android:scheme="file"
          android:mimeType="*/*"
          android:pathPattern=".*\\.cbz"
          android:host="*"
        ></data>
    </intent-filter>

您可以拥有第二个<data>,但它会再次需要所有四个属性,因为如果您想使用android:pathPattern,则Android 4必须使用所有四个属性。 (它们不适用于较旧的Android版本)

答案 2 :(得分:0)

  

每个Activity只能有一个mimetype / file模式吗?

没有。你自己承认,有两个人在工作(PDF x 2)。

  

我错过了一些明显的东西吗?

我怀疑BROWSABLE元素会对你所拥有的元素有很大帮助,而你需要它。 BROWSABLE适用于浏览器,它将沿着MIME类型路径发送。