实现效果图:

清单文件,下载和读写文件

 <!-- 访问网络的权限 --><uses-permission android:name="android.permission.INTERNET" /><!-- 文件读取的权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 向SD卡中创建或者删除的权限。 --><uses-permission android:name="andorid.permission.MONUN_UNMOUNT_FILESYSTEMS"/>

在这里进行主要的功能实现,包括两个方式启动线程,使用okhttp做图片下载和get请求,然后保存图片文件到本地,把图片文件转换为数据流,写入系统图片文件夹,然后通知图库对于图片文件进行更新

package com.example.administrator.testz;import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.Headers;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import com.squareup.okhttp.ResponseBody;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;public class MainActivity extends AppCompatActivity {private TextView tv;private ImageView iv;private String url = "https://img-my.csdn.net/uploads/201508/05/1438760726_5120.jpg";private String urls = "https://b-ssl.duitang.com/uploads/item/201407/18/20140718154214_BFeQt.thumb.1400_0.jpeg";private String url2 = "http://n.sinaimg.cn/sinacn10119/200/w640h360/20181223/4c27-hqqzpku7644786.jpg";final String[] PERMISSIONS = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE};Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {if (msg.what==100){//消息接收器Bitmap a = (Bitmap) msg.obj;onSaveBitmap(a,MainActivity.this);iv.setImageBitmap(a);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = (TextView)findViewById(R.id.tv);iv = (ImageView)findViewById(R.id.iv);doCheckPermission(); //android7.0开启文件权限// getInter(); 普通的okhttp的get请求方式// getRunnnanle(); 第一种线程启动方式getRunnnanle2();}//检查所需的全部权限public boolean doCheckPermission() {PermissionsChecker mPermissionsChecker = new PermissionsChecker(MainActivity.this);if (mPermissionsChecker.lacksPermissions(PERMISSIONS)) {ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS, 0x12);return false;}return true;}//图片保存到本地private void onSaveBitmap(final Bitmap bitmap, final Context context) {File appDir = new File(Environment.getExternalStorageDirectory(),"wang");if(!appDir.exists()){appDir.mkdir();}String filename = System.currentTimeMillis()+".jpg";File file = new File(appDir,filename);try {/*Bitmap.CompressFormat format 图像的压缩格式;int quality 图像压缩率,0-100。 0 压缩100%,100意味着不压缩;OutputStream stream 写入压缩数据的输出流;*/FileOutputStream fos = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.JPEG,100,fos); //质量压缩  10倍fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}//将文件插入到系统图库try {MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(),filename,null);} catch (FileNotFoundException e) {e.printStackTrace();}//通知图库更新context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.parse("file://"+file)));}//第二种线程启动方式private void getRunnnanle2() {MyThread2 mythread2 = new MyThread2();Thread thread = new Thread(mythread2);thread.start();}//接口实现启动线程class MyThread2 implements Runnable{@Overridepublic void run() {final Bitmap bitmap = getPic(url2);Message msg = new Message();msg.what=100;msg.obj = bitmap;handler.sendMessage(msg);}}//第一种方式启动线程private void getRunnnanle() {new Thread(new Runnable() {@Overridepublic void run() {final Bitmap bitmap = getPic(urls);Message msg = new Message();msg.what=100;msg.obj = bitmap;handler.sendMessage(msg);}}).start();}//okhttp下载图片private Bitmap getPic(String url) {try{OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(url).build();ResponseBody body = client.newCall(request).execute().body();InputStream in = body.byteStream();Bitmap bitmap = BitmapFactory.decodeStream(in);return bitmap;}catch (Exception e){e.printStackTrace();}return null;}//普通的okhttp网络请求private void getInter() {OkHttpClient mOkHttpClient = new OkHttpClient();final Request request = new Request.Builder().url("https://github.com/hongyangAndroid").build();Call call = mOkHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Request request, IOException e) {Log.e("TAG","wang==onFailure");}@Overridepublic void onResponse(Response response) throws IOException {final String res = response.body().string();runOnUiThread(new Runnable() {@Overridepublic void run() {tv.setText(res);Log.e("TAG","wang==onResponse成功了"+res);}});}});}}

3.android7.0以后需要对文件进行权限申请


import android.content.Context;import android.content.pm.PackageManager;import android.os.Build;import android.support.v4.content.ContextCompat;public class PermissionsChecker {private final Context mContext;public PermissionsChecker(Context context) {mContext = context.getApplicationContext();}// 判断权限集合public boolean lacksPermissions(String... permissions) {for (String permission : permissions) {if (lacksPermission(permission)) {return true;}}return false;}// 判断是否缺少权限private boolean lacksPermission(String permission) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {return ContextCompat.checkSelfPermission(mContext, permission) ==PackageManager.PERMISSION_DENIED;}return false;}}

okhttp下载保存图片并更新图库相关推荐

  1. 使用okHttp下载文件到本地

    前几天项目中遇到了下载的问题,就在网上找了一下关于用okHttp下载文件的知识点. 下面这个是一个工具类,直接看代码吧. /*** 文件下载工具类(单例模式)*/public class Downlo ...

  2. 使用OkHttp 下载文件无进度回调 踩坑

    一.踩坑速记 1. 未添加header指定服务器采用何种压缩方式导致下载进度异常 描述:使用OkHttp3执行文件下载(服务端有nginx反向代理服务器进行压缩),获取回调中文件总大小为0或负值,导致 ...

  3. Kali Linux攻防系统(一:攻防系统Kali Linux下载安装与更新)

    任务一:攻防系统Kali Linux下载安装与更新 1.1.安装Kali Linux虚拟机 1.1.1.电脑硬件配置至少达到 CPU 内存 存储 >四核 >4G >20G 1.1.2 ...

  4. aaynctask控制多个下载进度_AsyncTask用法解析-下载文件动态更新进度条

    1. 泛型 AysncTask Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入. Progress:后台任务执行的进度,若不用显示进度条,则不需要 ...

  5. Python中scrapy下载保存图片

    在日常爬虫练习中,我们爬取到的数据需要进行保存操作,在scrapy中我们可以使用ImagesPipeline这个类来进行相关操作,这个类是scrapy已经封装好的了,我们直接拿来用即可. 在使用Ima ...

  6. Android音频实时传输与播放(四):源码下载(问题更新)【转】

    Android音频实时传输与播放(四):源码下载(问题更新) 激动人心的时刻到了有木有 ^_^ 服务端下载请点击这里,客户端下载请点击这里! 最近有朋友在下载源码使用之后,说播放出来的声音噪声很大.其 ...

  7. 全国地址数据库下载 mysql版更新共668389条记录 精确到村

     全国地址数据库下载 mysql版更新至 2016年8月 共668389条记录 精确到村 全国地址数据库下载 PS:数据来源自国家统计局:http://www.stats.gov.cn/tjsj/ ...

  8. EasyClick更新图库

    EasyClick更新图库 EasyClick 更新Android 手机图库 代码如下,非root环境shell使用代理模式函数执行,自行测试. // 更新图库文件夹 -d 后面的为文件夹路径 she ...

  9. Kotlin学习——简单运用协程网络下载图片并更新到UI

    kotlin学习 协程Coroutines学习 简单小Demo:通过协程下载一张网络图片并显示出来 文章目录 kotlin学习 前言 一.如何开启一个协程? 二.如何在项目中使用协程 增加对 Kotl ...

最新文章

  1. HTML5 javascript修改canvas的大小
  2. 前端利器—1—转型JS编程
  3. Android开发:操作UI线程4种方法
  4. label文字颜色_HowTo —— SwiftUI2.0如何使用Label
  5. 一文了解结构体字节对齐
  6. 2014年第五届蓝桥杯C/C++ A组国赛 —— 第二题:六角幻方
  7. Codeforces Round #701 (Div. 2) C. Floor and Mod 数学分块
  8. vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”
  9. linux数组随机数,随机数与数组
  10. 博图买什么样配置的笔记本_3dsmax需要什么样的笔记本配置?
  11. python接口自动化(二十一)--unittest简介(详解)
  12. sql创建表主键gui_在SQL Server中使用主数据服务快速创建最终用户可以维护的GUI
  13. 流行的Spring Boot + Vue架构整合开发的网易云+QQ音乐(附源码)!
  14. 使用calibre搭建了一套电子图书系统
  15. 用JS实现图片模糊到清晰预加载效果
  16. 架设网页手游需要什么服务器,架设手游用什么云服务器
  17. 服务器漏洞扫描系统的简单搭建
  18. C++17之std::apply与std::make_from_tuple
  19. 如何画好室内手绘效果图,非常值得…
  20. 央视 315 晚会曝光数据泄露

热门文章

  1. 首次跌至发行价的Snap,要如何抵抗社交巨头Facebook的抄袭?
  2. 分享复习经验和后台开发面经,已拿offer入职
  3. Jquery将table转换成excel实现下载
  4. 用图带你了解大数据框架架构之DophinScheduler
  5. 【洛谷 P1970】 [NOIP2013 提高组] 花匠
  6. vue使用echarts绘制地图
  7. ubuntu16.04安装网易云音乐方法出现问题及解决方法(桌面图标打不开、不能输入中文等问题)
  8. 软件工程师薪酬最高的25家公司!!!
  9. c语言省二机考和笔试,计算机二级都是上午考试吗
  10. Android开发音效增强中铃声播放Ringtone及声音池调度SoundPool的讲解及实战(超详细 附源码)