android-fragment里长按图片保存至相册

参考了网上的博文点击查看参考文

我要做的效果是在一个fragment里点击图片缩略图,然后弹出放大的图片,长按该大图后保存此图到相册

在此直接借用原文博主的保存图片的类

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class SavePhoto{
    //存调用该类的活动
    Context context;

    public SavePhoto(Context context) {
        this.context = context;
    }

    //保存文件的方法:
    public void SaveBitmapFromView(View view) throws ParseException {
        int w = view.getWidth();
        int h = view.getHeight();
        Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bmp);
        view.layout(0, 0, w, h);
        view.draw(c);
        // 缩小图片
        Matrix matrix = new Matrix();
        matrix.postScale(0.5f,0.5f); //长和宽放大缩小的比例
        bmp = Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
        DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        saveBitmap(bmp,bmp.toString() + ".JPEG");
    }

    /*
     * 保存文件,文件名为当前日期
     */
    public void saveBitmap(Bitmap bitmap, String bitName){
        String fileName ;
        File file ;
        if(Build.BRAND .equals("Xiaomi") ){ // 小米手机
            fileName = Environment.getExternalStorageDirectory().getPath()+"/DCIM/Camera/"+bitName ;
        }else{  // Meizu 、Oppo
            fileName = Environment.getExternalStorageDirectory().getPath()+"/DCIM/"+bitName ;
        }
        file = new File(fileName);

        if(file.exists()){
            file.delete();
        }
        FileOutputStream out;
        try{
            out = new FileOutputStream(file);
            // 格式为 JPEG,照相机拍出的图片为JPEG格式的,PNG格式的不能显示在相册中
            if(bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out))
            {
                out.flush();
                out.close();
                // 插入图库
                MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), bitName, null);

            }
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();

        }
        // 发送广播,通知刷新图库的显示
        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + fileName)));

    }
}

然后在fragment里,我的大图就没有单独用一个activity展示了,直接显示在dialog里的

imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                View view = View.inflate(getActivity().getApplicationContext(),R.layout.one_image,null);
                //这个iv是我定义的一个xml界面,里面只有一个imageview(展示大图)和textview(图片介绍),
                final ImageView iv = view.findViewById(R.id.one_image);
                iv.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        String[] PERMISSIONS = {
                                "android.permission.READ_EXTERNAL_STORAGE",
                                "android.permission.WRITE_EXTERNAL_STORAGE" };
                        //检测是否有写的权限
                        int permission = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(),
                                "android.permission.WRITE_EXTERNAL_STORAGE");
                                //在这里用的easyPermission,就没用原文里的检测
                        if(!EasyPermissions.hasPermissions(getContext(),PERMISSIONS)){
                            EasyPermissions.requestPermissions(getActivity(),"财魔方需要您打开一些权限",100,PERMISSIONS);
                            return false;
                        }
                        /*if (permission != PackageManager.PERMISSION_GRANTED) {
                            // 没有写的权限,去申请写的权限,会弹出对话框
                            ActivityCompat.requestPermissions(getActivity().getParent(), PERMISSIONS,1);
                        }*/
                        try {
                            //创建savephoto类保存图片
                            SavePhoto savePhoto = new SavePhoto(getActivity().getApplicationContext());
                            savePhoto.SaveBitmapFromView(iv);
                            new AlertDialogUtil().showDialog(getContext(),"","已保存,请到相册查看",true);
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        return false;
                    }
                });
                imageView.setDrawingCacheEnabled(true);
                iv.setImageBitmap(Bitmap.createBitmap(imageView.getDrawingCache()));
                imageView.setDrawingCacheEnabled(false);
                AlertDialog.Builder adb = new AlertDialog.Builder(getContext());
                adb.setCancelable(true).setView(view);
                AlertDialog ad = adb.create();
                ad.show();
            }
        });

目前还有一个问题是,保存到相册后,dialog里展示的大图被压缩了,这里需要在SavePhoto类里做修改,不压缩bitmap,有时间再仔细研究下savePhoto类

猜你喜欢

转载自blog.csdn.net/qq_25652949/article/details/89353355