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;    }}

 

上一篇:解决应用程序在大屏设备上显示不全问题
下一篇:android多项权限申请

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月23日 08时39分53秒