Android 4.4前后版本读取图库图片和拍照方法

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;

 用流程图表示为: 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值