最近做项目时有需求,我就在参考原博客(点击查看大图原博客链接 )后自己又添加方法,最终实现了长按图片获取原图url以后,自动保存图片到本地。

界面是这个样子的:

    

下面附上关键部分的代码:

@Overridepublic void onClickable(int viewId) {switch (viewId) {case R.id.iv_download://点击下载按钮进行下载保存操作new Thread(new Runnable() {@Overridepublic void run() {//网络请求放到子线程final Bitmap b = returnBitmap(imgPath);if (b != null) {runOnUiThread(new Runnable() {@Overridepublic void run() {saveImgToLocal(b);}});}}}).start();break;}}/*** 根据图片的url路径获得Bitmap对象** @param url* @return*/private Bitmap returnBitmap(String url) {URL fileUrl = null;Bitmap bitmap = null;try {fileUrl = new URL(url);} catch (MalformedURLException e) {e.printStackTrace();}try {HttpURLConnection conn = (HttpURLConnection) fileUrl.openConnection();conn.setDoInput(true);conn.connect();InputStream is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);is.close();} catch (IOException e) {e.printStackTrace();}return bitmap;}
  /*** 保存Bitmap图片对象** @param bitmap*/private void saveImgToLocal(Bitmap bitmap) {FileUtils.savePhoto(this, bitmap, new FileUtils.SaveResultCallback() {@Overridepublic void onSavedSuccess() {runOnUiThread(new Runnable() {@Overridepublic void run() {//保存成功后弹出一个提示框Dialog dialog = new DialogUtils(ShowWebImageActivity.this);dialog.setContentView(R.layout.dialog_download_success);dialog.show();}});}@Overridepublic void onSavedFailed() {runOnUiThread(new Runnable() {@Overridepublic void run() {//保存失败后弹出一个提示框Dialog dialog = new DialogUtils(ShowWebImageActivity.this);dialog.setContentView(R.layout.dialog_download_failure);dialog.show();}});}});}

FileUtils工具类

package com.test.wwy.utils;import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.util.Log;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;public class FileUtils {private Context mContext;private String TAG = "FileUtils";/*** sd卡的根目录*/private static String mSdRootPath = Environment.getExternalStorageDirectory().getPath();/*** 手机的缓存根目录*/private static String mDataRootPath = null;/*** 保存Image的目录名*/private final static String FOLDER_NAME = "/AndroidImage";/*** 图文详情图片缓存*/private final static String IMAGE_RICHTEXT = "/RichTextImage";public FileUtils(Context context) {mContext = context;mDataRootPath = context.getCacheDir().getPath();}/*** 获取手机根目录,若有SD卡就是SD卡根目录,否则为手机缓存目录** @return*/public String getRootDirectory() {return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ? mSdRootPath : mDataRootPath;}/*** 获取储存Image的目录** @return*/public String getStorageDirectory() {return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ? mSdRootPath + FOLDER_NAME: mDataRootPath + FOLDER_NAME;}public String getRichTextImageDirectory() {return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ? mSdRootPath + IMAGE_RICHTEXT: mDataRootPath + IMAGE_RICHTEXT;}/*** @param fileName* @param bitmap* @return 保存的图片的路径*/public String savaRichTextImage(String fileName, Bitmap bitmap) {fileName = fileName.replaceAll("[^\\w]", "");if (bitmap == null) {return null;}String result = null;String path = getRichTextImageDirectory();File folderFile = new File(path);if (!folderFile.exists()) {folderFile.mkdirs();}File file = new File(path + File.separator + fileName + ".jpg");if (file.exists()) {file.delete();}try {file.createNewFile();FileOutputStream fos = new FileOutputStream(file);bitmap.compress(CompressFormat.JPEG, 100, fos);fos.flush();fos.close();result = file.getAbsolutePath();} catch (FileNotFoundException e) {e.printStackTrace();Log.i(TAG, "savaImage() has FileNotFoundException");} catch (IOException e) {e.printStackTrace();Log.i(TAG, "savaImage() has IOException");}return result;}public void deleteRichTextImage() {String path = getRichTextImageDirectory();File f = new File(path);deleteFile(f);}public void deleteFile(File file) {if (file.isFile()) {file.delete();return;}if (file.isDirectory()) {File[] childFile = file.listFiles();if (childFile == null || childFile.length == 0) {file.delete();return;}for (File f : childFile) {deleteFile(f);}file.delete();}}/*** 根据Uri获取图片文件的绝对路径*/public String getFilePathFromUri(final Uri uri) {if (null == uri) {return null;}final String scheme = uri.getScheme();String data = null;if (scheme == null) {data = uri.getPath();} else if (ContentResolver.SCHEME_FILE.equals(scheme)) {data = uri.getPath();} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {Cursor cursor = mContext.getContentResolver().query(uri,new String[]{MediaStore.Images.ImageColumns.DATA}, null,null, null);if (null != cursor) {if (cursor.moveToFirst()) {int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);if (index > -1) {data = cursor.getString(index);}}cursor.close();}}return data;}public static void checkForPermission(Context mContext) {/*** 动态获取权限,Android 6.0 新特性,一些保护权限,除了要在AndroidManifest中声明权限,还要使用如下代码动态获取*/if (Build.VERSION.SDK_INT >= 23) {int REQUEST_EXTERNAL_STORAGE = 1;String[] PERMISSIONS_STORAGE = {android.Manifest.permission.READ_EXTERNAL_STORAGE,android.Manifest.permission.WRITE_EXTERNAL_STORAGE};int permission = ActivityCompat.checkSelfPermission(mContext, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);if (permission != PackageManager.PERMISSION_GRANTED) {// We don't have permission so prompt the userActivityCompat.requestPermissions((Activity) mContext,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);}}}/*** 保存图片到本地*/public static void savePhoto(final Context context, final Bitmap bmp, final String imgUrl, final SaveResultCallback saveResultCallback) {final File sdDir = getSDPath();if (sdDir == null) {T.showShort(context, "设备自带的存储不可用");return;}new Thread(new Runnable() {@Overridepublic void run() {File appDir = new File(sdDir, "CollegeDaily_Photo");if (!appDir.exists()) {appDir.mkdirs();}
//              SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置以当前时间格式为图片名称
//              String fileName = df.format(new Date()) + ".png";String fileName = MD5Utils.stringToMd5(imgUrl) + ".png";//设置以当前url为图片名称File file = new File(appDir.getPath(), fileName);try {FileOutputStream fos = new FileOutputStream(file);bmp.compress(CompressFormat.PNG, 100, fos);fos.flush();fos.close();saveResultCallback.onSavedSuccess();} catch (FileNotFoundException e) {saveResultCallback.onSavedFailed();e.printStackTrace();} catch (IOException e) {saveResultCallback.onSavedFailed();e.printStackTrace();}//保存图片后发送广播通知更新数据库Uri uri = Uri.fromFile(file);context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));}}).start();}public static File getSDPath() {File sdDir = null;boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); //判断sd卡是否存在if (sdCardExist) {sdDir = Environment.getExternalStorageDirectory();//获取跟目录}return sdDir;}public interface SaveResultCallback {void onSavedSuccess();void onSavedFailed();}/*** 复制图片到本地* @param context* @param oldpath* @param localPath*/public static void copyPhotoToLocal(Context context,String oldpath,String localPath){try {int bytesum = 0;int byteread = 0;File oldfile = new File(oldpath);if (oldfile.exists()) { //文件存在时InputStream inStream = new FileInputStream(oldpath); //读入原文件FileOutputStream fs = new FileOutputStream(localPath);byte[] buffer = new byte[1444];int length;while ( (byteread = inStream.read(buffer)) != -1) {bytesum += byteread; //字节数 文件大小System.out.println(bytesum);fs.write(buffer, 0, byteread);}inStream.close();//保存图片后发送广播通知更新数据库Uri uri = Uri.fromFile(new File(localPath));context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));}}catch (Exception e) {e.printStackTrace();}}
}

最后欢迎大家评论并及时与我交流学习!

点击查看大图(长按保存图片)相关推荐

  1. js实现点击查看大图功能

    使用layui的弹窗实现点击查看大图功能 function getImage(url, callback){let img = new Image();img.src = url;if(img.com ...

  2. android webview加载html图片自适应手机屏幕大小点击查看大图

    我们在开发中,显示信息详情时,一般后台会给出html文本,在android端一般采用webview控件来展示,但是后台给出的html文本一般是给电脑端用的,没有自适配手机,导致手机端图片显示过大,需要 ...

  3. 安卓 webview加载html图片自适应手机屏幕大小和点击查看大图

    我们在开发中,显示信息详情时,一般后台会给出html文本,在android端一般采用webview控件来展示,但是后台给出的html文本一般是给电脑端用的,没有自适配手机,导致手机端图片显示过大,需要 ...

  4. Android RecyclerView 显示图片列表,点击查看大图,手指可放大缩小

    该文章基于前篇:https://blog.csdn.net/zhu_nana/article/details/108222330 接着上一篇,直接上代码 holder.myView.setOnClic ...

  5. 新闻详情页查看大图列表以及保存图片

    最近项目中需要实现,点击新闻详情页查看大图列表并实现保存功能,今天写本篇博客总结梳理一下,一方面对知识点加深印象, 另一方面希望能对有需要的朋友提供些许帮助,如下图,我们以新闻列表中的第二个条目为例进 ...

  6. php图片点击查看大图,基于JavaScript实现移动端点击图片查看大图点击大图隐藏_javascript技巧...

    一.需求 点击图片查看大图,再点大图隐藏.多用于移动端,因为移动端屏幕小,可能需要查看大图. 二.代码 JQuery点击图片查看大图by starof 三.技巧 因为移动端无法添加热点,最终一个解决方 ...

  7. android点击查看大图(长按保存图片)

    通常会看到点击ImageView弹出一个Dialog上面有一张大图,然后长按大图可以保存,这就好像成为了一个固定的 流程,那么,我们就来实现这一系列的功能. 1.xml文件,特别简单,只有一个Imag ...

  8. Android 点击查看大图(长按保存图片)

    通常会看到点击ImageView弹出一个Dialog上面有一张大图,然后长按大图可以保存 activity_main.xml <?xml version="1.0" enco ...

  9. 小红书怎么点击查看大图_小红书长图怎么看?小红书长图怎么发?小红书长发设计图片...

    一.小红书长图查看.发送方法介绍 小红书玩的好的基本上都到小红书速涨网(点击进入)下单刷粉丝量.播放量或者点赞.评论量,因为不刷一点基础的数据量的话,基本上很难有机会获得小红书平台的热门推荐,希望玩小 ...

最新文章

  1. 2-RACommand
  2. httpd.2.4虚拟主机配置测试
  3. 如何理解Return的返回值?
  4. adams建立一绳索不带滑轮_建立企业精益供应链,必须先解开现有绳索 系列(一)...
  5. sh里的变量 $0 $1 $$ $#
  6. 为什么梯度的方向与等高线切线方向垂直?
  7. 4修改初始值_Java基础篇4——循环
  8. 扩展指令集--指令参考说明
  9. SpringBoot(1)---SpringBoot2.0技术视频教程
  10. 百科知识 scm文件如何打开
  11. 感谢折磨你的人[一]
  12. redis集群搭建管理入门
  13. 第四章 数据库安全性总结
  14. 思科防火墙应用NAT
  15. 泰拉瑞亚 服务器linux,泰拉瑞亚Linux主机打造指南
  16. gnuplot使用简介
  17. VS生成的exe文件发给别人打不开的问题
  18. 云化要求下,数据库架构的演进
  19. 计算机操作与规范,电脑操作基本知识(精华版)
  20. 常识-idea里鼠标左键选择变成矩形块

热门文章

  1. IMT-2020工作组制定五步发展计划:与3GPP保持标准制定同步
  2. Java统计文档中aeiou的个数
  3. 工业机器人打磨去毛刺实操工作站
  4. DM8分区表和分区索引管理
  5. EM_EXSETSEL
  6. 根据创建时间与当前时间比对时隔多少小时、分钟
  7. 大学生数学建模题论文
  8. 面对区块链,徐小平们懂个毛线(行业观察)
  9. 蓝桥杯试题 算法训练 绘制地图 C/C++解法 AC(最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情。。。。)
  10. TOPSIS法(优劣解距离法)介绍及 python3 实现