【问题标题】:Nullpointerexcepiton on cursor while selecting photo from gallery on dialog fragment从对话框片段上的图库中选择照片时光标上的 Nullpointerexcepiton
【发布时间】:2020-07-30 14:02:02
【问题描述】:

我正在尝试通过DialogFragment 从图库中选择照片。但是我在初始化cursor 时得到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

【问题讨论】:

  • 发布完整的堆栈跟踪,以 NPE 开头的堆栈跟踪
  • @tbruyelle 请看我的编辑。
  • 在您发布的那个下方没有第二个堆栈跟踪吗?这是一个有趣的。
  • @tbruyelle 请再次查看我的编辑。
  • 那么第 226 行在哪里?

标签: android nullpointerexception cursor android-dialogfragment


【解决方案1】:

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

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

     main.getContentResolver.......

}

编辑: 我是这样做的:

在onCreate中获取Activity:

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

然后:

     @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
       if (requestCode == REQUEST_GALLERY && resultCode == Activity.RESULT_OK) {
           ...

            Uri selectedImage = data.getData();
            String path = getRealPathFromURI(selectedImage);
           ...
            reloadImages();

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

和:

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

【讨论】:

    【解决方案2】:

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

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

    当您的片段未附加到活动时会发生这种情况。我看到 2 个可能的原因:

    • 您在片段生命周期中过早调用getActivity()。在玩getActivity() 之前,您需要等待onAttach(Activity) 的调用
    • 您的 Fragment 已从 Activity 中分离出来,请检查 Fragment.isAdded() 的返回以确保您的 Fragment 仍处于附加状态。

    【讨论】:

      【解决方案3】:

      用于从图库中选择图像 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;
          }
      

      【讨论】:

        【解决方案4】:

        我已经完成了......并且效果很好

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

        【讨论】:

        • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
        【解决方案5】:
         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;
            }
            }
        

        【讨论】:

          猜你喜欢
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          • 2020-10-02
          • 1970-01-01
          • 2015-10-30
          • 1970-01-01
          • 2019-01-04
          • 1970-01-01
          相关资源
          最近更新 更多