Android开发利用webview识别H5中图片并保存到相册

2024-02-28 08:08

本文主要是介绍Android开发利用webview识别H5中图片并保存到相册,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言
本文是基于在fragment中执行保存H5图片到本地相册的,相对于在acvitity中执行,削微有一点点复杂,但差别不大,代码中有明显区别

Step1:webview添加长按事件private WebView.HitTestResult hitTestResult;

webView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {hitTestResult=webView.getHitTestResult();// 如果是图片类型或者是带有图片链接的类型if (hitTestResult.getType() == WebView.HitTestResult.IMAGE_TYPE ||hitTestResult.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE){// 弹出保存图片的对话框showBottomDialog();return true;}return false;}});


Step2:弹出保存图片的底部对话框

 private void showBottomDialog(){//1、使用Dialog、设置stylefinal Dialog dialog = new Dialog(context);//2、设置布局View view = View.inflate(context,R.layout.dialog_custom_layout,null);dialog.setContentView(view);Window window = dialog.getWindow();//设置弹出位置window.setGravity(Gravity.BOTTOM);//设置弹出动画
//        window.setWindowAnimations(R.style.main_menu_animStyle);//设置对话框大小window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);dialog.show();dialog.findViewById(R.id.tv_take_photo).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dialog.dismiss();picUrl = hitTestResult.getExtra();//获取图片链接
//                            保存图片到相册new Thread(new Runnable() {@Overridepublic void run() {urlToBitMap(picUrl);}}).start();}});dialog.findViewById(R.id.tv_cancel).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dialog.dismiss();}});}


自定义弹窗布局R.layout.dialog_custom_layout就省略了,写了不利于装逼,勿怪Step3:将图片转为Bitmap

/*** 将图片转为Bitmap* @param picUrl*/private void urlToBitMap(String picUrl) {Bitmap bitmap=null;try {URL iconUrl=new URL(picUrl);URLConnection connection=iconUrl.openConnection();HttpURLConnection httpURLConnection= (HttpURLConnection) connection;int length = httpURLConnection.getContentLength();connection.connect();inputStream=connection.getInputStream();bufferedInputStream=new BufferedInputStream(inputStream,length);bitmap=BitmapFactory.decodeStream(bufferedInputStream);bufferedInputStream.close();inputStream.close();if (bitmap != null){saveToAlbum(bitmap);}} catch (Exception e) {LogUtils.e("保存失败:",e.toString());activity.runOnUiThread(new Runnable() {@Overridepublic void run() {
//                    Toast.makeText(context, "保存失败", Toast.LENGTH_SHORT).show();}});e.printStackTrace();}}


Step4:保存到相册(动态权限申请)

/*** 保存到相册* @param bitmap*/private void saveToAlbum(Bitmap bitmap) {permissions= new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
//            手机系统6.0(23)以上动态申请权限int i=ContextCompat.checkSelfPermission(context,permissions[0]);if (i!=PackageManager.PERMISSION_GRANTED){
//                用户未授权,提醒授权ActivityCompat.requestPermissions((Activity) context,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},111);}else {appDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "kuaizai");if (!appDir.exists()) {appDir.mkdirs();}}}else {
//            系统23以下不需要动态授权appDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "kuaizai");if (!appDir.exists()) {appDir.mkdirs();}}
//        savePicture();String[] str = picUrl.split("/");String fileName = str[str.length - 1];if (appDir != null){File file = new File(appDir, fileName);try {fos = new FileOutputStream(file);//解决7.0系统打开sd卡找不到文件的问题if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());}bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);fos.flush();fos.close();onSaveSuccess(file);} catch (final IOException e) {activity.runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(context, "保存失败"+e.toString(), Toast.LENGTH_SHORT).show();LogUtils.e("保存失败:",e.toString());}});e.printStackTrace();}}else {Toast.makeText(context, "授权失败!", Toast.LENGTH_SHORT).show();}}


Step5 保存成功,通知系统更新相册

/*** 保存图片成功* @param file*/private void onSaveSuccess(final File file) {activity.runOnUiThread(new Runnable() {@Overridepublic void run() {~~try {MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(), file.getName(), null);} catch (FileNotFoundException e) {e.printStackTrace();}~~ //用以下方式替换上边try- catch内容,避免保存时在本地生成两次图片ContentValues values = new ContentValues();values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);// 最后通知系统更新相册context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));Toast.makeText(context, "保存成功", Toast.LENGTH_SHORT).show();}});}


Step6,Fragment中动态权限申请回调处理

    @Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode){case 111:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){if (grantResults[0] == PackageManager.PERMISSION_GRANTED){new Thread(new Runnable() {@Overridepublic void run() {urlToBitMap(picUrl);}}).start();}else {ToastUtils.showToast2(context,"用户拒绝!");return;}}break;default:ToastUtils.showToast2(context,"保存失败!");}}


补充
上边步骤就是在webview中长按识别H5中的图片,并保存到手机系统相册,然后通知系统更新相册,整个过程只在Android端完成即可,并不需要像网上很多同僚说的需要和前端联调然后走交互方法才能完成,此方案仅在原生端即可完美解决,并且在各个版本包括pad上都是可以的。
但是开始也说了,如果你是在acvitity中进行上述操作,最后只需要让你的acvitity实现
ActivityCompat.OnRequestPermissionsResultCallback 接口,然后重写onRequestPermissionsResult方法就行了,记得一定要实现接口,不然重写的方法是不会走的,
但是如果在fragment中,执行完上述操作,你会惊喜的发现,fragment中的onRequestPermissionsResult回调方法依然没走,这个有两个原因,一个就是你的fragment也要和acvitity一样实现ActivityCompat.OnRequestPermissionsResultCallback 接口,还有就是你的fragment中onRequestPermissionsResult回调方法被你的载体acvitity给拦截了,所以要在acvitity的onRequestPermissionsResult回调方法中做一点手脚,让acvitity中的onRequestPermissionsResult回调方法传递给依赖于当前acvitity的Fragment,这样就nice了。也就是如下操作:

 

    @Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);List<Fragment> fragments =getSupportFragmentManager().getFragments();if (fragments == null){return;}for (Fragment fragment: fragments) {if (fragment != null){
//                调用Fragment中的onRequestPermissionsResultfragment.onRequestPermissionsResult(requestCode,permissions,grantResults);}}}
}

 

这篇关于Android开发利用webview识别H5中图片并保存到相册的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754895

相关文章

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推