Android意图过滤器用于自定义文件扩展名

Max*_*mov 3 android android-intent

我正在尝试制作一个 Android 应用程序来打开扩展名为 .abc 的文件,这是 Android 清单 xml 中的我的应用程序部分

<application android:label="@string/app_name" android:icon="@drawable/icon">
    <activity android:name="com.example.app.ActName" android:label="AppName">
        <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="image/jpeg"/>
        </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:pathPattern=".*\\.abc" />
            <data android:host="*" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>
Run Code Online (Sandbox Code Playgroud)

我使用了最热门和相关问题的所有经验

针对特定文件扩展名的 Android 意图过滤器?

Android意图过滤器:将应用程序与文件扩展名关联起来

Android 如何为自定义文件扩展名创建意图过滤器,但不使其成为手机上所有内容选择器的一部分

最后这不起作用 - 当我在 ES 文件浏览器中单击名为“name.abc”的文件时,它会询问我是否想以文本或图像等方式打开该文件,而实际上它应该只是打开该文件在我的应用程序中

我究竟做错了什么?只需在任何文件管理器中单击具有相应扩展名的文件即可启动应用程序的正确意图过滤器是什么?

更新。

看起来不同的 android 系统和不同的文件浏览器以不同的方式运行 - 一个意图过滤器在“ES 文件资源管理器”中的 4.2 和默认文件管理器中的 4.0.4 上工作得很好,但在 4.2 和 4.0 上根本不起作用。 “Total Commander”中的 4 和“ES 文件资源管理器”中的 4.0.4

Mic*_*ann 6

首先,intent-filter示例中的第一个使用 MIME type image/jpegjpeg你的.abc分机是吗?

我认为这行不通的原因可能有以下三个:

  1. 您需要添加更多 MIME 类型。尝试添加以下内容:

    <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="application/abc"/>
    </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:mimeType="application/octet-stream"/>
    </intent-filter>
    
    Run Code Online (Sandbox Code Playgroud)

    并且,如果您的.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="text/plain"/>
    </intent-filter>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您已注册该file计划。您可能还需要该content方案:

    <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:mimeType="*/*" />
        <data android:pathPattern=".*\\.abc" />
        <data android:host="*" />
    </intent-filter>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 有传言说,pathPatternwith a dot 仅匹配包含单个点的文件。在您的示例中,这意味着您的应用程序将与 关联One.abc但不与Two.Dots.abc. 尝试添加更多 pathPatterns.*\\..*\\.abc.*\\..*\\..*\\.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:scheme="file" />
        <data android:mimeType="*/*" />
        <data android:pathPattern=".*\\..*\\.abc" />
        <data android:host="*" />
    </intent-filter>
    
    Run Code Online (Sandbox Code Playgroud)