21

I'm at a loss for getting my application to register with epub files on a mobile device. I have a set of intent filters in my android manifest, but it still will not open with epub files on the sd card. When I go through the File Explorer app, it shows the file, but when I click on it, it says "The system does not support this type of file:". When I download a file from the internet, and then navigate to the download folder using the downloads application, the file does not show up at all (even though it's in the download folder in the file browser). I've also tried to get epub files to show up with the file chooser intent (Intent.ACTION_OPEN_DOCUMENT), but no luck. I'm guessing the last two do not show up because the intent loads with Intent.CATEGORY_OPENABLE

I've tried multiple epub files and all without success.

Can someone help figure out what I'm missing?

Using KitKat and higher phones.

Note: this does work with downloading from the internet. If I go to an epub link, this works, but not from the filesystem.

        <!-- Open File Types -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:host="*" android:scheme="file"/>
            <data android:pathPattern=".*\\.epub"/>
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:host="*" android:scheme="file" android:mimeType="text/plain"/>
            <data android:pathPattern=".*\\.epub"/>
        </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:host="*" android:scheme="file"/>
            <data android:mimeType="application/epub+zip"/>
        </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:host="*" android:scheme="http"/>
            <data android:pathPattern=".*\\.epub"/>
        </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:host="*" android:scheme="http" android:mimeType="text/plain"/>
            <data android:pathPattern=".*\\.epub"/>
        </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:host="*" android:scheme="http"/>
            <data android:mimeType="application/epub+zip"/>
        </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:host="*" android:scheme="https"/>
            <data android:pathPattern=".*\\.epub"/>
        </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:host="*" android:scheme="https" android:mimeType="text/plain"/>
            <data android:pathPattern=".*\\.epub"/>
        </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:host="*" android:scheme="https"/>
            <data android:mimeType="application/epub+zip"/>
        </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:host="*" android:scheme="content"/>
            <data android:pathPattern=".*\\.epub"/>
        </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:host="*" android:scheme="content" android:mimeType="text/plain"/>
            <data android:pathPattern=".*\\.epub"/>
        </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:host="*" android:scheme="content"/>
            <data android:mimeType="application/epub+zip"/>
        </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:host="*" android:scheme="book"/>
        </intent-filter>

        <intent-filter
            android:icon="@raw/icon"
            android:label="ePub File"
            android:priority="1" >
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:scheme="ftp" />
            <data android:scheme="file" />
            <data android:host="*" />
            <data android:mimeType="*/*" />
            <data android:pathPattern=".*\\.epub" />
        </intent-filter>

Update:

Looking for answers to the following questions for the bounty:

  1. How do I get android system to recognize that epub files on internal or external storage can be opened with my app?
  2. How do I get the default file browser (Storage Access Framework) to show epub files?
Jason
  • 11,310
  • 13
  • 63
  • 115
  • The first `intent-filter` (did not check the others) is working just fine on Nexus 5 (Android 5.0). Stupid question, but are you sure you are defining the filters within an activity tag? :) – ozbek Dec 10 '14 at 06:18
  • Look at this, it must help: http://stackoverflow.com/questions/3760276/android-intent-filter-associate-app-with-file-extension – IWIH Dec 10 '14 at 07:27
  • @ozbek, yes, the app only has one activity, and these are inside it. Thanks for checking! – Jason Dec 10 '14 at 13:56
  • @ozbek, you said it worked on Nexus 5? Can you explain what you did to open the file? – Jason Dec 10 '14 at 13:58
  • Simply created a sample app with the first intent-filter and an empty file with `.epub` extension in target's internal SD card. Then tried to open the file using [OI File Manager](https://play.google.com/store/apps/details?id=org.openintents.filemanager). The system showed "Open with..." dialog where the test app was also listed as an option. – ozbek Dec 10 '14 at 14:07

1 Answers1

7

How do I get android system to recognize that epub files on internal or external storage can be opened with my app?

The "android system" does not have much to do with it, particularly today.

Support in MimeTypeMap (or, more accurately, libcore.net.MimeUtils from the framework classes) for .epub/application/epub+zip was added ~35 hours ago. Presumably, it will show up in a future edition of Android. Prior to that, the only file managers that will use that MIME type are ones that added it in themselves.

At a high level, when confronted with a problem like this, the solution is fairly simple:

  1. Find another app that does what you want (in this case, another EPUB reader)

  2. Use the App Browser app to see what that app's manifest looks like and what it chose for <intent-filter> stanzas

In general, I usually see an <intent-filter> with a scheme and a MIME type or a scheme, host, and path stuff. Having the MIME type and the path stuff is unlikely to help, as if the Intent does not explicitly have the MIME type in it, and Android doesn't know about mapping that specific extension to your MIME type, your <intent-filter> may not match.

Also, you will need to test with multiple "File Manager" apps, as Android does not have a file manager, and therefore you may be experiencing bugs/limitations in the one that you are testing.

How do I get the default file browser (Storage Access Framework) to show epub files?

Specify the proper MIME type and pray for a miracle.

Again, until Android itself offers a bit more built-in support for mapping .epub to the MIME type, you are reliant upon storage providers themselves happening to know that .epub maps to the application/epub+zip MIME type. Some providers will, because they are getting that information from some back-end server that may know more MIME types than does Android itself. Some providers may not, such as Android's MediaStore-backed provider of what's on external storage, as I doubt that MediaStore has its own local support for EPUB files.

CommonsWare
  • 910,778
  • 176
  • 2,215
  • 2,253