我有一个仪表化的电子书阅读器应用程序,可以通过两种不同的方式打开,一种方式是通过另一个直接从服务器下载内容然后启动阅读器的应用程序。另一种是通过从文件系统打开电子书。前者工作得很好。后者有效,[i]但仅适用于特定的文件管理器[/ i]。它适用于Astro和ES文件管理器。它不能与默认的Android文件管理器或AndExplorer一起使用(这显然不是一个详尽的测试)。
以下是清单中的相关位:
<activity
android:name=".activities.IntentResolverActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="stateHidden|adjustPan"
android:theme="@android:style/Theme.Holo.Light.NoActionBar"
android:exported="true"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:host="*" />
<data android:pathPattern=".*\\.epub" />
<data android:mimeType="*/*"/>
</intent-filter>
并不是说它没有正确启动,而且应用程序甚至不会显示在打开相关类型文件的可能应用程序列表中(epubs) )。我敢打赌,它与mime类型有关,而且这些不起作用的文件管理器会对mime类型做一些魔术。但我特别说我不关心mimetypes(&#34; / &#34;)以避免任何问题,我似乎无法找到一个mime类型确实有效(我甚至不知道除了octet-stream之外它是什么:epub本质上是一个zip文件,如果我尝试使用mimetype application / zip,它会打破所有文件管理器。)
在Android Marshmallow和Nougat中测试过,我不知道Kitkat是否也会发生同样的情况(据我所知,旧的Android甚至没有内置的文件管理器)。
我尝试完全删除mime类型(没有工作),并且还尝试将所有数据条目压缩成一个数据条目,这与将它们分开是一样的。因为我不想强迫用户使用&#34;已批准的&#34;文件管理员,我需要解决这个问题,但不知道出了什么问题。
以下是意图的logcat消息:
I/ActivityManager: START u0 {act=android.intent.action.VIEW dat=content://com.android.externalstorage.documents/document/primary:Download/test.epub typ=application/epub+zip flg=0x3 cmp=android/com.android.internal.app.ResolverActivity} from uid 10042 on display 0
(请注意,我的读者并未显示为可能启动的应用之一)并且:
/ActivityManager: START u0 {act=android.intent.action.VIEW dat=file:///storage/emulated/0/Download/test.epub typ=application/epub+zip flg=0x10000000 cmp=org.fictitious.epubreader/.activities.IntentResolverActivity} from uid 10114 on display 0
当我从ES文件管理器打开它时(我的应用程序正确启动)
答案 0 :(得分:5)
应用程序甚至没有出现在打开相关类型文件(epubs)的可能应用程序列表中
这是因为您只支持file
计划。
如果您查看失败的Uri
(content://com.android.externalstorage.documents/document/primary:Download/test.epub
),您会注意到它具有content
方案,而不是file
方案。
如果您想支持content
计划,请将<intent-filter>
更改为:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:scheme="content" />
<data android:mimeType="application/epub+zip"/>
</intent-filter>
然后,使用ContentResolver
和openInputStream()
来阅读Uri
标识的内容,因为这适用于file
和content
计划。< / p>