我正试图在Android Lollipop的浏览器中启动加载本地网页的意图:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("file:///android_asset/my_page.html"));
startActivity(i);
不幸的是,我发现无法找到该页面。我后来发现默认浏览器只支持HTTP和HTTPS请求。
这是否意味着我必须在用户手机上启动本地Web服务器才能通过网络意图加载my_page.html? :/这样的本地服务器exist at least,但对我的使用来说似乎太重了。
我无法使用网页视图,因为网络视图不允许用户下载我的应用所依赖的object URLs(我尝试编写使用DownloadManager的DownloadListener
来拒绝用。)。
我可以直接在远程服务器上托管静态页面,但是我的应用程序将无法离线使用...除非我使用App Cache。但是,使用App Cache不是最理想的,因为用户首次使用应用程序时最好是他/她在线时...否则,第一次加载失败。
有关如何通过网络意图打开本地资产页面的任何想法?
答案 0 :(得分:3)
不幸的是,我发现无法找到该页面
正确。您正在告诉第三方应用程序从其自己的应用程序资产加载页面,并且没有此类页面。当您的流程是解释file:///android_asset/
的流程时,Uri
只会从您的应用加载内容,而不是当您提交Uri
时到第三方应用。
我后来发现默认浏览器只支持HTTP和HTTPS请求。
有数以千计的Android设备型号。所有这些都将有多个“默认浏览器”实现。话虽这么说,虽然浏览器实现可能支持file
(对于文件系统上可能被浏览器访问的实际文件)或content
(用于通过应用程序从您的应用程序提供材料) ContentProvider
),并非所有人都愿意。
这是否意味着我必须在用户手机上启动本地网络服务器才能通过网络意图加载my_page.html?
如果你想要一个通用的解决方案,那么通过“网络意图”,你的意思是ACTION_VIEW
Intent
,那么是的。或者,让页面在设备外的Web服务器上可用。
请注意,保护本地Web服务器非常棘手。
我无法使用网页视图,因为网页浏览不允许用户下载我的应用所依赖的对象网址
我不确定“下载对象网址”是什么意思。您可以考虑另外提出一个Stack Overflow问题,在这里您可以更详细地讨论这个问题,除非已经有一个问题和答案确实涵盖了您的场景。
或者,考虑一下,通过Web内容提供此应用程序的UI是否是正确的解决方案。
答案 1 :(得分:0)
尝试一下,这会强制提供的文件在Android网络浏览器中启动:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setDataAndType(Uri.parse("file:///android_asset/my_page.html"), "text/html");
startActivity(intent);
您还可以在代码中先前指定File
,然后使用此代替前一个第三行:
intent.setDataAndType(Uri.fromFile(file), "text/html");