我们在开发过程中,经常遇到这样的需求,就是从网络获取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); } }