Android How to create Intent Filter for custom file extension that does NOT make it part of a chooser for everything on the phone

前端 未结 4 1297
暗喜
暗喜 2020-12-03 03:57

I have seen numerous answers on here about creating an intent filter for a custom file extension, but none of them seem to be answering my question:

I have an intent

相关标签:
4条回答
  • 2020-12-03 04:25

    One possible answer is shown here . Basically, try the following intent filter inside the desired activity tag to open:

    <intent-filter android:priority="999">
        <action android:name="android.intent.action.VIEW" />
    
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.OPENABLE" />
    
        <data android:host="*" />
        <data android:mimeType="application/octet-stream" />
        <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
        <data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
        <data android:pathPattern=".*\\..*\\..*\\.yourextension" />
        <data android:pathPattern=".*\\..*\\.yourextension" />
        <data android:pathPattern=".*\\.yourextension" />
        <data android:scheme="content" />
    </intent-filter>
    
    0 讨论(0)
  • 2020-12-03 04:36

    The only way to solve this problem is add scheme and host attributes to your intent filter:

    <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:scheme="file" />
      <data android:mimeType="*/*" />
      <data android:pathPattern=".*\\.tgtp" />   
      <data android:host="*" />
    </intent-filter>
    

    That is because in documentation says that android:pathPattern only works if has an scheme and host defined. http://developer.android.com/guide/topics/manifest/data-element.html

    Hope it helps.

    0 讨论(0)
  • 2020-12-03 04:38

    I've been struggling with this quite a bit for a custom file extension, myself. After a lot of searching, I found this web page where the poster discovered that Android's patternMatcher class (which is used for the pathPattern matching in Intent-Filters) has unexpected behavior when your path contains the first character of your match pattern elsewhere in the path (like if you're trying to match "*.xyz", the patternMatcher class stops if there's an "x" earlier in your path). Here's what he found for a workaround, and worked for me, although it is a bit of a hack:

    PatternMatcher is used for pathPattern at IntentFilter But, PatternMatcher's algorithm is quite strange to me. Here is algorithm of Android PatternMatcher.

    If there is 'next character' of '.*' pattern in the middle of string, PatternMatcher stops loop at that point. (See PatternMatcher.java of Android framework.)

    Ex. string : "this is a my attachment" pattern : ".att.". Android PatternMatcher enter loop to match '.' pattern until meet the next character of pattern (at this example, 'a') So, '.' matching loop stops at index 8 - 'a' between 'is' and 'my'. Therefore result of this match returns 'false'.

    Quite strange, isn't it. To workaround this - actually reduce possibility - developer should use annoying stupid pathPattern.

    Ex. Goal : Matching uri path which includes 'message'.

    <intent-filter>
    ...
    <data android:pathPattern=".*message.*" />
    <data android:pathPattern=".*m.*message.*" />
    <data android:pathPattern=".*m.*m.*message.*" />
    <data android:pathPattern=".*m.*m.*m.*message.*" />
    <data android:pathPattern=".*m.*m.*m.*m.*message.*" />
    ...
    </intent-filter>
    

    This is especially issued when matching with custom file extention.

    0 讨论(0)
  • 2020-12-03 04:44

    I have the exact same problem, and in my case, both other answers don't work. The closest I came is when I combine both benjamin and sabadow's answers, -and- leave out the dot in the extension, so like this: (i'm using my custom ".trk" extension)

            <!-- For opening/viewing only trk-files: (works in google drive and "File Manager", not  gmail) -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <action android:name="android.intent.action.SENDTO" />
    
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
    
                <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*trk" android:host="*" />
                <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*trk" android:host="*" />
                <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*trk" android:host="*" />
                <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*trk" android:host="*" />
                <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*t.*trk" android:host="*" />
                <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*t.*t.*trk" android:host="*" />
                <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*t.*t.*t.*trk" android:host="*" />
                <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*t.*t.*t.*t.*trk" android:host="*" />
            </intent-filter>          
            <!-- For catching attachments in Gmail: (also triggers non-trk-files that aren't associated with some other app, but not non-trk-files that already have one of more associations, strangely) -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <action android:name="android.intent.action.SENDTO" />
    
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:mimeType="*/*" android:scheme="content" />
            </intent-filter>
            <!-- For catching share actions from apps: (also triggered by sharing actions for all other file types) -->
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
    
                <data android:mimeType="application/*" />
            </intent-filter>
    

    It's a bit long, but you might not need all lines, like the SENDTO and SEND_MULTIPLE actions. I just need it to work in all cases where it could work. Sadly it also triggers in some, but not all, other cases.

    0 讨论(0)
提交回复
热议问题