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;


用流程圖表示爲:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章