
okhttp下载保存图片并更新图库
发布日期:2021-05-09 18:27:12
浏览次数:29
分类:原创文章
本文共 7602 字,大约阅读时间需要 25 分钟。
实现效果图:
清单文件,下载和读写文件
<!-- 访问网络的权限 --> <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(){ @Override public void handleMessage(Message msg) { if (msg.what==100){ //消息接收器 Bitmap a = (Bitmap) msg.obj; onSaveBitmap(a,MainActivity.this); iv.setImageBitmap(a); } } }; @Override protected 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{ @Override public 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() { @Override public 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() { @Override public void onFailure(Request request, IOException e) { Log.e("TAG","wang==onFailure"); } @Override public void onResponse(Response response) throws IOException { final String res = response.body().string(); runOnUiThread(new Runnable() { @Override public 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; }}
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月23日 08时39分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
嘿!为你的应用创建滚动日志吧?
2021-05-09
一个JAVA应用启动缓慢问题排查 --来自jdk securerandom 的问候
2021-05-09
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
2021-05-09
httprunner学习23-加解密
2021-05-09
jenkins学习13-凭据管理(删除多余的凭据)
2021-05-09
有道云笔记 同步到我的博客园
2021-05-09
阿里云“网红"运维工程师白金:做一个平凡的圆梦人
2021-05-09
AnalyticDB for PostgreSQL 6.0 新特性介绍
2021-05-09
Alibaba Cloud Linux 2 LTS 正式发布,提供更高性能和更多保障!
2021-05-09
李笑来必读书籍整理
2021-05-09
vue书籍整理
2021-05-09
记Java中有关内存的简单认识
2021-05-09
Mybatis配置解析
2021-05-09
http头部 Expect
2021-05-09
Hadoop(十六)之使用Combiner优化MapReduce
2021-05-09
C#实现outlook自动签名
2021-05-09
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
2021-05-09
CoreCLR源码探索(八) JIT的工作原理(详解篇)
2021-05-09