package cn.edu.njupt.allgo.util; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import cn.edu.njupt.allgo.R; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Parcelable; import android.provider.MediaStore; import android.view.View; import android.widget.ImageButton; /** * 1.构造时将Activity和imagebutton传入 * 2.需要重写Activiy的onActivityResult方法,里面写入本类的onActivityResult方法 * 3.调用getAvatar获取图片 * 4.结束时调用destroy删除临时文件 * @author 深蓝 * */ public class AvatarUtil { private ImageButton img_btn; private Activity activity; private static final int PHOTO_REQUEST_TAKEPHOTO = 1;// 拍照 private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择 private static final int PHOTO_REQUEST_CUT = 3;// 结果 // 创建一个以当前时间为名称的文件 private File tempFile = new File(Environment.getExternalStorageDirectory(),getPhotoFileName()); private Bitmap photo; /** * 照相或相册获取头像 * 1.构造时将Activity和imagebutton传入 * 2.需要重写Activiy的onActivityResult方法,里面写入本类的onActivityResult方法 * 3.调用getAvatar获取图片 * 4.最好在结束时调用destroy()方法 * @author 深蓝 * */ public AvatarUtil(ImageButton img_btn,Activity activity){ this.img_btn = img_btn; this.activity=activity; tempFile.deleteOnExit(); //退出时自动删除临时文件,经测试可能不起作用,原因不明 img_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showDialog(); } }); } //提示对话框方法 private void showDialog() { new AlertDialog.Builder(activity) .setTitle("头像设置") .setPositiveButton("拍照", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); // 调用系统的拍照功能 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 指定调用相机拍照后照片的储存路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile)); activity.startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO); } }) .setNeutralButton("相册", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); activity.startActivityForResult(intent, PHOTO_REQUEST_GALLERY); } }) .setNegativeButton("清除", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); img_btn.setImageResource(R.drawable.ic_avatar_register); photo = null; } }) .show(); } /** * 将此类放入Activtiy的onActivityResult方法里面 * @param requestCode * @param resultCode * @param data */ public void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub switch (requestCode) { case PHOTO_REQUEST_TAKEPHOTO://当选择拍照时调用 startPhotoZoom(Uri.fromFile(tempFile), 150); break; case PHOTO_REQUEST_GALLERY://当选择从本地获取图片时 //做非空判断,当我们觉得不满意想重新剪裁的时候便不会报异常,下同 if (data != null) startPhotoZoom(data.getData(), 150); break; case PHOTO_REQUEST_CUT://返回的结果 if (data != null) setPicToView(data); break; } } /** * 得到Bitmap图像 * @return 没有则返回null */ public Bitmap getAvatar(){ return photo; } /** * 得到图像文件 * @return */ /*public File getFile(){ if(photo == null){ return null; }else{ return tempFile; } }*/ /** * 删除临时文件 */ public void destroy(){ tempFile.delete(); } private void startPhotoZoom(Uri uri, int size) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // crop为true是设置在开启的intent中设置显示的view可以剪裁 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX,outputY 是剪裁图片的宽高 intent.putExtra("outputX", size); intent.putExtra("outputY", size); intent.putExtra("return-data", true); activity.startActivityForResult(intent, PHOTO_REQUEST_CUT); } //将进行剪裁后的图片显示到UI界面上 private void setPicToView(Intent picdata) { Bundle bundle = picdata.getExtras(); if (bundle != null) { photo = bundle.getParcelable("data"); //saveFile(); img_btn.setImageBitmap(photo); } } //废弃 private void saveFile(){ ByteArrayOutputStream bos = new ByteArrayOutputStream(); photo.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos); byte[] bitmapdata = bos.toByteArray(); //write the bytes in file FileOutputStream fos; try { fos = new FileOutputStream(tempFile); fos.write(bitmapdata); } catch (FileNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } // 使用系统当前日期加以调整作为照片的名称 private String getPhotoFileName() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss",Locale.CHINA); return dateFormat.format(date)+""; } }