Android中拍照和从相册选择图片,并剪裁(二)

从系统相册中选择照片或则调用系统相机。大部分的项目都会用到,我进行了一下封装,仿iOS的效果

效果如下:


1、Camera的基类

[html]  view plain  copy
  1. package com.zhang.test.picture;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.graphics.Bitmap;  
  6. import android.net.Uri;  
  7. import android.provider.MediaStore;  
  8.   
  9. import java.io.File;  
  10.   
  11. /**  
  12.  * Camera的基类  
  13.  * @author zhang  
  14.  * @time 2016/7/13  15:03  
  15.  */  
  16. public class CameraBase {  
  17.   
  18.   
  19.     //拍照裁剪的Code  
  20.     public static final int REQUEST_TAKE_PHOTO_CODE = 1001;  
  21.     //调用系统图库裁剪Code  
  22.     public static final int REQUEST_TAKE_PICTRUE_CODE = 1002;  
  23.     //裁剪的Code  
  24.     public static final int REQUEST_TAKE_CROP_CODE = 1003;  
  25.     //截取图片的高度  
  26.     public static final int REQUEST_HEIGHT = 100;  
  27.     //截取图片的宽度  
  28.     public static final int REQUEST_WIDTH = 200;  
  29.     //用来存储照片的URL  
  30.     private Uri photoURL;  
  31.     //调用照片的Activity  
  32.     private Activity activity;  
  33.   
  34.     //回调函数  
  35.     private CameraResult02 cameraResult;  
  36.   
  37.     public CameraBase(CameraResult02 cameraResult, Activity activity) {  
  38.         this.cameraResult = cameraResult;  
  39.         this.activity = activity;  
  40.     }  
  41.   
  42.     //调用系统照相机,对Intent参数进行封装  
  43.     protected Intent startTakePhoto(Uri photoURL) {  
  44.         this.photoURL = photoURL;  
  45.         Intent intent = new Intent();  
  46.         //设置Action为拍照  
  47.         intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);  
  48.         //将拍取的照片保存到指定URI  
  49.         intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURL);  
  50.         return intent;  
  51.     }  
  52.   
  53.   
  54.     //调用系统图库,对Intent参数进行封装  
  55.     protected Intent startTakePicture(Uri photoURL) {  
  56.         this.photoURL = photoURL;  
  57.         Intent intent = new Intent();  
  58.         intent.setAction(Intent.ACTION_PICK);  
  59.         intent.setType("image/*");//从所有图片中进行选择  
  60.   
  61.         return intent;  
  62.     }  
  63.   
  64.   
  65.     //调用系统裁剪图片,对Intent参数进行封装  
  66.     protected Intent takeCropPicture(Uri photoURL, int with, int height) {  
  67.         Intent intent = new Intent("com.android.camera.action.CROP");  
  68.         intent.setDataAndType(photoURL, "image/*");  
  69.         intent.putExtra("crop", "true");  
  70.         // aspectX aspectY 是宽高的比例  
  71.         intent.putExtra("aspectX", 1);  
  72.         intent.putExtra("aspectY", 1);  
  73.         // outputX,outputY 是剪裁图片的宽高  
  74.         intent.putExtra("outputX", with);  
  75.         intent.putExtra("outputY", height);  
  76.         intent.putExtra("scale", true);  
  77.         intent.putExtra("scaleUpIfNeeded", true);//黑边  
  78.         intent.putExtra("return-data", true);  
  79.   
  80.         return intent;  
  81.     }  
  82.   
  83.   
  84.     //拍照并裁剪  
  85.     public void getPhotoCameraCrop(Uri uri) {  
  86.         Intent intent = startTakePhoto(uri);  
  87.         activity.startActivityForResult(intent, REQUEST_TAKE_PHOTO_CODE);  
  88.     }  
  89.   
  90.   
  91.     //获取系统相册后裁剪  
  92.     public void getPhotoAlbumCrop(Uri uri) {  
  93.         activity.startActivityForResult(startTakePicture(uri), REQUEST_TAKE_PICTRUE_CODE);  
  94.     }  
  95.   
  96.   
  97.     //处理onActivityResult  
  98.     public void onResult(int requestCode, int resultCode, Intent intent) {  
  99.         if (resultCode == Activity.RESULT_OK) {  
  100.             switch (requestCode) {  
  101.   
  102.                 //选择系统图库.裁剪  
  103.                 case REQUEST_TAKE_PICTRUE_CODE:  
  104.                     photoURL = intent.getData();  
  105. //                    Log.i("info", "photoURL: 111" + photoURL);  
  106.                     activity.startActivityForResult(takeCropPicture(photoURL, REQUEST_HEIGHT,  
  107.                             REQUEST_WIDTH), REQUEST_TAKE_CROP_CODE);  
  108.                     break;  
  109.   
  110.                 //调用相机,裁剪  
  111.                 case REQUEST_TAKE_PHOTO_CODE:  
  112. //                    Log.i("info", "onResult: 111" + REQUEST_TAKE_PHOTO_CODE);  
  113.                     activity.startActivityForResult(takeCropPicture(Uri.fromFile(new File  
  114.                                     (photoURL.getPath())), REQUEST_HEIGHT, REQUEST_WIDTH),  
  115.                             REQUEST_TAKE_CROP_CODE);  
  116.                     break;  
  117.   
  118.                 //裁剪之后的回调  
  119.                 case REQUEST_TAKE_CROP_CODE:  
  120. //                    Log.i("info", "onResult: 222" + REQUEST_TAKE_CROP_CODE);  
  121.                     Bitmap bitmap = intent.getParcelableExtra("data");  
  122.                     if (bitmap != null) {  
  123.                         cameraResult.onSuccess(bitmap);  
  124.                     } else {  
  125.                         cameraResult.onFail("图片为空");  
  126.                     }  
  127.   
  128.                     break;  
  129.                 default:  
  130.                     break;  
  131.             }  
  132.         }  
  133.     }  
  134.   
  135. }  

2、对图片操作的代理类

[html]  view plain  copy
  1. package com.zhang.test.picture;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.net.Uri;  
  6. import android.os.Environment;  
  7.   
  8. import java.io.File;  
  9. import java.text.SimpleDateFormat;  
  10. import java.util.Date;  
  11.   
  12. /**  
  13.  * 对图片操作的代理  
  14.  *  
  15.  * @author zhang  
  16.  * @time 2016/7/13 14:59  
  17.  */  
  18. public class CameraImg {  
  19.   
  20.     //相机核心类  
  21.     private CameraBase CameraBase;  
  22.   
  23.     // 创建一个以当前时间为名称的文件  
  24.     File tempFile = new File(Environment.getExternalStorageDirectory()+"/DCIM/Camera", getPhotoFileName());  
  25.   
  26.     public CameraImg(CameraResult02 cameraResult, Activity activity) {  
  27.         CameraBase = new CameraBase(cameraResult, activity);  
  28.     }  
  29.   
  30.   
  31.     //拍照并截图  
  32.     public void getPhotoCameraCrop() {  
  33. //  
  34.         //将File对象转换为Uri并启动照相程序  
  35.         Uri uri = Uri.fromFile(tempFile);  
  36. //        Log.i("info", "getPhotoCamera" + tempFile);  
  37.         CameraBase.getPhotoCameraCrop(uri);  
  38.     }  
  39.   
  40.   
  41.     //选择照片,并截图  
  42.     public void getPhotoAlbumCrop() {  
  43.   
  44.         Uri uri = Uri.fromFile(tempFile);  
  45. //        Log.i("info", "getPhotoAlbumCrop>>>>>>" +tempFile);  
  46.         CameraBase.getPhotoAlbumCrop(uri);  
  47.     }  
  48.   
  49.   
  50.     //接受ActivityResult  
  51.     public void onResult(int requestCode, int resultCode, Intent data) {  
  52.         CameraBase.onResult(requestCode, resultCode, data);  
  53.     }  
  54.   
  55.   
  56.     // 使用系统当前日期加以调整作为照片的名称  
  57.     private String getPhotoFileName() {  
  58.         Date date = new Date(System.currentTimeMillis());  
  59.         SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");  
  60.         return dateFormat.format(date) + ".jpg";  
  61.     }  
  62. }  

3、接口类

[html]  view plain  copy
  1. package com.zhang.test.picture;  
  2.   
  3. import android.graphics.Bitmap;  
  4.   
  5. /**  
  6.  * zhang  
  7.  */  
  8. public interface CameraResult02 {  
  9.   
  10.     //失败并返回message  
  11.     public abstract void onFail(String message) ;  
  12.     //成功并返回Bitmap  
  13.     public abstract void onSuccess(Bitmap bitmap);  
  14.   
  15. }  

4.主界面调用的类
[html]  view plain  copy
  1. package com.zhang.test.picture;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.Color;  
  7. import android.graphics.drawable.ColorDrawable;  
  8. import android.os.Bundle;  
  9. import android.util.Log;  
  10. import android.view.Gravity;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.view.ViewGroup.LayoutParams;  
  14. import android.widget.Button;  
  15. import android.widget.ImageView;  
  16. import android.widget.PopupWindow;  
  17.   
  18. import com.zhang.test.R;  
  19.   
  20.   
  21. /**  
  22.  * 模仿苹果拍照的效果  
  23.  *  
  24.  * @author zhang  
  25.  * @time 2016/7/13  14:50  
  26.  */  
  27. public class PhotoActivity extends Activity implements CameraResult02 {  
  28.   
  29.     private CameraImg cameraImg;  
  30.     private PopupWindow popupWindow;  
  31.     private Button popCameraBt, popPhotorBt, popCancelBt;  
  32.   
  33.     private Button btn;//  
  34.     private ImageView img;  
  35.     private View mainView;  
  36.   
  37.     @Override  
  38.     protected void onCreate(Bundle savedInstanceState) {  
  39.         super.onCreate(savedInstanceState);  
  40.         setContentView(R.layout.photo);  
  41.         cameraImg = new CameraImg(this, PhotoActivity.this);  
  42.         initPopWindow();  
  43.         initView();  
  44.         setPopListen();  
  45.     }  
  46.   
  47.     private void initView() {  
  48.         mainView = findViewById(R.id.main);  
  49.         btn = (Button) findViewById(R.id.photo_btn);  
  50.         img = (ImageView) findViewById(R.id.photo_img);  
  51.   
  52.         btn.setOnClickListener(new OnClickListener() {  
  53.             @Override  
  54.             public void onClick(View v) {  
  55.                 //第一个参数是要将PopupWindow放到的View,第二个参数是位置,第三第四是偏移值  
  56.                 popupWindow.showAtLocation(mainView, Gravity.BOTTOM, 0, 0);  
  57.   
  58.             }  
  59.         });  
  60.   
  61.     }  
  62.   
  63.     public void initPopWindow() {  
  64.         View popView = getLayoutInflater().inflate(R.layout.popwindow, null);  
  65.         //  
  66.         popupWindow = new PopupWindow(popView, LayoutParams.MATCH_PARENT,  
  67.                 LayoutParams.WRAP_CONTENT);  
  68.         popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));  
  69.         popupWindow.setAnimationStyle(R.style.popAnimStyle);  
  70.         // popupWindow.setFocusable(false);  
  71.         popCameraBt = (Button) popView.findViewById(R.id.tv01_pop);  
  72.         popPhotorBt = (Button) popView.findViewById(R.id.tv02_pop);  
  73.         popCancelBt = (Button) popView.findViewById(R.id.tv03_pop);  
  74.     }  
  75.   
  76.   
  77.     public void setPopListen() {  
  78.   
  79.         //拍照截图  
  80.         popCameraBt.setOnClickListener(new OnClickListener() {  
  81.             @Override  
  82.             public void onClick(View v) {  
  83.                 //关闭popupWindow  
  84.                 popupWindow.dismiss();  
  85.                 //拍照  
  86.                 cameraImg.getPhotoCameraCrop();  
  87.   
  88.             }  
  89.         });  
  90.   
  91.         //图库选择  
  92.         popPhotorBt.setOnClickListener(new OnClickListener() {  
  93.             @Override  
  94.             public void onClick(View v) {  
  95.                 popupWindow.dismiss();  
  96.                 cameraImg.getPhotoAlbumCrop();  
  97.             }  
  98.         });  
  99.         //取消  
  100.         popCancelBt.setOnClickListener(new OnClickListener() {  
  101.   
  102.             @Override  
  103.             public void onClick(View v) {  
  104.                 popupWindow.dismiss();  
  105.             }  
  106.         });  
  107.     }  
  108.   
  109.   
  110.     @Override  
  111.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  112.         super.onActivityResult(requestCode, resultCode, data);  
  113.         cameraImg.onResult(requestCode, resultCode, data);  
  114.     }  
  115.   
  116.     @Override  
  117.     public void onFail(String message) {  
  118.         Log.i("info", "onFail----" + message);  
  119.     }  
  120.   
  121.     @Override  
  122.     public void onSuccess(Bitmap bitmap) {  
  123.         Log.i("info", "Bitmap----" + bitmap);  
  124.         img.setImageBitmap(bitmap);  
  125.         popupWindow.dismiss();  
  126.     }  
  127. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值