从图库kitkat android中select图像时检索绝对path

由于我支持我的应用程序Kitkat版本,现在在这个从画廊检​​索文件的方式是不同的。

我更喜欢这个KitKat上的Android画廊返回不同的Uri Intent.ACTION_GET_CONTENT从中检索文件,并成功的工作,但我需要该文件的绝对path,我越来越

content://com.android.providers.media.documents/document/image:2505 

对于19以下的版本,我们使用了不同的uri,通过这种方式获得path

 Cursor cursor = this.getContentResolver().query(originalUri, projection, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String fpath = cursor.getString(column_index); 

但在19版本,它会给我null值如何获得用户select的图像文件的绝对path。

谢谢

Solutions Collecting From Web of "从图库kitkat android中select图像时检索绝对path"

这是select文件后访问绝对path的一种方法。

以这种方式获得KK(KitKat)的新URI格式的数据后

 content://com.android.providers.media.documents/document/image:2505 

只需提取您的文档的ID

 if(requestCode == GALLERY_KITKAT_INTENT_CALLED && resultCode == RESULT_OK){ Uri originalUri = data.getData(); final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // Check for the freshest data. getContentResolver().takePersistableUriPermission(originalUri, takeFlags); /* now extract ID from Uri path using getLastPathSegment() and then split with ":" then call get Uri to for Internal storage or External storage for media I have used getUri() */ String id = originalUri.getLastPathSegment().split(":")[1]; final String[] imageColumns = {MediaStore.Images.Media.DATA }; final String imageOrderBy = null; Uri uri = getUri(); String selectedImagePath = "path"; Cursor imageCursor = managedQuery(uri, imageColumns, MediaStore.Images.Media._ID + "="+id, null, imageOrderBy); if (imageCursor.moveToFirst()) { selectedImagePath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); } Log.e("path",selectedImagePath ); // use selectedImagePath }else if() { // for older version use existing code here } // By using this method get the Uri of Internal/External Storage for Media private Uri getUri() { String state = Environment.getExternalStorageState(); if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED)) return MediaStore.Images.Media.INTERNAL_CONTENT_URI; return MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } 

Pratik的解决scheme帮助了我很多。 以下是在Kitkat 4.4.2中为我工作的版本。 我改变了三件事
1)使用内容parsing器获取path
2)originalUri.getLastPathSegment()。split(“:”)[1]给我索引越界,所以我使用索引0而不是它的工作到目前为止
3)删除标记并检查最新的数据,因为我们正在用光标过滤光标。

 try { Uri originalUri = data.getData(); String pathsegment[] = originalUri.getLastPathSegment().split(":"); String id = pathsegment[0]; final String[] imageColumns = { MediaStore.Images.Media.DATA }; final String imageOrderBy = null; Uri uri = getUri(); Cursor imageCursor = activity.getContentResolver().query(uri, imageColumns, MediaStore.Images.Media._ID + "=" + id, null, null); if (imageCursor.moveToFirst()) { value = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); } } catch (Exception e) { Toast.makeText(activity, "Failed to get image", Toast.LENGTH_LONG).show(); } 
 Bitmap bitmap = MediaStore.Images.Media .getBitmap(getActivity().getContentResolver(), uri); 

我希望这会帮助你。