首先展示 相机的:
打开相机:打开相机之前要在intent中 定义字段 MedisStore.EXTRA_OUTPUT ,值为拍照后存照片的路径。 首先定义存相机拍照的照片的路径 ,这个路径你可以存在你想存的地方, 接下来是定义照片的名字 ,这里取 当前系统时间+.jpg 作为照片名称
照片的路径= 文件夹路径+ 文件名+ .jpg ;
public void openCamare() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
String aa = path + "mass/";
File file = new File(aa);
if (!file.exists()) {
file.mkdir();
}
String fileName = getPhoneFileName() + ".jpg";
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
phoneUri = Uri.fromFile(new File(aa + fileName));
intent.putExtra(MediaStore.EXTRA_OUTPUT, phoneUri);
startActivityForResult(intent, REQUEST_CAMERA);
}
}
相机 中的 图片 返回 onActivityResult 中:
case REQUEST_CAMERA://相机返回的图片
Uri uri = null;
if (data != null && data.getData() != null) {
uri = data.getData();}
if (uri == null) {
if (phoneUri != null) {
uri = phoneUri;}}
//imgPhone.setImageURI(uri);
camCropUri = uri;
cropImageUri(uri, 400, 400, REQUEST_XIANGJI);
注意 ,这里返回的 data.getData( )可能是 空的,如果是空的,可以取上面 存储的phoneUri ,uri 类似 File 。可以通过uri找到 图片。
相机对应的 裁剪方法:
void cropImageUri(Uri uri, int outputX, int outputY, int requestCode) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra("return-data", false);//这里是 false的 话 ,返回 Uri ,若为true的则返回小的 bitmap
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, requestCode);
}
对应的 onActivityResult 中 裁剪之后的图片的返回
case REQUEST_XIANGJI://相机图片 的 裁剪
Toast.makeText(this, "返回相机裁剪的图片", Toast.LENGTH_SHORT).show();
imgPhone.setImageURI(camCropUri);
break;
其中 打开裁剪的 intent中 ,一个参数 return-data,值为 true ,则返回 小图bitmap; 值为false 则返回 uri ,uri可以记录操作,还要注意一下 字段 outputFormat
如果对 URI 足够了解的话,应该知道 URI与File 相似,你所有的操作如裁剪将数据都保存在 URI中,你已经持有了相应的URI,也就无需多此一举,在返回bitmap了
相册 返回裁剪的图片也是这样 。 Android 4.4 之后,相册返回的Uri 是经过封装的,这个Uri 应该经过处理一下,
代码如下:
/**
* android 4.4以上的Uri 返回形式如下:
* content://com.android.providers.media.documents/document/image%3A8302
* content://com.android.providers.downloads.documents/document/5
* content://media/external/images/media/8302
* 我们不能直接通过前两种Uri直接获取到对应的表,所以需要“翻译一下”
* 这个方法是 给 相册返回的 uri 使用的
*/
private String handleImageOnKitKat(Uri uri) {
String imagePath = null;
if (DocumentsContract.isDocumentUri(this, uri)) {//第一种处理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
Log.i(">>>>>", uri.toString());
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {//第二种,处理
Log.i(">>>>>", uri.toString());
Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
Log.d(">>>>>", "content: " + uri.toString());
imagePath = getImagePath(uri);
}
Log.i(">>>>>>", "imagePath" + imagePath);
return imagePath;
}
打开相机或者相册 获取 对应返回图片的 Uri ,然后 把uri 传递到裁剪方法中 ,然后 打开裁剪框,裁剪之后 回调onActivityResult ,在 裁剪回调中获取 裁剪之后的图片 ,完成这一操作。
好了 ,打开相机和相册的裁剪说到这里