Java 光标错误-从库中检索图像

Java 光标错误-从库中检索图像,java,android,android-gallery,Java,Android,Android Gallery,目前,我正试图在我的图库中检索图像的位置,并将其转换为文件,以便将其上载到internet。但是我收到了这个错误。错误发生在我打开多媒体资料并选择图像时,它会崩溃。我不太精通Android,仍然认为自己是初学者。因此,如果你决定否决我的问题,请告诉我原因,以便我可以学习。多谢各位 日志:- 05-07 08:11:45.052 8697-8697/com.example.megasap.jobforhire_android E/AndroidRuntime: FATAL EXCEPTION:

目前,我正试图在我的图库中检索图像的位置,并将其转换为文件,以便将其上载到internet。但是我收到了这个错误。错误发生在我打开多媒体资料并选择图像时,它会崩溃。我不太精通Android,仍然认为自己是初学者。因此,如果你决定否决我的问题,请告诉我原因,以便我可以学习。多谢各位

日志:-

 05-07 08:11:45.052 8697-8697/com.example.megasap.jobforhire_android E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                  Process: com.example.megasap.jobforhire_android, PID: 8697
                                                                                  java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:34 flg=0x1 }} to activity {com.example.megasap.jobforhire_android/com.example.megasap.jobforhire_android.ProfileEditActivity}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                                                                                      at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
                                                                                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
                                                                                      at android.app.ActivityThread.-wrap16(ActivityThread.java)
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                      at android.os.Looper.loop(Looper.java:148)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                                   Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                                                                                      at android.database.CursorWindow.nativeGetString(Native Method)
                                                                                      at android.database.CursorWindow.getString(CursorWindow.java:438)
                                                                                      at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
                                                                                      at android.database.CursorWrapper.getString(CursorWrapper.java:137)
                                                                                      at com.example.megasap.jobforhire_android.ProfileEditActivity.getRealPathFromURI(ProfileEditActivity.java:233)
                                                                                      at com.example.megasap.jobforhire_android.ProfileEditActivity.onActivityResult(ProfileEditActivity.java:191)
                                                                                      at android.app.Activity.dispatchActivityResult(Activity.java:6428)
                                                                                      at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
                                                                                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
                                                                                      at android.app.ActivityThread.-wrap16(ActivityThread.java) 
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                      at android.os.Looper.loop(Looper.java:148) 
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
我用来检索图像的代码如下所示:-

 private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        result = cursor.getString(idx); // getting error here ; it returns -1
        cursor.close();
    }
    return result;
}

您必须使用查询添加列名
MediaStore.Images.Media.DATA

更新
getRealPathFromURI()
如下:

private String getRealPathFromURI(Uri contentURI) {

    String result;
    String[] filePathColumn = { MediaStore.Images.Media.DATA };        

    Cursor cursor = getContentResolver().query(contentURI, filePathColumn, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(filePathColumn[0]);
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}
 public String getRealPathFromURI(Uri uri) {

        Cursor cursor = this.getContentResolver().query(uri, null, null, null, null);
        String result;

        // for API 19 and above
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {


            cursor.moveToFirst();
            String image_id = cursor.getString(0);
            image_id = image_id.substring(image_id.lastIndexOf(":") + 1);
            cursor.close();

            cursor = this.getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new String[]{image_id}, null);

        }

        cursor.moveToFirst();
        result = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        cursor.close();
        return result;
    }
在您的
onActivityResult()
方法中:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        // When an Image is picked
        if (requestCode == YOUR_REQUEST_CODE && resultCode == RESULT_OK
                && null != data) {
            // Get the Image from data
            Uri selectedImage = data.getData();

            // Get real path 
            String imageRealPath = getRealPathFromURI(selectedImage);

            // Do something

        }
    } catch (Exception e) {
        Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
                .show();
    }

}
确保您已添加权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


这是一个好主意。希望这会有所帮助~

您不应该尝试获取文件路径并从该uri构造文件对象来上载文件。你不需要这些。直接使用uri打开inputstream

你现在将拥有的某个地方

FileInputStream fis = new FileInputStream(path);
换成

InputStream is = getContentResolver().openInputStream(data.getData());

这支持19岁以下和19岁以上的API,包括19岁以下的API:

private String getRealPathFromURI(Uri contentURI) {

    String result;
    String[] filePathColumn = { MediaStore.Images.Media.DATA };        

    Cursor cursor = getContentResolver().query(contentURI, filePathColumn, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(filePathColumn[0]);
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}
 public String getRealPathFromURI(Uri uri) {

        Cursor cursor = this.getContentResolver().query(uri, null, null, null, null);
        String result;

        // for API 19 and above
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {


            cursor.moveToFirst();
            String image_id = cursor.getString(0);
            image_id = image_id.substring(image_id.lastIndexOf(":") + 1);
            cursor.close();

            cursor = this.getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new String[]{image_id}, null);

        }

        cursor.moveToFirst();
        result = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        cursor.close();
        return result;
    }

现在它返回NullPointerException:(@MohamadAzrie使用
ContentResolver#openInputStream()
读取
Uri
content@MohamadAzrie完整的代码?不,实现内容读取和上传是你的工作。你能在ActivityResult()上发布吗方法?如何从InputStream@greenapps创建一个文件你已经检查了一个-错误-答案是正确的,那么为什么还要继续问?你帮了我很大的忙。谢谢