从系统相册中选择照片或则调用系统相机。大部分的项目都会用到,我进行了一下封装,仿iOS的效果。
效果如下:
1、Camera的基类
- package com.zhang.test.picture;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.net.Uri;
- import android.provider.MediaStore;
- import java.io.File;
- /**
- * Camera的基类
- * @author zhang
- * @time 2016/7/13 15:03
- */
- public class CameraBase {
- //拍照裁剪的Code
- public static final int REQUEST_TAKE_PHOTO_CODE = 1001;
- //调用系统图库裁剪Code
- public static final int REQUEST_TAKE_PICTRUE_CODE = 1002;
- //裁剪的Code
- public static final int REQUEST_TAKE_CROP_CODE = 1003;
- //截取图片的高度
- public static final int REQUEST_HEIGHT = 100;
- //截取图片的宽度
- public static final int REQUEST_WIDTH = 200;
- //用来存储照片的URL
- private Uri photoURL;
- //调用照片的Activity
- private Activity activity;
- //回调函数
- private CameraResult02 cameraResult;
- public CameraBase(CameraResult02 cameraResult, Activity activity) {
- this.cameraResult = cameraResult;
- this.activity = activity;
- }
- //调用系统照相机,对Intent参数进行封装
- protected Intent startTakePhoto(Uri photoURL) {
- this.photoURL = photoURL;
- Intent intent = new Intent();
- //设置Action为拍照
- intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
- //将拍取的照片保存到指定URI
- intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURL);
- return intent;
- }
- //调用系统图库,对Intent参数进行封装
- protected Intent startTakePicture(Uri photoURL) {
- this.photoURL = photoURL;
- Intent intent = new Intent();
- intent.setAction(Intent.ACTION_PICK);
- intent.setType("image/*");//从所有图片中进行选择
- return intent;
- }
- //调用系统裁剪图片,对Intent参数进行封装
- protected Intent takeCropPicture(Uri photoURL, int with, int height) {
- Intent intent = new Intent("com.android.camera.action.CROP");
- intent.setDataAndType(photoURL, "image/*");
- intent.putExtra("crop", "true");
- // aspectX aspectY 是宽高的比例
- intent.putExtra("aspectX", 1);
- intent.putExtra("aspectY", 1);
- // outputX,outputY 是剪裁图片的宽高
- intent.putExtra("outputX", with);
- intent.putExtra("outputY", height);
- intent.putExtra("scale", true);
- intent.putExtra("scaleUpIfNeeded", true);//黑边
- intent.putExtra("return-data", true);
- return intent;
- }
- //拍照并裁剪
- public void getPhotoCameraCrop(Uri uri) {
- Intent intent = startTakePhoto(uri);
- activity.startActivityForResult(intent, REQUEST_TAKE_PHOTO_CODE);
- }
- //获取系统相册后裁剪
- public void getPhotoAlbumCrop(Uri uri) {
- activity.startActivityForResult(startTakePicture(uri), REQUEST_TAKE_PICTRUE_CODE);
- }
- //处理onActivityResult
- public void onResult(int requestCode, int resultCode, Intent intent) {
- if (resultCode == Activity.RESULT_OK) {
- switch (requestCode) {
- //选择系统图库.裁剪
- case REQUEST_TAKE_PICTRUE_CODE:
- photoURL = intent.getData();
- // Log.i("info", "photoURL: 111" + photoURL);
- activity.startActivityForResult(takeCropPicture(photoURL, REQUEST_HEIGHT,
- REQUEST_WIDTH), REQUEST_TAKE_CROP_CODE);
- break;
- //调用相机,裁剪
- case REQUEST_TAKE_PHOTO_CODE:
- // Log.i("info", "onResult: 111" + REQUEST_TAKE_PHOTO_CODE);
- activity.startActivityForResult(takeCropPicture(Uri.fromFile(new File
- (photoURL.getPath())), REQUEST_HEIGHT, REQUEST_WIDTH),
- REQUEST_TAKE_CROP_CODE);
- break;
- //裁剪之后的回调
- case REQUEST_TAKE_CROP_CODE:
- // Log.i("info", "onResult: 222" + REQUEST_TAKE_CROP_CODE);
- Bitmap bitmap = intent.getParcelableExtra("data");
- if (bitmap != null) {
- cameraResult.onSuccess(bitmap);
- } else {
- cameraResult.onFail("图片为空");
- }
- break;
- default:
- break;
- }
- }
- }
- }
2、对图片操作的代理类
- package com.zhang.test.picture;
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Environment;
- import java.io.File;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- /**
- * 对图片操作的代理
- *
- * @author zhang
- * @time 2016/7/13 14:59
- */
- public class CameraImg {
- //相机核心类
- private CameraBase CameraBase;
- // 创建一个以当前时间为名称的文件
- File tempFile = new File(Environment.getExternalStorageDirectory()+"/DCIM/Camera", getPhotoFileName());
- public CameraImg(CameraResult02 cameraResult, Activity activity) {
- CameraBase = new CameraBase(cameraResult, activity);
- }
- //拍照并截图
- public void getPhotoCameraCrop() {
- //
- //将File对象转换为Uri并启动照相程序
- Uri uri = Uri.fromFile(tempFile);
- // Log.i("info", "getPhotoCamera" + tempFile);
- CameraBase.getPhotoCameraCrop(uri);
- }
- //选择照片,并截图
- public void getPhotoAlbumCrop() {
- Uri uri = Uri.fromFile(tempFile);
- // Log.i("info", "getPhotoAlbumCrop>>>>>>" +tempFile);
- CameraBase.getPhotoAlbumCrop(uri);
- }
- //接受ActivityResult
- public void onResult(int requestCode, int resultCode, Intent data) {
- CameraBase.onResult(requestCode, resultCode, data);
- }
- // 使用系统当前日期加以调整作为照片的名称
- private String getPhotoFileName() {
- Date date = new Date(System.currentTimeMillis());
- SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");
- return dateFormat.format(date) + ".jpg";
- }
- }
3、接口类
- package com.zhang.test.picture;
- import android.graphics.Bitmap;
- /**
- * zhang
- */
- public interface CameraResult02 {
- //失败并返回message
- public abstract void onFail(String message) ;
- //成功并返回Bitmap
- public abstract void onSuccess(Bitmap bitmap);
- }
4.主界面调用的类
- package com.zhang.test.picture;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.Color;
- import android.graphics.drawable.ColorDrawable;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.Gravity;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup.LayoutParams;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.PopupWindow;
- import com.zhang.test.R;
- /**
- * 模仿苹果拍照的效果
- *
- * @author zhang
- * @time 2016/7/13 14:50
- */
- public class PhotoActivity extends Activity implements CameraResult02 {
- private CameraImg cameraImg;
- private PopupWindow popupWindow;
- private Button popCameraBt, popPhotorBt, popCancelBt;
- private Button btn;//
- private ImageView img;
- private View mainView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.photo);
- cameraImg = new CameraImg(this, PhotoActivity.this);
- initPopWindow();
- initView();
- setPopListen();
- }
- private void initView() {
- mainView = findViewById(R.id.main);
- btn = (Button) findViewById(R.id.photo_btn);
- img = (ImageView) findViewById(R.id.photo_img);
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- //第一个参数是要将PopupWindow放到的View,第二个参数是位置,第三第四是偏移值
- popupWindow.showAtLocation(mainView, Gravity.BOTTOM, 0, 0);
- }
- });
- }
- public void initPopWindow() {
- View popView = getLayoutInflater().inflate(R.layout.popwindow, null);
- //
- popupWindow = new PopupWindow(popView, LayoutParams.MATCH_PARENT,
- LayoutParams.WRAP_CONTENT);
- popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
- popupWindow.setAnimationStyle(R.style.popAnimStyle);
- // popupWindow.setFocusable(false);
- popCameraBt = (Button) popView.findViewById(R.id.tv01_pop);
- popPhotorBt = (Button) popView.findViewById(R.id.tv02_pop);
- popCancelBt = (Button) popView.findViewById(R.id.tv03_pop);
- }
- public void setPopListen() {
- //拍照截图
- popCameraBt.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- //关闭popupWindow
- popupWindow.dismiss();
- //拍照
- cameraImg.getPhotoCameraCrop();
- }
- });
- //图库选择
- popPhotorBt.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- popupWindow.dismiss();
- cameraImg.getPhotoAlbumCrop();
- }
- });
- //取消
- popCancelBt.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- popupWindow.dismiss();
- }
- });
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- cameraImg.onResult(requestCode, resultCode, data);
- }
- @Override
- public void onFail(String message) {
- Log.i("info", "onFail----" + message);
- }
- @Override
- public void onSuccess(Bitmap bitmap) {
- Log.i("info", "Bitmap----" + bitmap);
- img.setImageBitmap(bitmap);
- popupWindow.dismiss();
- }
- }