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

9
我有一个在浏览器上创建对象blob的服务器,并希望在Android应用程序的WebView中下载它。我尝试将请求重定向到浏览器实例以及使用下载管理器来完成此操作,但两者都似乎无法工作(即使如果我在Chrome中打开相同的页面,下载操作也有效)。 我尝试了以下代码,它抛出错误:
Android.content.ActivityNotFoundException:没有找到处理意图的Activity {act = android.intent.action.VIEW dat = blob:https%3A //111.111.111.111%3A8080/40b63131-63b1-4fa4-9451-c6297bbd111a}
编辑
Android.content.ActivityNotFoundException:没有找到处理意图的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);
}
});

这会抛出java.lang.IllegalArgumentException: Can only download 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);

    }
});

我应该如何下载blob?任何帮助都将不胜感激。


你希望在崩溃之外发生什么? - Doug Stevenson
1
@GabeSechan 我在我的Webview中加载了一个URL,它执行了许多操作并创建了一个Blob对象,我想将其下载到设备上。 - Alice Van Der Land
1
@DougStevenson 我明白代码无法运行是因为它试图在浏览器上操作一个 blob 而不是 HTTP 地址,但我一直没有找到如何在 Android 上下载一个 blob。 - Alice Van Der Land
@DougStevenson 我只是没有把整个URL都复制粘贴进去。 - Alice Van Der Land
访问数据必须使用以http或https开头的URL。blob:不是用于传输数据的协议。 - Gabe Sechan
显示剩余7条评论
1个回答

0
您需要拦截处理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;
        }
    }
});

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

你想用那个URL做什么? - rekire
尝试使用这个特殊处理:webView.loadUrl(request.toString().substring(5)); - rekire
2
正确的HTTP地址应该长什么样?我的意思是,没有官方的blob协议。 - rekire
1
shouldOverrideUrlLoading() 在这个下载中根本没有触发(在Webview 66中进行了测试)。 - Alexey Ozerov
@AlexeyOzerov 你是否覆盖了所有重载函数,就像我的示例代码一样?这对我来说很有效。 - rekire
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接