题:
我怎样才能让我的应用程序打开文件和URL扩展,无条件地?
我在我的机智与建立我的最终intent-filter
作为它都没有实拍任何意义。 我的最终目标是开拓任何有一个path
在一定的扩展名结尾。 举一个例子起见,我们选择“.riley”作为我的目标扩展。
我的基地`意向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:host="*"
android:mimeType="*/*"
android:pathPattern=".*\\.riley" />
</intent-filter>
目前,这个工程从打开file
和content
。
问题1:pathPattern
对于初学者来说,它似乎并不仿佛data
参数pathPattern
做任何事情,因为我已设置:
<data
android:host="*"
android:mimeType="*/*"
android:pathPattern=".*\\.riley" />
..但我仍可以打开Intent
与S Uri
不中下的“.riley”结尾的路径file
和content
方案。
我的应用程序中使用这个打开的一对夫妇的例子路径intent-filter
是:
Path: /storage/sdcard0/Download/MyApp.apk
Path: /messagesByAccount/1
“路径:”这只是我自己的另外的日志清晰度英寸 第一种是从Gmail下的file
方案,第二个是从下,每增加一个content
的方案。 鉴于这种情况,我已经感到困惑如何intent-filters
的工作。
该pathPattern
正在对忽略file
和content
方案。
问题2:打开在浏览器
我一直试图让我的应用程序打开浏览器,从“.riley”的扩展,但重定向链接没有一个MIME类型,所以我删除了mimeType
值从data
模式(我android:mimeType="*/*"
此前,作为MIME类型并不一致),以及,让我从重定向的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 the
HTTP scheme and when I specify
方案=” *” , it disqualifies my application from opening ANY scheme. I've also tried adding more
, it disqualifies my application from opening ANY scheme. I've also tried adding more
data`模式,但给我的感觉就好像只有一个是考虑到影响,因为这并不能帮助我。
因此,指定http
将允许http
,但显然已经不允许任何file
或content
,而不是指定scheme
禁用http
。
我无法从所有不同的方案打开。
要重申的是, 我如何才能让我的应用程序打开文件和URL扩展,无条件的 ,因为这些并发症 ?
问题1: <data android:pathPattern=".*\\.riley" />
是简单地无效。 引用文档 :
[pathPattern是]有意义仅当过滤器也被指定的方案和主机属性。
问题2:“不过重定向链接没有一个MIME类型”应该是不正确的,除非Web服务器严重损坏。 HTTP重定向本身不具有MIME类型,但应该通过浏览器本身进行处理,因为直到浏览器处理重定向,它不知道是否该URL指向的东西,它应该处理(例如,Web页面)什么应该被下载。 在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>
你会发现,动作,类别和MIME类型在所有三个相同的<intent-filter>
节; 只有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题,涵盖了它的使用。
文章来源: Open my application for a particular file and URL extension - intent-filter isn't working as intended