【问题标题】:onActivityResult data on a null object reference空对象引用上的 onActivityResult 数据
【发布时间】:2019-04-07 09:48:13
【问题描述】:

当我启动相机时,数据为空。我不知道为什么..这是相机的代码:

 ((Button)view.findViewById(R.id.BtnOpenCamera)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                String file = "myimg.jpg";

                File path =  new File(Environment.getExternalStorageDirectory()+"/"+file);
                Uri outputFileUri = FileProvider.getUriForFile(getActivity().getApplicationContext(), BuildConfig.APPLICATION_ID
                        + ".provider", path);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
                cameraIntent.putExtra("return-data", true);
                startActivityForResult(cameraIntent, 0);
            }
        });

编辑;添加 onActivityResult 代码块

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.e(LoggerID,requestCode+" "+resultCode+" "+(data != null));
}

【问题讨论】:

  • 发布onActivityResult()代码
  • 我添加了兄弟@forpas
  • 请提供堆栈跟踪

标签: android android-intent android-camera startactivityforresult


【解决方案1】:

检查是否有帮助

((Button)view.findViewById(R.id.BtnOpenCamera)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Starts the Camera
            Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intentCamera, 0);
        }
    });

然后去捕捉onActivityResult()中的uri

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

    if (requestCode == 0){

        try {
            // 1) Get the bitmap from the taken picture;
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");

            // 2) Converts the bitmap into image String URL;
            Uri uri = ImageManager.getImageUriFromBitmap(getActivity(), bitmap, 50);
            String imgURL = ImageManager.getRealPathFromUri(getActivity(), uri);

            // Use the imgURL the way you need.

        } catch (NullPointerException e){e.printStackTrace();}
    }
}

【讨论】:

    【解决方案2】:

    如果相机在fragment上打开,也应该在activity中调用

    【讨论】:

    • 我在片段中运行它。
    • 那么你的设备名称和sdk版本是什么?
    【解决方案3】:

    ACTION_IMAGE_CAPTURE 意图由任何注册以在特定设备上处理它的相机应用程序来实现。即使您只查看制造商预装在设备上的“官方”相机应用,此类应用也会有很大差异。

    并非所有这些应用程序,尤其是在小众设备上的应用程序,都完全符合官方规范。众所周知,三星手机也广泛对待意向合同要求。

    在您的情况下,代码在未记录的"return-data" extra 上使用。我在一些与三星相关的论坛上看到它提到过,但即便如此也没有证据表明它确实有效。

    only reliable referencedataACTION_IMAGE_CAPTURE 意图状态,

    调用者可能会传递一个额外的 EXTRA_OUTPUT 来控制此图像的写入位置。如果 EXTRA_OUTPUT 不存在,则在额外字段中将小尺寸图像作为位图对象返回。这对于只需要小图像的应用程序很有用。

    但在现实生活中,即使这样也不能保证。这意味着您的应用应该准备好从ACTION_IMAGE_CAPTURE 获取空的data,因为即使您没有通过额外的 EXTRA_OUTPUT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-11
      • 2018-04-03
      • 1970-01-01
      • 2018-06-27
      • 2017-12-28
      • 2016-10-28
      • 2016-06-04
      • 2021-07-01
      相关资源
      最近更新 更多