Ali*_*and 6 android blob android-webview
我有一个服务器在浏览器上创建一个对象blob,我想在Android应用程序的WebView中下载它.我尝试将请求重定向到浏览器实例以及使用下载管理器执行此操作,但它们似乎都不起作用(即使我在Chrome中打开相同的页面,下载操作也在那里工作).
我尝试了以下代码,它抛出错误:
Android.content.ActivityNotFoundException:找不到处理Intent的活动{act = android.intent.action.VIEW dat = blob:https%3A // 111.111.111.111%3A8080/40b63131-63b1-4fa4-9451-c6297bbd111a"
编辑
Android.content.ActivityNotFoundException:找不到处理Intent的Activity {act = android.intent.action.VIEW dat = blob:http://digitalinsensu.com/0f0d6127-a0f1-44c3-af85-72f648258d6d
码:
mWebView.setDownloadListener(new DownloadListener() {
public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype,long contentLength) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
}
});
Run Code Online (Sandbox Code Playgroud)
这会抛出java.lang.IllegalArgumentException:只能下载HTTP/HTTPS URIs错误:
mWebView.setDownloadListener(new DownloadListener() {
public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype,long contentLength) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "download");
DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
dm.enqueue(request);
}
});
Run Code Online (Sandbox Code Playgroud)
我该如何下载blob?任何帮助,将不胜感激.
是的,应该有可能。在您的情况下,URL如下所示,blob:
删除前缀后,其余的将解码为URL:
Blob:http://digitalinsensu.com/0f0d6127-a0f1-44c3-af85-72f648258d6d
请注意,只有当用户在其设备上运行可响应请求的Web服务器时,此URL才起作用,而在blob:URL的情况下则不太可能。如果要执行此操作,则需要blob:
使用Java String.replace(..)
或类似方法删除第一个。要解码URL,请使用,如URLDecoder.decode(url, "UTF-8");
,有关详细信息,请参见此处。
问题在于,DownloadListener
确实需要URI(例如http://server.com/file.pdf)。但是,用户单击的链接不会传递该格式的URI。传递的网址代表附加到DOM
浏览器的Blob 。结果,该解决方案将无法按设计工作。
您可能还有其他选择。这取决于您如何生成Blob的字节。您提到您正在使用Javascript执行此操作。如果是这样,我将跳过使用Blob并URL.createObjectURL
完全编写一个Javascript/Native interface
,它将允许您将块中的字节(例如n个255字节的数组)传输到Java代码。这样可以减少客户端的内存消耗。
我对如何创建接口有一个想法,但首先需要了解您如何为Blob生成字节。如果您可以发布字节数组,我可以进一步尝试。
有关此检查的详细信息,请点击此处
您需要拦截处理 url 点击的回调,如下所示:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
shouldOverrideUrlLoading(view, Uri.parse(url));
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return shouldOverrideUrlLoading(view, request.getUrl());
}
// legacy callback
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
return shouldOverrideUrlLoading(view, Uri.parse(url));
}
return super.shouldOverrideUrlLoading(view, url);
}
private boolean shouldOverrideUrlLoading(final WebView view, final Uri request) {
if(request.getScheme().equals("blob")) {
// do your special handling for blob urls here
return true;
}
}
});
Run Code Online (Sandbox Code Playgroud)
您可以在其中shouldOverrideUrlLoading()
进行特殊处理。
归档时间: |
|
查看次数: |
8083 次 |
最近记录: |