4

问题:

如何让我的应用程序无条件地打开文件和 url 扩展名?

我对设置我的设置intent-filter束手无策,因为这一切都没有任何意义。我的最终目标是打开任何path以某个扩展名结尾的东西。举个例子,让我们选择“.riley”作为我的目标扩展。

我的基础`意图过滤器`

<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:host="*"
        android:mimeType="*/*"
        android:pathPattern=".*\\.riley" />
</intent-filter>

这目前可以从file和打开content

问题 #1:路径模式

对于初学者来说,data参数pathPattern似乎没有任何作用,正如我设置的那样:

<data
    android:host="*"
    android:mimeType="*/*"
    android:pathPattern=".*\\.riley" />

..但我仍然可以在and方案下打开不以“.riley”Intent结尾的路径。Urifilecontent

我的应用程序使用它打开的几个示例路径intent-filter是:

Path: /storage/sdcard0/Download/MyApp.apk Path: /messagesByAccount/1

为了清楚起见,“路径:”只是我自己在日志中添加的内容。第一个来自file方案下的gmail,第二个来自方案下的gtalk content。鉴于此,我已经对如何intent-filters工作感到困惑。

和计划pathPattern被忽略了filecontent

问题 #2:在浏览器中打开

我试图让我的应用程序从浏览器打开“.riley”扩展名,但是重定向链接没有 MIME 类型,所以我mimeType从模式中删除了值data(我android:mimeType="*/*"之前有,因为 MIME 类型不是t 一致),这使我可以很好地从重定向 URL 中打开。

当我尝试从浏览器打开一个直接的“.riley” URL(例如:http ://thisisnotarealdomainname.com/myfile.riley )并且从我的应用程序打开的选项消失时,问题就出现了。将mimeType值添加回我的data模式允许我从直接 URL 打开。

intent-filter不允许我同时打开直接和间接 URL 。

问题 #3:方案

我希望能够从多种不同的方案类型中打开(例如:http,文件,内容), but as soon as I remove方案altogether, it disqualifies my application from opening thehttp scheme and when I specifyscheme="*" , it disqualifies my application from opening ANY scheme. I've also tried adding moredata` 模式,但我感觉好像只有一个生效,因为那没有完全帮助我。

因此,指定http将允许 for http,但显然不允许filecontent不指定schemedisables http

我无法从所有不同的方案中打开。

重申一下,考虑到这些复杂性,我怎样才能让我的应用程序无条件地打开文件和 url 扩展名

4

1 回答 1

3

问题#1:<data android:pathPattern=".*\\.riley" />根本无效。引用文档

[pathPattern] 仅当还为过滤器指定了方案和主机属性时才有意义。

问题 #2:“但是重定向链接没有 MIME 类型”应该是不正确的,除非 Web 服务器严重损坏。HTTP 重定向本身没有 MIME 类型,但这应该由浏览器自己处理,因为在浏览器处理重定向之前,它不知道 URL 是否指向它应该处理的东西(例如,网页)或者应该下载的东西。重定向的结果——HTTP 200 OK 响应——应该有一个 MIME 类型。如果您确信重定向到下载的 URL 不起作用,请创建一个示例项目来演示错误并将其发布到某处以供审查。

问题 #3:“我无法从所有不同的方案中打开。” -- 在单独的元素中使用<data>具有多个android:scheme属性的多个<intent-filter>元素。

例如,AOSP 音乐应用程序具有:

    <activity android:name="AudioPreview" android:theme="@android:style/Theme.Dialog"
            android:taskAffinity=""
            android:excludeFromRecents="true" android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file"/>
            <data android:mimeType="audio/*"/>
            <data android:mimeType="application/ogg"/>
            <data android:mimeType="application/x-ogg"/>
            <data android:mimeType="application/itunes"/>
        </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="http" />
            <data android:mimeType="audio/*"/>
            <data android:mimeType="application/ogg"/>
            <data android:mimeType="application/x-ogg"/>
            <data android:mimeType="application/itunes"/>
        </intent-filter>
        <intent-filter
            android:priority="-1">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="content" />
            <data android:mimeType="audio/*"/>
            <data android:mimeType="application/ogg"/>
            <data android:mimeType="application/x-ogg"/>
            <data android:mimeType="application/itunes"/>
        </intent-filter>
    </activity>

您会注意到所有三个<intent-filter>节中的动作、类别和 MIME 类型都是相同的;只有android:scheme属性不同。

现在,file这个音乐应用程序示例的方案只有在某些本地文件管理器将适当的 MIME 类型附加到Intent; 音乐不会尝试使用android:pathPattern来匹配文件扩展名。事实上,谷歌很少使用android:pathPattern. AOSP 日历应用程序中出现了一次:

        <intent-filter
           android:priority="50">
           <action android:name="android.intent.action.VIEW" />
           <category android:name="android.intent.category.DEFAULT" />
           <category android:name="android.intent.category.BROWSABLE" />
           <data android:scheme="http" android:host="www.google.com" android:pathPrefix="/calendar/event" />
           <data android:scheme="https" android:host="www.google.com" android:pathPrefix="/calendar/event" />
           <data android:scheme="http" android:host="www.google.com" android:pathPattern="/calendar/hosted/.*/event" />
           <data android:scheme="https" android:host="www.google.com" android:pathPattern="/calendar/hosted/.*/event" />
        </intent-filter>

但仅此而已。当然其他人已经尝试过了——StackOveflow 上有很多关于它的使用的问题。

于 2013-03-25T22:58:13.143 回答