Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Associating App with Epub format

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?
like image 670
Jason Avatar asked Dec 06 '14 18:12

Jason


People also ask

What is EPUB format?

The epub format is an open standard for e-books created by the International Digital Publishing Forum (IDPF). The EPUB format has gained some popularity as a vendor-independent XML-based e-book format.

How do EPUB files work?

An EPUB file is a digital eBook saved in the EPUB format, an open XML-based format for digital books and publications. It is a standard digital publication format publishers and consumers utilize to store the text of the book, chapter links, cover art, images, and more eBook elements.

What is the key features of EPUB format?

One of the main benefits of the EPUB format for readers is that it allows a book's text to automatically adjust or "reflow" for different screen sizes, such as those for smartphones, netbooks and eReader devices. EPUB also supports fixed-layout content. Learn more about the EPUB format at the IDPF's EPUBZone.


1 Answers

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.

like image 127
CommonsWare Avatar answered Oct 20 '22 15:10

CommonsWare