如何在Android上的WebView中读取Blob中的数据?

如何在Android上的WebView中读取Blob中的数据?,android,android-webview,blob,Android,Android Webview,Blob,我有一个在浏览器上创建对象blob的服务器,我想在Android应用程序的WebView中下载它。我尝试将请求重定向到浏览器实例,并使用下载管理器执行此操作,但这两种方法似乎都不起作用(即使我在Chrome中打开同一页面,下载操作也可以在那里工作) 我尝试了以下代码,它抛出错误: Android.content.ActivityNotFoundException:找不到可处理Intent的活动{act=Android.Intent.action.VIEW dat=blob:https%3A//1

我有一个在浏览器上创建对象blob的服务器,我想在Android应用程序的WebView中下载它。我尝试将请求重定向到浏览器实例,并使用下载管理器执行此操作,但这两种方法似乎都不起作用(即使我在Chrome中打开同一页面,下载操作也可以在那里工作)

我尝试了以下代码,它抛出错误:

Android.content.ActivityNotFoundException:找不到可处理Intent的活动{act=Android.Intent.action.VIEW dat=blob:https%3A//111.111.111%3A8080/40b63131-63b1-4fa4-9451-C6297BBD11A“

编辑

Android.content.ActivityNotFoundException:未找到可处理Intent的活动{act=Android.Intent.action.VIEW dat=blob:


代码:

这会抛出java.lang.IllegalArgumentException:只能下载HTTP/HTTPS URI错误:

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);

    }
});

我应该如何下载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;
        }
    }
});
webView.setWebViewClient(新的WebViewClient(){
@凌驾
public void onPageStarted(WebView视图、字符串url、位图favicon){
super.onPageStarted(视图、url、favicon);
shouldOverrideUrlLoading(视图,Uri.parse(url));
}
@TargetApi(Build.VERSION\u code.LOLLIPOP)
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图、WebResourceRequest请求){
返回shouldOverrideUrlLoading(视图,request.getUrl());
}
//旧式回调
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){
if(Build.VERSION.SDK\u INT

shouldOverrideUrlLoading()
中,您可以进行特殊处理。

是的,这应该是可能的。在您的情况下,删除
blob:
前缀后,URL如下所示,其余部分为URL解码:

blob:http://digitalinsensu.com/0f0d6127-a0f1-44c3-af85-72f648258d6d 水滴:http://digitalinsensu.com/0f0d6127-a0f1-44c3-af85-72f648258d6d 请注意,只有当用户的设备上运行有响应请求的web服务器时,此URL才会起作用,。如果要这样做,您需要首先使用Java的
字符串删除
blob:
。替换(…)
或类似内容。若要解码URL,请使用类似于
URLDecover.decode(URL,“UTF-8”);
,请参阅以获取详细信息

问题是,
DownloadListener
确实需要一个URI(ex)。但是用户单击的链接没有传递该格式的URI。传递的URL表示连接到浏览器的
DOM
的blob。因此,解决方案将无法按设计工作

您可能还有另一个选项。这取决于您如何为blob生成字节。您提到您是在Javascript中这样做的。如果是这样,我将跳过使用blob和
URL.createObjectURL
,并编写一个
Javascript/本机接口
,允许您将字节分块传输(例如,n个255字节的数组)添加到Java代码中。这将降低客户端的内存消耗

我有一个关于如何创建接口的想法,但我首先需要了解如何为blob生成字节。如果您可以发布字节数组,我可能会进一步尝试


有关此检查的详细信息

您希望发生什么而不是崩溃?为什么要使用webview下载对象?除了网页之外,它不知道如何解析任何内容。请改用DownloadManager。@Gabeschen我在我的webview中加载一个url,该url执行一系列操作并创建一个blob,我想将其下载到设备ce。@DougStevenson我知道代码不起作用,因为它试图对保存在浏览器上的blob而不是HTTP地址进行操作,但我无法找到如何在Android中下载blob。@GulizTuncay,如果url字符串只是“blob:“我不认为你可以用它来获取你想要的数据。请指定哪种特殊处理类型?bdw
shoulldOverrideUrlLoading()
根本不被调用:-(你想用那个url做什么?试试这个特殊处理:
webView.loadUrl(request.toString().substring(5));
正确的http地址应该是什么样子?我的意思是没有正式的blob协议。此下载(使用Webview 66测试)根本不会触发shouldOverrideUrlLoading()。我尝试过类似的方法,但在macOs Webview上没有成功,但这里也有同样的问题- blob:http://digitalinsensu.com/0f0d6127-a0f1-44c3-af85-72f648258d6d