可参考
https://blog.csdn.net/hu_ling_feng/article/details/46642823
/*
* Desc: CameraUtil 系统程序适配
* 1. 拍照
* 2. 相册
* 3. 裁切
*/
public class CameraUtil {
private static final String TAG = "CameraUtil";
public static final String PIC_PATH = Environment.getExternalStorageDirectory().toString() + "/Pictures/";
/**
* 拍照
*
* @param activity
* @param outputFile
*/
public static void takePhoto(Activity activity, File outputFile) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = FileProviderUtil.uriFromFile(activity, outputFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
activity.startActivityForResult(intent, REQ_CAMERA);
}
/**
* 相册
*
* @param activity
*/
public static void fromAlbum(Activity activity) {
Intent intent = new Intent();
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
intent.setAction(Intent.ACTION_PICK);
activity.startActivityForResult(intent, REQ_ALBUM);
}
/**
* 剪裁
*
* @param activity
* @param uri
*/
public static void crop(Activity activity, Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
FileProviderUtil.setIntentDataAndType(activity, intent, "image/*", uri, true);
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
//return-data为true时,直接返回bitmap,可能会很占内存,不建议,小米等个别机型会出异常!!!
//所以适配小米等个别机型,裁切后的图片,不能直接使用data返回,应使用uri指向
//裁切后保存的URI,不属于我们向外共享的,所以可以使用fill://类型的URI
//这里uri一定要是这么写,不能是FileProvider方式获取,否则相册获取图片时,会报错
Uri outputUri = Uri.fromFile(getTempAvatarFile());
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
LogUtil.e(TAG, "uri = " + uri + " ,outputUri = " + outputUri);
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
activity.startActivityForResult(intent, REQ_CROP);
}
/**
* 头像的临时文件Uri
*
* @return
*/
public static Uri getTempAvatarUri(Context context) {
File out = getTempAvatarFile();
return FileProviderUtil.uriFromFile(context, out);
}
/**
* 头像的临时文件
*
* @return
*/
public static File getTempAvatarFile() {
String fileName = AVATAR_FILE_NAME;
File out = new File(PIC_PATH);
if (!out.exists()) {
out.mkdirs();
}
return new File(PIC_PATH, fileName);
}
public static Uri getTempUri(Context context) {
String fileName = System.currentTimeMillis() + ".jpg";
File out = new File(PIC_PATH);
if (!out.exists()) {
out.mkdirs();
}
out = new File(PIC_PATH, fileName);
return FileProviderUtil.uriFromFile(context, out);
}
}
在Activity中调用拍照,相册,剪裁如下:
//手机拍照时,onActivityResult中data==null
/**
* 打开相册
*/
private void chooseFromAlbum() {
CameraUtil.fromAlbum(this);
}
/**
* 相机拍照
*/
private void takePhoto() {
File tempAvatarFile = CameraUtil.getTempAvatarFile();
mImageUri = FileProviderUtil.uriFromFile(this, tempAvatarFile);
CameraUtil.takePhoto(this, tempAvatarFile);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == MainActivityForPoverty.RESULT_OK) {
switch (requestCode) {
case REQ_CAMERA:
if (data != null) {
Uri uri = data.getData();
CameraUtil.crop(this, uri);
LogUtil.e(TAG, " image from camera uri = " + uri);
} else {
CameraUtil.crop(this, mImageUri);
}
break;
case REQ_ALBUM:
if (data != null) {
Uri uri = data.getData();
CameraUtil.crop(this, uri);
LogUtil.e(TAG, " image from album uri = " + uri);
}
break;
case REQ_CROP:
if (mImageUri == null) {
mImageUri = CameraUtil.getTempAvatarUri(this);
}
String pathFromUri = PictureUtils.getPathFromUri(this, mImageUri);
PicassoUtils.loadImageFromFile(this, new File(pathFromUri), 70, 70, civAvatar);
updataPersonalImage(pathFromUri);
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
以上是可行的。参考FileProviderUtil。
----------------------------------------------------------------------------------------------------
拍照,相册回调处理
方式1:
/**
* 获取拍照图片
*/
private void getCameraPicture() {
try {
//该uri就是照片文件夹对应的uri
Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(mImageUri));
// 给相应的ImageView设置图片 未裁剪
civAvatar.setImageBitmap(bit);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取相册图片
*
* @param data
*/
private void getAlbumPicture(Intent data) {
Uri selectedImage = data.getData();
String selectedString = selectedImage.toString();
if (selectedString.indexOf("/document/") > 0 && selectedString.indexOf("%3A") > 0) {
String id = selectedString.split("%3A")[1];
selectedImage = Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI + "/" + id);
}
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
if (picturePath == null) {
Toast.makeText(this, "请从相册里选择", Toast.LENGTH_SHORT).show();
} else {
PicassoUtils.loadImageFromFile(this, new File(picturePath), 40, 40, civAvatar);
}
}
方式2: