Android 从对话框片段上的图库中选择照片时,光标上的NullPointerExceceptan

Android 从对话框片段上的图库中选择照片时,光标上的NullPointerExceceptan,android,nullpointerexception,cursor,android-dialogfragment,Android,Nullpointerexception,Cursor,Android Dialogfragment,我正试图通过对话框片段从图库中选择照片。但是我在初始化游标时得到nullpointerexception。你知道为什么会出现这个错误吗 下面是我的代码: if (resultCode == Activity.RESULT_OK) { Uri selectedImage = imageReturnedIntent.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA};

我正试图通过
对话框片段
从图库中选择照片。但是我在初始化
游标时得到
nullpointerexception
。你知道为什么会出现这个错误吗

下面是我的代码:

    if (resultCode == Activity.RESULT_OK) {
        Uri selectedImage = imageReturnedIntent.getData();
        String[] filePathColumn = {MediaStore.Images.Media.DATA};
        // Nullpointerexcepiton on this line
        Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);

        cursor.close();

    }
以下是我的logcat错误:

    03-24 12:34:37.645: E/AndroidRuntime(21479): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65538, result=-1, data=Intent { dat=content://media/external/images/media/3890 flg=0x1 }} to activity {com.example/com.example.MainActivity}: java.lang.NullPointerException

    03-24 12:34:37.645: E/AndroidRuntime(21479):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3462)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3505)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at android.app.ActivityThread.access$1100(ActivityThread.java:150)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1346)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at android.os.Handler.dispatchMessage(Handler.java:99)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at android.os.Looper.loop(Looper.java:213)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at android.app.ActivityThread.main(ActivityThread.java:5225)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at java.lang.reflect.Method.invokeNative(Native Method)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at java.lang.reflect.Method.invoke(Method.java:525)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at dalvik.system.NativeStart.main(Native Method)

    03-24 12:34:37.645: E/AndroidRuntime(21479): Caused by: java.lang.NullPointerException
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at com.example.MainDialogFragment.onActivityResult(MainDialogFragment.java:226)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at com.example.MainActivity.onActivityResult(DelictActivity.java:85)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at android.app.Activity.dispatchActivityResult(Activity.java:5322)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3458)
    03-24 12:34:37.645: E/AndroidRuntime(21479):    ... 11 more

问题可能是因为
getActivity()
在这一行中返回null

Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null);
当您的片段未附加到活动时,会发生此错误。我看到两个可能的原因:

  • 在片段生命周期中调用
    getActivity()
    太快。在玩
    getActivity()
  • 您的片段已从活动中分离,请检查
    fragment.isAdded()
    的返回,以确保您的片段仍然附着

你如何开始你的活动,从哪里开始? 如果通过MainActivity传递结果,可以尝试在DialogFragment中创建如下新函数:

public void onMyActivityResult(Context main, int resultCode... an so on){

     main.getContentResolver.......

}
编辑: 我是这样做的:

在onCreate中获取活动:

@Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mActivity = (MainActivity) this.getActivity();
    }
然后:

以及:


用于从库中选择图像 int PICK_IMAGE=1

public void getGalleryImage() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        activity.startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_IMAGE);
        }
论活动结果

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_CANCELED) {
            if (requestCode == PICK_IMAGE) {
                String selectedImagePath = getAbsolutePath(data.getData());
                Log.d("GetImage","Selected Image Path "+selectedImagePath )
            } else {
                super.onActivityResult(requestCode, resultCode, data);
            }
        }
}
//获取图像路径

public String getAbsoluteImagePath(Uri uri) {
        String[] projection = { MediaColumns.DATA };
        @SuppressWarnings("deprecation")
        Cursor cursor = activity.managedQuery(uri, projection, null, null, null);
        if (cursor != null) {
            int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } else
            return null;
    }

我已经做了这个…而且效果很好

 protected void onActivityResult(int requestCode, int resultCode, Intent 
 data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK) {

        Uri selectedImage = data.getData();
        URI = Uri.parse("file://" + selectedImage);
    }
}

post full stacktrace,以NPE@tbruyelle请看我的编辑。在你发布的页面下方不是有第二个stacktrace吗?这是一个有趣的问题。@tbruyelle请再次查看我的编辑。那么第226行在哪里呢?一般来说,如果答案包括对代码意图的解释,以及在不介绍其他代码的情况下解决问题的原因,那么答案会更有帮助。
public String getAbsoluteImagePath(Uri uri) {
        String[] projection = { MediaColumns.DATA };
        @SuppressWarnings("deprecation")
        Cursor cursor = activity.managedQuery(uri, projection, null, null, null);
        if (cursor != null) {
            int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } else
            return null;
    }
 protected void onActivityResult(int requestCode, int resultCode, Intent 
 data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK) {

        Uri selectedImage = data.getData();
        URI = Uri.parse("file://" + selectedImage);
    }
}
 private String getRealPathFromURI(Uri selectImagePath) {
    Cursor cursor = mActivity.getContentResolver().query(selectImagePath, null, null, null, null);
    if (cursor == null) { //this return actual path from storage
                
        return contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        String path = cursor.getString(idx);
        cursor.close();
        return path;
    }
    }