【问题标题】:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()'java.lang.NullPointerException:尝试调用虚拟方法“java.lang.String android.net.Uri.getScheme()”
【发布时间】:2015-12-10 09:50:17
【问题描述】:

我正在尝试将图像从图库和相机上传到服务器。当我从图库中选择图像以上传到服务器时,它的工作完全正确。但是当我选择相机捕获的图像上传到服务器时,它崩溃并显示错误。

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference

在 OnActivityResult。

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

        if (requestCode == PICK_IMAGE && resultCode == RESULT_OK
                && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

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

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();

            decodeFile(picturePath);
            new ImageUploadTask().execute();
        }else {

            Toast.makeText(getApplicationContext(), "User Canceled",
                    Toast.LENGTH_LONG).show();
        }
    }

我在 onActivityResult 的这一行得到了错误

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

我在按钮点击时打开相机的方法。

  loadimage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {


                AlertDialog.Builder builder = new AlertDialog.Builder(Add_Info.this);
                builder.setMessage("Select Image From")
                        .setCancelable(true)
                        .setPositiveButton("Camera", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {

                                Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                                startActivityForResult(intent, CAMERA_REQUEST);
                                mImageCaptureUri = Uri.fromFile(new File(Environment
                                        .getExternalStorageDirectory(), "tmp_avatar_"
                                        + String.valueOf(System.currentTimeMillis())
                                        + ".jpg"));
                            }
                        })
                        .setNegativeButton("Gallery", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                Intent i = new Intent(
                                        Intent.ACTION_PICK,
                                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

                                startActivityForResult(i, RESULT_LOAD_IMAGE);

                            }
                        });
                AlertDialog alert = builder.create();
                alert.show();


            }
        });

帮我解决这个问题。我不知道如何得到这个错误,即使我已经在我以前的项目中使用过。

提前致谢

【问题讨论】:

  • data.getData();正在返回 null
  • 你应该发布PICK_IMAGE的代码而不是CAMERA_REQUEST
  • 请发布整个堆栈跟踪,并指出堆栈跟踪中的哪些行与您的代码 sn-ps 中的行相对应。
  • 我没找到你@QAMAR
  • 尝试调试你的代码,data.getData() 否则数据将为空

标签: java android image upload server


【解决方案1】:

我也遇到这个问题,经过多次测试,我发现是因为我设置了名为android:windowIsTranslucent=true的属性,如果我从样式中删除这个属性,它总是有效的。

【讨论】:

    【解决方案2】:
    if (null != account.getPhotoUrl()) {
        // Write code here
    }
    

    【讨论】:

      【解决方案3】:

      我在使用 Camera api 和 onActivityResult 的 Intent 时遇到了同样的问题,最后我发现它取决于您的 Android 设备版本,在 Android M(Marshmallow - 6.0–6.0.​​1)中,onActivityResult 的意图如下所示:

      requestCode : 230 resultCode : -1 intent :Intent{dat=file:///storage/emulated/0/Pictures/Rahnama/IMG_20160508_121332_1519065    564.jpg typ=image/jpeg } RESULT_OK : -1
      

      对于低于 Marshmallow 的 android 版本:

      requestCode : 230 resultCode : -1 intent : Intent { dat=content://media/external/images/media/309 (has extras) } RESULT_OK : -1
      

      我认为您必须检查 android 版本 onActivityResult 和 for android 版本 Marshmallow 才能从 Uri 和 Intent 中的路径获取直接文件:

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M){
                  final Uri data = intent.getData();
                  final File file = new File(data.getPath());
                  // now you can upload your image file
          }else{
                 // in android version lower than M your method must work
          }
      

      希望对你有用。

      【讨论】:

      • 您能深入探讨一下这个答案吗?
      猜你喜欢
      • 2015-07-16
      • 2019-04-23
      • 1970-01-01
      • 2018-04-03
      • 2020-10-31
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多