【问题标题】:How to open a custom attachment using an Android app?如何使用 Android 应用打开自定义附件?
【发布时间】:2013-08-12 19:40:35
【问题描述】:

我有一个带有自定义扩展名(比如 .abc)的附件,我不知道它的 mimeType。我想使用我的 Android 应用程序打开这个附件。我尝试将下面的代码添加到清单中,但这似乎没有帮助。我确实浏览过多个 Stack Overflow 帖子,但似乎都没有效果,而且那些确实将我的应用程序暴露给其他扩展的帖子,而不仅仅是 .abc

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

【问题讨论】:

标签: android android-intent file-extension intentfilter


【解决方案1】:

您的pathPattern 中有一个空缺*。有什么理由吗?它不应该是主角,因为它只影响前面的字符。

来自Android docs

  • 星号 ('*') 匹配从 0 到多次出现的前一个字符的序列。

  • 后跟星号(“.*”)的句点匹配任何 0 到多个字符的序列。

您可能还想添加一个android:scheme 元素。来自与上面相同的部分:

仅当还为过滤器指定了方案和主机属性时,这些属性才有意义。

另外,这里有一个near duplicate,你可以通读一遍,答案是被广泛接受的。

【讨论】:

  • 嘿tnks。问题是路径模式仅适用于存储在本地存储上的文件。此外,除非指定了 mimeType,否则其他应用程序也可以访问它。
  • 路径模式不区分本地/远程。删除前导的*,它应该匹配任何以“.abc”结尾的东西(除非它有一个中间.,这是android 的PatternMatcher 的不幸实现)。至于“其他应用程序可以访问”,我不确定您的意思。您是否试图让您的应用程序成为唯一可以打开特定文件类型的应用程序?如果是这样,那就行不通了。意图系统不能那样工作。
  • 另一个答案中使用的 scheme 是区分本地和远程的,顺便说一句。
  • 我试图将其更改为接受“.abc”,但由于某种原因它接受了“.abc”和“.abc*”。有什么建议吗?
  • 你试过".*\\.abc"吗?开头.* 表示“任意数量的任何前导字符”。 \\. 是转义的(文字).,后跟字符 abc。更多信息,您应该阅读正则表达式。
【解决方案2】:

您需要指定android:scheme

<activity>
    <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:scheme="content" />
        <data android:host="*" />
        <data android:mimeType="*/*" />
        <data android:pathPattern=".*abc" />
        <data android:pathPattern=".*\\.abc" /> <!-- path includes one '.' -->
        <data android:pathPattern=".*\\..*\\.abc" /> <!-- path includes two '.' -->
        <data android:pathPattern=".*\\..*\\..*\\.abc" /> <!-- path includes three '.' -->
        <!-- repeat as long as you want -->
    </intent-filter>
</activity>

【讨论】:

  • 我的回答有什么问题?它在我的应用程序中运行良好。
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 2014-04-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
相关资源
最近更新 更多