我使用意图过滤器将我的应用程序与我的专有文件类型相关联,以便用户可以点击该文件并在我的应用程序中打开它。直到最近我一直在使用基于文件名的:
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="*/*" />
<data android:scheme="file" />
<data android:scheme="content" />
<data android:host="*" />
<data android:pathPattern=".*\\.rhr" />
(加上路径模式的其他变体以允许文件夹)
似乎从 Android 7 开始,应用程序无法共享文件 URL 官方文档。没问题,我们可以只使用 Mime 类型:
<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:scheme="content" />
<data android:mimeType="[???]" />
除了某些应用程序不发送 mime 类型。例如,三星“我的文件”应用程序发送一个空字符串作为 mime 类型。
我可以使用“*/*”,但这肯定会惹恼人们。还有其他选择吗?
可悲的答案是,除了使用
*/*
并且不进行文件扩展名过滤之外,没有什么好的解决方案。
当三星的文件管理器尝试打开其无法识别的 mime 类型的文件时,它们默认传递
""
(空字符串),这是不可能进行过滤的 - 在意图过滤器中设置空 mime 类型会创建格式错误的文件您的设备将拒绝安装 APK,因此捕获它的唯一方法是使用 */*
。
他们可能应该默认为
application/octet-stream
,但这不会很快发生 - 除非你为三星工作,在这种情况下,去改变它:)
如果您只包含以自定义扩展名 (*/*
) 结尾的文件,
*.rhr
可能是可以容忍的 - 但是,这也是不可能的,因为自从迁移到 content://
URI 以来,文件名对接收者来说是隐藏的应用程序(URI 路径通常只是一个不透明的整数)。