参考了网上的博文点击查看参考文
我要做的效果是在一个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类