4.4以上手机如果用pick的原生方法来选图,返回的uri还是正常的,但如果用ACTION_GET_CONTENT的方法,返回的uri跟4.3是完全不一样的,4.3返回的是带文件路径的,而4.4返回的却是content://com.Android.providers.media.documents/document/image:3951这样的,没有路径,只有图片编号的uri.这就导致接下来无法根据图片路径来裁剪的步骤了。
为什么会不一样呢?
Android 4.4(含)开始,通过方式访问图库后,返回的Uri如下(访问“最近”):
<pre name="code" class="java">Uri is:content://com.android.providers.media.documents/document/image%3A18838
Uri.getPath is :/document/image:18838
对应的图片真实路径:/storage/emulated/0/Pictures/Screenshots/Screenshot_2014-09-22-21-40-53
</pre><span style="font-family:Arial; font-size:14px; line-height:19.0909px">不但如此,对于不同类型图库,返回的Uri形式并不相同(访问普通相册):</span><p></p><pre>
<span style="font-family:Arial;"><span style="line-height: 19.0909px;">Uri is:content://media/external/images/media/18822
Uri.getPath is :/external/images/media/18822
对应的图片真实路径:/storage/emulated/0/Download/20130224235013.jpg</span></span>
<span style="font-family:Arial;"><span style="line-height: 19.0909px;">
</span></span>
<span style="font-family: Arial; line-height: 19.0909px; font-size: 14px;">而4.4之前返回的Uri只存在一种形式,如下:</span><span style="font-family:Arial;"><span style="line-height: 26px;">
</span></span>
<span style="font-family: Arial; font-size: 14px; line-height: 19.0909px;"></span><pre name="code" class="java">Uri is:content://media/external/images/media/14046
Uri.getPath is :/external/images/media/14046
对应的图片真实路径:/storage/emulated/0/DCIM/Camera/20130224235013.jpg
</pre><pre name="code" class="java"><span style="font-family: Arial; font-size: 14px; line-height: 26px;">因此,在Android 4.4或更高版本设备上,通过简单的getDataColumn(Context, Uri, null, null)进行图片数据库已经不能满足所有需求,因此在获取图片真实路径的时候需要根据不同类型区分对待。</span>
//版本比较:是否是4.4及以上版本
final boolean mIsKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
<span style="font-family: Arial; font-size: 14px; line-height: 26px;">从相册选择照片方法比较:</span> /**
* <br>功能简述:4.4以上裁剪图片方法实现---------------------- 相册
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
private void selectImageUriAfterKikat() {
<span style="color:#ff0000;">Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);</span>
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, SELECET_A_PICTURE_AFTER_KIKAT);
System.out.println("4.4以上裁剪图片方法实现---------------------- 相册");<span style="white-space:pre"> </span>
}
/**
* <br>功能简述:4.4以下裁剪图片方法实现---------------------- 相册
*/
private void cropImageUri() {
// TODO Auto-generated method stub
<span style="color:#ff0000;">Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);</span>
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 340);
intent.putExtra("outputY", 340);
intent.putExtra("scale", true);
<span style="color:#ff0000;">intent.putExtra("return-data", false);</span>
//intent.putExtra(MediaStore.EXTRA_OUTPUT,
//Uri.fromFile(new File(IMGPATH, TMP_IMAGE_FILE_NAME)));
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, SELECT_A_PICTURE);
System.out.println("4.4以下裁剪图片方法实现---------------------- 相册");
}
/**
* <br>功能简述:对拍照的图片剪切
* <br>功能详细描述:
* <br>注意:
* @param uri
*/
private void cameraCropImageUri(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/jpeg");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 640);
intent.putExtra("outputY", 640);
intent.putExtra("scale", true);
<span style="color:#ff0000;">if (mIsKitKat) {
intent.putExtra("return-data", true);
}else {
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
} </span>
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, SET_PICTURE);
}
显示结果处理如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case SELECT_A_PICTURE:
//cropImage(imageUri);
if (resultCode == RESULT_OK && null != data) {
//Log.i("相册", "4.4以下的");
Bitmap bitmap = decodeUriAsBitmap(Uri.fromFile(new File(IMGPATH,filename)));
imagview.setImageBitmap(bitmap);
PictureUri=Uri.fromFile(new File(IMGPATH,
filename));
//picName=String.valueOf(ContentUris.parseId(PictureUri));
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(MainActivity.this, "取消选择图册", Toast.LENGTH_SHORT).show();
}
break;
case SELECET_A_PICTURE_AFTER_KIKAT:
if (resultCode == RESULT_OK && null != data) {
// Log.i("相册", "4.4以上的");
mAlbumPicturePath = getPath(getApplicationContext(), data.getData());
System.out.println("mAlbumPicturePath"+mAlbumPicturePath);
SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");//
Date date =new Date(System.currentTimeMillis());
filename=format.format(date);
System.out.println("filename"+filename);
// picName=String.valueOf(ContentUris.parseId(Uri.fromFile(new File(mAlbumPicturePath))));//获取该uri下图片的名字
cropImageUriAfterKikat(Uri.fromFile(new File(mAlbumPicturePath)));
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(MainActivity.this, "取消选择图册", Toast.LENGTH_SHORT).show();
}
break;
case TAKE_A_PICTURE:
Log.i("zou", "TAKE_A_PICTURE-resultCode:" + resultCode);
if (resultCode == RESULT_OK) {
cameraCropImageUri(Uri.fromFile(new File(IMGPATH, filename)));
} else {
Toast.makeText(MainActivity.this, "取消拍照", Toast.LENGTH_SHORT).show();
}
break;
case SET_PICTURE:
Bitmap bitmap2 = null;
if (mIsKitKat) {
if (null != data) {
bitmap2 = data.getParcelableExtra("data");
imagview.setImageBitmap(bitmap2);
insert_bitmap=bitmap2;
PictureUri=Uri.fromFile(new File(IMGPATH,
filename));
}
}
else {
bitmap2 = decodeUriAsBitmap(Uri.fromFile(new File(IMGPATH,filename)));
imagview.setImageBitmap(bitmap2);
insert_bitmap=bitmap2;
PictureUri=Uri.fromFile(new File(IMGPATH,
filename));
}
break;
case SET_ALBUM_PICTURE_KITKAT:
Log.i("zou", "4.4以上上的 RESULT_OK");
Bitmap bitmap3 = decodeUriAsBitmap(Uri.fromFile(new File(IMGPATH,filename)));
System.out.println("IMGPATH "+IMGPATH+"filename "+filename);
System.out.println("Uri "+Uri.fromFile(new File(IMGPATH, filename)));
imagview.setImageBitmap(bitmap3);
insert_bitmap=bitmap3;
PictureUri=Uri.fromFile(new File(IMGPATH, filename));
//picName=String.valueOf(ContentUris.parseId(PictureUri));
break;
用流程图表示为: