生活随笔
收集整理的這篇文章主要介紹了
【转】Android 4.4前后版本读取图库图片和拍照完美解决方案
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
http://blog.csdn.net/zbjdsbj/article/details/42387551
4.3或以下,選了圖片之后,根據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.這就導致接下來無法根據圖片路徑來裁剪的步驟了.
來自overflow大牛的方法,4.4得到的uri,需要以下方法來獲取文件的路徑:
?
[javascript]?view plaincopy print?
@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;????????????if?(isKitKat?&&?DocumentsContract.isDocumentUri(context,?uri))?{??????????????????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];??????????????}??????????}??????????????????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);??????????}??????????????????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);??????????}??????}??????????else?if?("content".equalsIgnoreCase(uri.getScheme()))?{????????????????????if?(isGooglePhotosUri(uri))??????????????return?uri.getLastPathSegment();????????????return?getDataColumn(context,?uri,?null,?null);??????}??????????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;??}????public?static?boolean?isExternalStorageDocument(Uri?uri)?{??????return?"com.android.externalstorage.documents".equals(uri.getAuthority());??}????public?static?boolean?isDownloadsDocument(Uri?uri)?{??????return?"com.android.providers.downloads.documents".equals(uri.getAuthority());??}????public?static?boolean?isMediaDocument(Uri?uri)?{??????return?"com.android.providers.media.documents".equals(uri.getAuthority());??}????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: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: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: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ù)據庫已經不能滿足所有需求,因此在獲取圖片真實路徑的時候需要根據不同類型區(qū)分對待。
版本判斷:
[javascript]?view plaincopy print?
????final?boolean?mIsKitKat?=?Build.VERSION.SDK_INT?>=?Build.VERSION_CODES.KITKAT;?? 從相冊選擇照片方法比較:
[javascript]?view plaincopy print?
????@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?
????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);?????????startActivityForResult(intent,?SELECT_A_PICTURE);??????}??
4.4及以上選取照片后需要調用剪切方法:
[javascript]?view plaincopy print?
????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);?????????intent.putExtra("outputFormat",?Bitmap.CompressFormat.JPEG.toString());??????????intent.putExtra("noFaceDetection",?true);?????????startActivityForResult(intent,?SET_ALBUM_PICTURE_KITKAT);??????}??
拍照通用方法,對返回數(shù)據做處理:
?
[javascript]?view plaincopy print?
????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前后版本读取图库图片和拍照完美解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。