空对象引用上的onActivityResult数据

时间:2018-11-03 10:52:41

标签: android android-intent android-camera startactivityforresult

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

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

EDİT;添加了onActivityResult代码块

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

3 个答案:

答案 0 :(得分:0)

检查是否有帮助

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

答案 1 :(得分:0)

如果相机在片段上打开,则也应在活动中调用它

答案 2 :(得分:0)

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

并非所有这些应用程序(特别是在小众设备上)都完全符合官方规范。众所周知,三星手机还可以广泛处理意向合同要求。

在您的情况下,代码用于未公开的"return-data" 额外。我在一些与三星相关的论坛上看到了它,但是即使如此,也没有证据表明它确实有效。

用于ACTION_IMAGE_CAPTURE意图状态的only reliable reference数据

  

调用方可以传递一个额外的EXTRA_OUTPUT来控制将图像写入何处。如果不存在EXTRA_OUTPUT,则会在Extra字段中将一个小型图像作为Bitmap对象返回。这对于只需要较小图像的应用程序很有用。

但是在现实生活中,即使这样也无法保证。这意味着您的应用应该准备从ACTION_IMAGE_CAPTURE获取空的数据,这仅仅是因为您不控制将图像带到onActivityResult()的应用,即使您不这样做也是如此。不能通过额外 EXTRA_OUTPUT