日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【转】Android 4.4前后版本读取图库图片和拍照完美解决方案

發(fā)布時間:2024/4/14 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】Android 4.4前后版本读取图库图片和拍照完美解决方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://blog.csdn.net/zbjdsbj/article/details/42387551

4.3或以下,選了圖片之后,根據(jù)Uri來做處理,很多帖子都有了,我就不詳細說了.主要是4.4,如果使用上面pick的原生方法來選圖,返回的uri還是正常的,但如果用ACTION_GET_CONTENT的方法,返回的uri跟4.3是完全不一樣的,4.3返回的是帶文件路徑的,而4.4返回的卻是content://com.Android.providers.media.documents/document/image:3951這樣的,沒有路徑,只有圖片編號的uri.這就導致接下來無法根據(jù)圖片路徑來裁剪的步驟了.

來自overflow大牛的方法,4.4得到的uri,需要以下方法來獲取文件的路徑:

?

[javascript]?view plaincopy print?
  • /**??
  • ?*?<br>功能簡述:4.4及以上獲取圖片的方法?
  • ?*?<br>功能詳細描述:?
  • ?*?<br>注意:?
  • ?*?@param?context?
  • ?*?@param?uri?
  • ?*?@return?
  • ?*/??
  • @TargetApi(Build.VERSION_CODES.KITKAT)??
  • public?static?String?getPath(final?Context?context,?final?Uri?uri)?{??
  • ??
  • ????final?boolean?isKitKat?=?Build.VERSION.SDK_INT?>=?Build.VERSION_CODES.KITKAT;??
  • ??
  • ????//?DocumentProvider??
  • ????if?(isKitKat?&&?DocumentsContract.isDocumentUri(context,?uri))?{??
  • ????????//?ExternalStorageProvider??
  • ????????if?(isExternalStorageDocument(uri))?{??
  • ????????????final?String?docId?=?DocumentsContract.getDocumentId(uri);??
  • ????????????final?String[]?split?=?docId.split(":");??
  • ????????????final?String?type?=?split[0];??
  • ??
  • ????????????if?("primary".equalsIgnoreCase(type))?{??
  • ????????????????return?Environment.getExternalStorageDirectory()?+?"/"?+?split[1];??
  • ????????????}??
  • ????????}??
  • ????????//?DownloadsProvider??
  • ????????else?if?(isDownloadsDocument(uri))?{??
  • ??
  • ????????????final?String?id?=?DocumentsContract.getDocumentId(uri);??
  • ????????????final?Uri?contentUri?=?ContentUris.withAppendedId(??
  • ????????????????????Uri.parse("content://downloads/public_downloads"),?Long.valueOf(id));??
  • ??
  • ????????????return?getDataColumn(context,?contentUri,?null,?null);??
  • ????????}??
  • ????????//?MediaProvider??
  • ????????else?if?(isMediaDocument(uri))?{??
  • ????????????final?String?docId?=?DocumentsContract.getDocumentId(uri);??
  • ????????????final?String[]?split?=?docId.split(":");??
  • ????????????final?String?type?=?split[0];??
  • ??
  • ????????????Uri?contentUri?=?null;??
  • ????????????if?("image".equals(type))?{??
  • ????????????????contentUri?=?MediaStore.Images.Media.EXTERNAL_CONTENT_URI;??
  • ????????????}?else?if?("video".equals(type))?{??
  • ????????????????contentUri?=?MediaStore.Video.Media.EXTERNAL_CONTENT_URI;??
  • ????????????}?else?if?("audio".equals(type))?{??
  • ????????????????contentUri?=?MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;??
  • ????????????}??
  • ??
  • ????????????final?String?selection?=?"_id=?";??
  • ????????????final?String[]?selectionArgs?=?new?String[]?{?split[1]?};??
  • ??
  • ????????????return?getDataColumn(context,?contentUri,?selection,?selectionArgs);??
  • ????????}??
  • ????}??
  • ????//?MediaStore?(and?general)??
  • ????else?if?("content".equalsIgnoreCase(uri.getScheme()))?{??
  • ??
  • ????????//?Return?the?remote?address??
  • ????????if?(isGooglePhotosUri(uri))??
  • ????????????return?uri.getLastPathSegment();??
  • ??
  • ????????return?getDataColumn(context,?uri,?null,?null);??
  • ????}??
  • ????//?File??
  • ????else?if?("file".equalsIgnoreCase(uri.getScheme()))?{??
  • ????????return?uri.getPath();??
  • ????}??
  • ??
  • ????return?null;??
  • }??
  • ??
  • public?static?String?getDataColumn(Context?context,?Uri?uri,?String?selection,??
  • ????????String[]?selectionArgs)?{??
  • ??
  • ????Cursor?cursor?=?null;??
  • ????final?String?column?=?"_data";??
  • ????final?String[]?projection?=?{?column?};??
  • ??
  • ????try?{??
  • ????????cursor?=?context.getContentResolver().query(uri,?projection,?selection,?selectionArgs,??
  • ????????????????null);??
  • ????????if?(cursor?!=?null?&&?cursor.moveToFirst())?{??
  • ????????????final?int?index?=?cursor.getColumnIndexOrThrow(column);??
  • ????????????return?cursor.getString(index);??
  • ????????}??
  • ????}?finally?{??
  • ????????if?(cursor?!=?null)??
  • ????????????cursor.close();??
  • ????}??
  • ????return?null;??
  • }??
  • ??
  • /**?
  • ?*?@param?uri?The?Uri?to?check.?
  • ?*?@return?Whether?the?Uri?authority?is?ExternalStorageProvider.?
  • ?*/??
  • public?static?boolean?isExternalStorageDocument(Uri?uri)?{??
  • ????return?"com.android.externalstorage.documents".equals(uri.getAuthority());??
  • }??
  • ??
  • /**?
  • ?*?@param?uri?The?Uri?to?check.?
  • ?*?@return?Whether?the?Uri?authority?is?DownloadsProvider.?
  • ?*/??
  • public?static?boolean?isDownloadsDocument(Uri?uri)?{??
  • ????return?"com.android.providers.downloads.documents".equals(uri.getAuthority());??
  • }??
  • ??
  • /**?
  • ?*?@param?uri?The?Uri?to?check.?
  • ?*?@return?Whether?the?Uri?authority?is?MediaProvider.?
  • ?*/??
  • public?static?boolean?isMediaDocument(Uri?uri)?{??
  • ????return?"com.android.providers.media.documents".equals(uri.getAuthority());??
  • }??
  • ??
  • /**?
  • ?*?@param?uri?The?Uri?to?check.?
  • ?*?@return?Whether?the?Uri?authority?is?Google?Photos.?
  • ?*/??
  • public?static?boolean?isGooglePhotosUri(Uri?uri)?{??
  • ????return?"com.google.android.apps.photos.content".equals(uri.getAuthority());??
  • }</span></span>??


  • 為什么會不一樣呢?

    Android 4.4(含)開始,通過方式訪問圖庫后,返回的Uri如下(訪問“最近”):
    [javascript]?view plaincopy print?
  • Uri?is:content://com.android.providers.media.documents/document/image%3A18838??
  • 2?Uri.getPath?is?:/document/image:18838??
  • 3?對應的圖片真實路徑:/storage/emulated/0/Pictures/Screenshots/Screenshot_2014-09-22-21-40-53.png</span>??

  • 不但如此,對于不同類型圖庫,返回的Uri形式并不相同(訪問普通相冊):

    [javascript]?view plaincopy print?
  • Uri?is:content://media/external/images/media/18822??
  • 2?Uri.getPath?is?:/external/images/media/18822??
  • 3?對應的圖片真實路徑:/storage/emulated/0/Download/20130224235013.jpg</span>??

  • 而4.4之前返回的Uri只存在一種形式,如下:

    [javascript]?view plaincopy print?
  • Uri?is:content://media/external/images/media/14046??
  • 2?Uri.getPath?is?:/external/images/media/14046??
  • 3?對應的圖片真實路徑:/storage/emulated/0/DCIM/Camera/20130224235013.jpg??

  • 因此,在Android 4.4或更高版本設備上,通過簡單的getDataColumn(Context, Uri, null, null)進行圖片數(shù)據(jù)庫已經不能滿足所有需求,因此在獲取圖片真實路徑的時候需要根據(jù)不同類型區(qū)分對待。

    版本判斷:

    [javascript]?view plaincopy print?
  • //版本比較:是否是4.4及以上版本??
  • ????final?boolean?mIsKitKat?=?Build.VERSION.SDK_INT?>=?Build.VERSION_CODES.KITKAT;??

  • 從相冊選擇照片方法比較:

    [javascript]?view plaincopy print?
  • /**??
  • ?????*?<br>功能簡述:4.4及以上從相冊選擇照片?
  • ?????*?<br>功能詳細描述:?
  • ?????*?<br>注意:?
  • ?????*/??
  • ????@TargetApi(Build.VERSION_CODES.KITKAT)??
  • ????private?void?SelectImageUriAfterKikat()?{??
  • ????????Intent?intent?=?new?Intent(Intent.ACTION_OPEN_DOCUMENT);??
  • ????????intent.addCategory(Intent.CATEGORY_OPENABLE);??
  • ????????intent.setType("image/*");??
  • ????????startActivityForResult(intent,?SELECET_A_PICTURE_AFTER_KIKAT);??
  • ????}??


  • [javascript]?view plaincopy print?
  • /**??
  • ?????*?<br>功能簡述:4.4以下從相冊選照片并剪切?
  • ?????*?<br>功能詳細描述:?
  • ?????*?<br>注意:?
  • ?????*/??
  • ????private?void?cropImageUri()?{??
  • ????????Intent?intent?=?new?Intent(Intent.ACTION_GET_CONTENT,?null);??
  • ????????intent.setType("image/*");??
  • ????????intent.putExtra("crop",?"true");??
  • ????????intent.putExtra("aspectX",?1);??
  • ????????intent.putExtra("aspectY",?1);??
  • ????????intent.putExtra("outputX",?640);??
  • ????????intent.putExtra("outputY",?640);??
  • ????????intent.putExtra("scale",?true);??
  • ????????intent.putExtra("return-data",?false);??
  • ????????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);??
  • ????}??

  • 4.4及以上選取照片后需要調用剪切方法:

    [javascript]?view plaincopy print?
  • /**??
  • ?????*?<br>功能簡述:?4.4及以上選取照片后剪切方法?
  • ?????*?<br>功能詳細描述:?
  • ?????*?<br>注意:?
  • ?????*?@param?uri?
  • ?????*/??
  • ????private?void?cropImageUriAfterKikat(Uri?uri)?{??
  • ????????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",?640);??
  • ????????intent.putExtra("outputY",?640);??
  • ????????intent.putExtra("scale",?true);??
  • ????????intent.putExtra("return-data",?true);?//返回數(shù)據(jù)bitmap??
  • ????????intent.putExtra("outputFormat",?Bitmap.CompressFormat.JPEG.toString());??
  • ????????intent.putExtra("noFaceDetection",?true);?//?no?face?detection??
  • ????????startActivityForResult(intent,?SET_ALBUM_PICTURE_KITKAT);??
  • ????}??

  • 拍照通用方法,對返回數(shù)據(jù)做處理:

    ?

    [javascript]?view plaincopy print?
  • /**??
  • ?????*?<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);??
  • ????????if?(mIsKitKat)?{??
  • ????????????intent.putExtra("return-data",?true);??
  • ????????}?else?{??
  • ????????????intent.putExtra("return-data",?false);??
  • ????????????intent.putExtra(MediaStore.EXTRA_OUTPUT,?uri);??
  • ????????}??
  • ????????intent.putExtra("outputFormat",?Bitmap.CompressFormat.JPEG.toString());??
  • ????????intent.putExtra("noFaceDetection",?true);??
  • ????????startActivityForResult(intent,?SET_PICTURE);??
  • ????}??

  • 顯示等處理如下:

    [javascript]?view plaincopy print?
  • @Override??
  • ????protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{??
  • ????????super.onActivityResult(requestCode,?resultCode,?data);??
  • ????????if?(requestCode?==?SELECT_A_PICTURE)?{??
  • ????????????if?(resultCode?==?RESULT_OK?&&?null?!=?data)?{??
  • ????????????????Log.i("zou",?"4.4以下的");??
  • ????????????????Bitmap?bitmap?=?decodeUriAsBitmap(Uri.fromFile(new?File(IMGPATH,??
  • ????????????????????????TMP_IMAGE_FILE_NAME)));??
  • ????????????????mAcountHeadIcon.setImageBitmap(bitmap);??
  • ????????????}??
  • ????????}?else?if?(requestCode?==?SELECET_A_PICTURE_AFTER_KIKAT)?{??
  • ????????????if?(resultCode?==?RESULT_OK?&&?null?!=?data)?{??
  • ????????????????Log.i("zou",?"4.4以上上的");??
  • ????????????????mAlbumPicturePath?=?getPath(MainActivity.this,?data.getData());??
  • ????????????????cropImageUriAfterKikat(Uri.fromFile(new?File(mAlbumPicturePath)));??
  • ????????????}??
  • ????????}?else?if?(requestCode?==?SET_ALBUM_PICTURE_KITKAT)?{??
  • ????????????Log.i("zou",?"4.4以上上的?RESULT_OK");??
  • ????????????Bitmap?bitmap?=?data.getParcelableExtra("data");??
  • ????????????mAcountHeadIcon.setImageBitmap(bitmap);??
  • ????????}?else?if?(requestCode?==?TAKE_A_PICTURE)?{??
  • ????????????Log.i("zou",?"resultCode:"?+?resultCode);??
  • ????????????cameraCropImageUri(Uri.fromFile(new?File(IMGPATH,?IMAGE_FILE_NAME)));??
  • ????????}?else?if?(requestCode?==?SET_PICTURE)?{??
  • ????????????Log.i("zou",?"SET_PICTURE-resultCode:"?+?resultCode);??
  • ??
  • ????????????Bitmap?bitmap?=?null;??
  • ????????????if?(mIsKitKat)?{??
  • ????????????????if?(null?!=?data)?{??
  • ????????????????????bitmap?=?data.getParcelableExtra("data");??
  • ????????????????}??
  • ????????????}?else?{??
  • ????????????????bitmap?=?decodeUriAsBitmap(Uri.fromFile(new?File(IMGPATH,?IMAGE_FILE_NAME)));??
  • ????????????}??
  • ????????????mAcountHeadIcon.setImageBitmap(bitmap);??
  • ????????}??
  • ????}??
  • ?

    GIthub工程地址:https://github.com/ZBJDSBJ/CameraDemo

    ?

    轉載于:https://www.cnblogs.com/exmyth/p/5411817.html

    總結

    以上是生活随笔為你收集整理的【转】Android 4.4前后版本读取图库图片和拍照完美解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。