安卓KitKat图像选择不返回任何东西

3

我一直试图获取在KitKat上选择的相册中的图片的绝对路径,但似乎并没有成功。无论我做什么,我的变量IMAGE_FILEPATH始终为""。这是我的onActivityResult()代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode != Activity.RESULT_OK) return;
    if (null == data) return;
    Uri originalUri = null;
    if (requestCode == 1) {
        //JB!!!
            Uri uri = data.getData();

            if (uri != null) {

                try {
                    // User had pick an image.
                    String[] filePathColumn = { MediaStore.Images.Media.DATA };

                    Cursor cursor = getContentResolver()
                            .query(uri,
                                    filePathColumn, null, null, null);

                    cursor.moveToFirst();

                    IMAGE_FILEPATH = cursor.getString(0);
                    cursor.close();
                } catch (Exception e) {
                    Crouton.makeText(this, "Failed to get image", Style.ALERT).show();
                }
            }
    } else if (requestCode == 2) {
        //KK!!!
            Uri uri = data.getData();

            if (uri != null) {
                try {
                    if( uri == null ) {
                        IMAGE_FILEPATH = uri.getPath();
                    } else {
                        String[] projection = { MediaStore.Images.Media.DATA };
                        Cursor cursor = managedQuery(uri, projection, null, null, null);
                        if( cursor != null ){
                            int column_index = cursor
                                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                            cursor.moveToFirst();
                            IMAGE_FILEPATH =  cursor.getString(column_index);
                        } else {
                            IMAGE_FILEPATH = uri.getPath();
                        }
                    }


                } catch (Exception e) {
                    Crouton.makeText(this, "Failed to get image", Style.ALERT).show();
                }
            }
    }
    Resource.toast(IMAGE_FILEPATH);

    super.onActivityResult(requestCode, resultCode, data);
}

出了什么问题?我试过多种解决方案,但似乎都没有起作用。

2个回答

9
在KitKat中,画廊返回的URI格式是这样的:content://com.android.providers.media.documents/document/image:1,而不是:
content://media/external/images/media/1

所以,以下是您可以在KK下编写的内容,使其正常工作:
if (uri != null) {
    try {
        if( uri == null ) {
            IMAGE_FILEPATH = uri.getPath();
        } else {
            // get the id of the image selected by the user
            String wholeID = DocumentsContract.getDocumentId(data.getData());
            String id = wholeID.split(":")[1];

            String[] projection = { MediaStore.Images.Media.DATA };
            String whereClause = MediaStore.Images.Media._ID + "=?";
            Cursor cursor = getContentResolver().query(getUri(), projection, whereClause, new String[]{id}, null);
            if( cursor != null ){
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                if (cursor.moveToFirst()) {
                    IMAGE_FILEPATH = cursor.getString(column_index);
                }

                cursor.close();
            } else {
                IMAGE_FILEPATH = uri.getPath();
            }
        }
    } catch (Exception e) {
        Crouton.makeText(this, "Failed to get image", Style.ALERT).show();
    }
}

我所使用的函数:

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;
}

这些帖子对我非常有帮助:从图库选择图片时检索绝对路径在KitKat Android上使用Android KitKat新的存储访问框架获取URI的真实路径


0

moveToFirst返回一个布尔值,指示移动到该位置是否导致数据。

boolean haveData;
haveData = cursor.moveToFirst();

if (haveData) {
 cursor.getString(.....

这就是你应该做的,这是良好的、防御性的编程。现在,为什么你的光标为空,这需要更深入地挖掘你的contentResolver。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接