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

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?任何帮助,将不胜感激.

Mav*_*eňツ 5

是的,应该有可能。在您的情况下,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生成字节。如果您可以发布字节数组,我可以进一步尝试。

有关此检查的详细信息,请点击此处


rek*_*ire 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;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

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

  • 正确的http地址应该是什么样的?我的意思是**没有**官方*blob*协议。 (2认同)