[转]Intent-filter and mime type

Android中是没有MIME类型注册的概念的,相反的,任何文件类型或者MIME类型的关联性打开,是通过广播Intent来实现的。也就是说,你如果想要注册自己为.txt类型的查看器,必须为你的Activity加入intent-filter来获取到一个来源所发出的Intent Broadcasting,从而达到关联的目的。


一个合法的File Manager在执行Open动作时,应该是发出一个Intent.VIEW Action。所以你的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:host="*" />  
<data android:pathPattern=".*\\.txt" />  
</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="content" />  
<data android:host="*" />  
<data android:pathPattern=".*\\.txt" />  
</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:host="*" />
<data android:pathPattern=".*\\.txt" />
</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="content" />
<data android:host="*" />
<data android:pathPattern=".*\\.txt" />
</intent-filter> 


 
在这当中,data块缺一不可,你必须同时申明android:scheme, android:host, android:pathPattern, 方可令pathPattern正确生效。对于content scheme,将会匹配诸如:content://com.metago.astro.filesystem/sdcard/txt /pg17155.txt 这样的请求,你的Activity将可以有效地打开这样的txt文件。对于file scheme,大致会匹配诸如:file:///sdcard/txt/pg17155.txt这样的请求,并且,如果有必要,你可以加入 android:mimeType限定。


也就是说,尽管Android SDK的层面上,你不可能了解到哪些mime已经注册,一个自定义的mime如何注册,但对于基础系统(linux os layer)来说,内置的mime type还是存在的,这方面你可以参考Intent SDK文档和Notebook SDK Sample获得一鳞半爪的信息。


对于你自己想要关联的文件后缀,则应该使用上面的intent-filter组合来完成关联。
一旦intent-filter关联完成,在Activity的onCreate,onNewIntent中将可通过:
Intent intent=getIntent();
Uri uri=(Uri)intent.getData();
String path=uri.getPath(); 
序列获得关联打开文件的绝对路径。


这样的方法在ASTRO文件管理器中测试通过,并且在另一个测试project中进行了测试和证明机制有效。不过,在Root Explorer,And Explorer中均失败了,原因正在于这几个浏览器并不执行符合Android SDK规范的File Open操作。
可见,随意性是值得注意的坏招数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值