我们在开发过程中,经常遇到这样的需求,就是从网络获取URL,展示到imageview,并需要长按保存。

具体操作:

第一步,从网络获取图片,并且展示到imageview 。这个不需要赘述,glide 直接设置就可以,当前也可以自己再次封装。

第二步,因为需要保存到相册,所以需要操作文件,因此需要读写文件的权限,需要进行权限的请求。

第三步,进行保存到相册的操作。

具体操作,如下所示。

第一步:


public static void setImageShowImg(Context context, String img, ImageView imageView) {
    Glide.with(context).load(App.getInstance().setBaseUrl() + img).apply(new RequestOptions()
            .placeholder(R.mipmap.ic_placeholder))
            .into(imageView);

}


上述代码的前提是 后台返回的图片路径是相对路径,需要我们自己拼接,小伙伴儿们 根据自己的需要设置load的URL,根据自己的项目需求。

第二步:

权限的请求,可以参考我的权限请求获取的博客。

下面贴出来我写的一个权限请求的工具类。可以直接调用。


package com.example.mylibrary.utils.permission;

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;

/**
 * Time:2019/7/23
 * Author:pengzhen
 * Description: 权限请求的封装1.拍照 2.读写权限 3.拨打电话的权限
 */
public class PermissionUtils {
    private Context context;
    private HavePermission listener;

    /**
     * 拍照系列权限
     */
    private static final String[] permissionsCamera = {
            Manifest.permission.CAMERA,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE
    };
    /**
     * 读写权限
     */
    private static final String[] permissionsStorage = {
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE
    };
    /**
     * 拨打电话权限
     */
    private static final String[] permissionsCallPhone = {
            Manifest.permission.CALL_PHONE
    };

    public PermissionUtils(Context context, HavePermission listener) {
        this.context = context;
        this.listener = listener;
    }

    /**
     * @param
     * @time
     * @description 请求拍照等相关,权限,拍照,读写文件操作
     */
    public void requestPerssionCamera(int resId) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查该权限是否已经获取
            //拍照权限
            int camera = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
            //写入文件
            int write = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            //读文件
            int read = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
            if (camera != PackageManager.PERMISSION_GRANTED || write != PackageManager.PERMISSION_GRANTED || read != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                showDialogTipUserRequestPermissionCamera();
            } else {//获取权限之后 要进行的操作
                listener.havePermission(resId);//有权限之后的操作

            }
        }
    }

    /**
     * @param
     * @time
     * @description 请求读写文件操作权限
     */
    public void requestPerssionStorage(int resId) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查该权限是否已经获取
            int write = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);//写入文件
            int read = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);//读文件
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
            if (write != PackageManager.PERMISSION_GRANTED || read != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                showDialogTipUserRequestPermissionStorage();
            } else {//获取权限之后 要进行的操作
                listener.havePermission(resId);//有权限之后的操作

            }
        }
    }

    /**
     *@time
     *@param
     *@description 请求拍照等相关,权限,拍照,读写文件操作
     */
    public void requestPerssionCallPhone( int resId) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查该权限是否已经获取
            int i = ContextCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE);//拨打电话的权限
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
            if (i != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                showDialogTipUserRequestPermissionCallPhone();
            } else {//获取权限之后 要进行的操作

                listener.havePermission(resId);//有权限之后的操作

            }
        }
    }

    // 提示用户该请求权限的弹出框
    private void showDialogTipUserRequestPermissionCamera() {
        new AlertDialog.Builder(context)
                .setTitle("相机权限、读写权限")
                .setMessage("由于需要摄像,需要开启相机权限\n" +
                        "存储文件,需要开启读写权限\n" +
                        "否则无法正常使用")
                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startRequestPermissionCamera();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(context,"请允许权限开启",Toast.LENGTH_SHORT).show();
                    }
                }).setCancelable(false).show();
    }

    // 提示用户该请求权限的弹出框
    private void showDialogTipUserRequestPermissionStorage() {
        new AlertDialog.Builder(context)
                .setTitle("读写权限")
                .setMessage("由于需要保存到相册" +
                        "存储文件,需要开启读写权限\n" +
                        "否则无法正常使用")
                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startRequestPermissionStorage();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(context,"请允许权限开启",Toast.LENGTH_SHORT).show();
                    }
                }).setCancelable(false).show();
    }

    // 提示用户该请求权限的弹出框
    private void showDialogTipUserRequestPermissionCallPhone() {
        new AlertDialog.Builder(context)
                .setTitle("拨打电话权限")
                .setMessage("由于需要拨打电话,需要开启拨打电话权限\n" + "否则无法正常使用")
                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startRequestPermissionCallPhone();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(context,"请允许权限开启",Toast.LENGTH_SHORT).show();

                    }
                }).setCancelable(false).show();
    }



    // 开始提交请求权限
    private void startRequestPermissionCamera() {
        ActivityCompat.requestPermissions((Activity)context, permissionsCamera, 321);
    }

    // 开始提交请求权限
    private void startRequestPermissionStorage() {
        ActivityCompat.requestPermissions((Activity)context, permissionsStorage, 321);
    }

    // 开始提交请求权限
    private void startRequestPermissionCallPhone() {
        ActivityCompat.requestPermissions((Activity)context, permissionsCallPhone, 321);
    }



    /**
     * @param
     * @time
     * @description 对外开放接口 用于灵活处理 resId用来处理,同一个页面有多个按钮点击请求权限的情况
     */
    public interface HavePermission {

        void havePermission(int resId);

    }
}


第三步:

封装一个长按弹框,是否保存图片到相册。

第四步:

封装一个工具类,保存图片到相册。

代码如下所示:


package com.example.mylibrary.utils.camera;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.widget.ImageView;
import android.widget.Toast;

import com.example.mylibrary.utils.common.HnUtils;
import com.example.mylibrary.utils.date.HnDateUtils;
import com.example.mylibrary.utils.md5.EncryptUtils;
import com.example.mylibrary.view.dialog.CommDialog;

import java.io.File;

/**
 * Time:2019/6/27
 * Author:pengzhen
 * Description: 保存图片到相册
 */
public class SaveImgTools {

    /**
     *@time
     *@param
     *@description 长按保存图片到相册弹窗
     */
    public static void ShowSaveImgDialog(Context context, HavePressSaveImgDialogSure havePressSaveImgDialogSure, int resId){
        CommDialog.newInstance(context)
                .setTitle("保存图片")
                .setContent("是否保存图片到相册")
                .setClickListen(new CommDialog.TwoSelDialog() {
                    @Override
                    public void leftClick() {

                    }

                    @Override
                    public void rightClick() {//先生成屏幕截图 再保存

                     havePressSaveImgDialogSure.havePressSure(resId);
                    }
                })
                .show();
    }


    /**
     *@time
     *@param
     *@description 保存图片到相册
     */
    public static void SaveImageToSysAlbum(Context context, ImageView imageView) {

        BitmapDrawable bmpDrawable = (BitmapDrawable) imageView.getDrawable();
        Bitmap bitmap = bmpDrawable.getBitmap();
        if (bitmap==null){
            return;
        }
        MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "HaiGouShareCode", "");
        //如果是4.4及以上版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            String fileName = HnDateUtils.getCurrentDate("yyyyMMdd").toUpperCase() + EncryptUtils.encryptMD5ToString(HnUtils.createRandom(false, 5)) + ".png";
            File mPhotoFile = new File(fileName);
            Intent mediaScanIntent = new Intent(
                    Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            Uri contentUri = Uri.fromFile(mPhotoFile);
            mediaScanIntent.setData(contentUri);
            context.sendBroadcast(mediaScanIntent);

        } else {
            context.sendBroadcast(new Intent(
                    Intent.ACTION_MEDIA_MOUNTED,
                    Uri.parse("file://"
                            + Environment.getExternalStorageDirectory())));
        }
        Toast.makeText(context,"已保存到相册",Toast.LENGTH_SHORT).show();
    }

    public interface HavePressSaveImgDialogSure {
        void havePressSure(int resId);
    }
}