从系统相册中选择照片或则调用系统相机。大部分的项目都会用到,我进行了一下封装,仿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();
}
}