本文介绍: 此方法只适合下载图片比较小的文件,文件过大会导致内存溢出崩溃android 原生是不支持blob协议的,但是前端支持可以前端把文件转换base64格式的文件传递给我们,当然我们自己可以实现,实现代码如下:webview配置下载文件名格式需要自己判断,目前这个方法只能下载还不能判断格式文件名要想成为架构师,那就不要局限在编码业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。如果你没有方向,这

此方法只适合下载图片比较小的文件,文件过大会导致内存溢出崩溃

android 原生是不支持blob协议的,但是前端支持可以前端把文件转换base64格式的文件传递给我们,当然我们自己也可以实现,实现代码如下:

public static class DownloadBlobFileJSInterface {

        private Context mContext;
        private DownloadGifSuccessListener mDownloadGifSuccessListener;

        public DownloadBlobFileJSInterface(Context context) {
            this.mContext = context;
        }

        public void setDownloadGifSuccessListener(DownloadGifSuccessListener listener) {
            mDownloadGifSuccessListener = listener;
        }

        @JavascriptInterface
        public void getBase64FromBlobData(String base64Data) {
            convertToGifAndProcess(base64Data);
        }

        /**
         * 插入js代码,转换base64
         * @param blobUrl 获取到的url
         * @return
         */
        public static String getBase64StringFromBlobUrl(String blobUrl) {
            if (blobUrl.startsWith("blob")) {
                return "javascript: var xhr = new XMLHttpRequest();" +
                        "xhr.open('GET', '" + blobUrl + "', true);" +
                        "xhr.responseType = 'blob';" +
                        "xhr.onload = function(e) {" +
                        "    if (this.status == 200) {" +
                        "        var blobFile = this.response;" +
                        "        var reader = new FileReader();" +
                        "        reader.readAsDataURL(blobFile);" +
                        "        reader.onloadend = function() {" +
                        "            base64data = reader.result;" +
                        "            Android.getBase64FromBlobData(base64data);" +
                        "        }" +
                        "    }" +
                        "};" +
                        "xhr.send();";
            }
            return "javascript: console.log('It is not a Blob URL');";
        }

        /**
         * 转换file
         * @param base64
         */
        private void convertToGifAndProcess(String base64) {
            File gifFile = new File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_DOWNLOADS) + "/" + fileName);
            saveFileToPath(base64, gifFile);
            if (mDownloadGifSuccessListener != null) {
                mDownloadGifSuccessListener.downloadGifSuccess(gifFile.getAbsolutePath());
            }
        }
        /**
         * 保存文件
         * @param base64
         * @param gifFilePath
         */
        private void saveFileToPath(String base64, File gifFilePath) {
            try {
                byte[] fileBytes = Base64.decode(base64.replaceFirst(
                        "data:image/gif;base64,", ""), 0);
                FileOutputStream os = new FileOutputStream(gifFilePath, false);
                os.write(fileBytes);
                os.flush();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public interface DownloadGifSuccessListener {
            void downloadGifSuccess(String absolutePath);
        }
    } 

webview配置

mWebSettings.setJavaScriptEnabled(true);

mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); 

mDownloadBlobFileJSInterface = new DownloadBlobFileJSInterface(this);

webView.addJavascriptInterface(mDownloadBlobFileJSInterface, "Android");

mDownloadBlobFileJSInterface.setDownloadGifSuccessListener(absolutePath -> Toast.makeText(MainActivity.this,"下载成功,在Download目录下",Toast.LENGTH_SHORT).show());

webView.setDownloadListener((url, userAgent, contentDisposition, mimeType, contentLength) -> {
            webView.loadUrl(DownloadBlobFileJSInterface.getBase64StringFromBlobUrl(url));
        }); 

下载的文件名格式需要自己判断,目前这个方法只能下载还不能判断格式及文件名

文末

要想成为架构师,那就不要局限在编码业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向这里大家分享一套阿里高级架构编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发各个知识点
在这里插入图片描述
相对于我们平时看的碎片化内容,这份笔记知识点系统化,更容易理解和记忆,是严格按照知识体系编排的。

一、架构师筑基必备技能

1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输序列化
5、Java虚拟机原理
6、高效IO
……

在这里插入图片描述

二、Android百大框架源码解析

1.Retrofit 2.0源码解析
2.Okhttp3源码解析
3.ButterKnife源码解析
4.MPAndroidChart 源码解析
5.Glide源码解析
6.Leakcanary 源码解析
7.Universal-lmage-Loader源码解析
8.EventBus 3.0源码解析
9.zxing源码分析
10.Picasso源码解析
11.LottieAndroid使用详解及源码解析
12.Fresco 源码分析——图片加载流程

在这里插入图片描述

三、Android性能优化实战解析

在这里插入图片描述

四、高级kotlin强化实战

1、Kotlin入门教程
2、Kotlin 实战避坑指南
3、项目实战《Kotlin Jetpack 实战

在这里插入图片描述

五、Android高级UI开源框架进阶解密

1.SmartRefreshLayout的使用
2.Android之PullToRefresh控件源码解析
3.Android-PullToRefresh下拉刷新基本用法
4.LoadSir-高效易用的加载反馈管理框架
5.Android通用LoadingView加载框架详解
6.MPAndroidChart实现LineChart(折线图
7.hellochartsandroid使用指南
8.SmartTable使用指南
9.开源项目androiduitableview介绍
10.ExcelPanel 使用指南
11.Android开源项目SlidingMenu深切解析
12.MaterialDrawer使用指南
在这里插入图片描述

六、NDK模块开发

1、NDK 模块开发
2、JNI 模块
3、Native 开发工具
4、Linux 编程
5、底层图片处理
6、音视频开发
7、机器学习

在这里插入图片描述

七、Flutter技术进阶

1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter开发环境搭建调试
5、Dart语法篇之基础语法(一)
6、Dart语法篇之集合的使用与源码解析(二)
7、Dart语法篇之集合操作符函数与源码分析(三)

在这里插入图片描述

八、微信程序开发

1、小程序概述入门
2、小程序UI开发
3、API操作
4、购物商场项目实战……

在这里插入图片描述

全套视频资料

一、面试合集
在这里插入图片描述
二、源码解析合集

在这里插入图片描述
三、开源框架合集

在这里插入图片描述
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取【保证100%免费】↓↓↓
在这里插入图片描述

原文地址:https://blog.csdn.net/Misdirection_XG/article/details/125228441

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_13623.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注