空对象引用上的 onActivityResult 数据

Posted

技术标签:

【中文标题】空对象引用上的 onActivityResult 数据【英文标题】:onActivityResult data on a null object reference 【发布时间】: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 请提供堆栈跟踪 【参考方案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 reference 到 dataACTION_IMAGE_CAPTURE 意图状态,

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

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

【讨论】:

以上是关于空对象引用上的 onActivityResult 数据的主要内容,如果未能解决你的问题,请参考以下文章

空对象引用上的closeDatabase()'

setAdapter 上的空对象引用错误

java.lang.NullPointerException:空对象引用上的 FloatingActionButton.setVisibility(int)'

空对象引用上的 void android.view.View.dispatchWindowVisibilityChanged(int)'

.getImage() 上的空对象引用 android [重复]

移动相机方法上的谷歌地图空对象引用[关闭]