onActivityResult返回的数据为null。该问题涉及IT技术。

9

好的,这里是我要发送的意图。

(注:意图指在IT技术中的特定操作或功能)

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
startActivityForResult(intent, REQUEST_CODE);

然后在onActivityResult中,我这样做:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.i("Intent name:",data.toString());
        if (requestCode == REQUEST_CODE){
            if (resultCode == Activity.RESULT_OK){
                Toast.makeText(this, "Image saved to \n" + fileUri.toString() , Toast.LENGTH_LONG).show();
                Toast.makeText(this, "Result Code: " + resultCode , Toast.LENGTH_LONG).show();
                //Bitmap mBitMap = BitmapFactory.decodeFile(data.getData().toString());
                //imageView.setImageBitmap(mBitMap);
            }
            else if (resultCode == RESULT_CANCELED){
                Toast.makeText(this, "Capture Cancelled", Toast.LENGTH_LONG).show();
            }
            else {
                Toast.makeText(this, "Capture failed", Toast.LENGTH_LONG).show();
            }

        }

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

LogCat显示在标有“Image Saved”的那一行出现了NullPointerException。还有这个:
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} 无论我尝试使用类的data对象还是fileUri字段,都会发生这种情况。为什么data返回null?即使我使用类的字段,为什么仍然会出现相同的错误?

你在onActivityResult中没有使用getIntent()来访问MediaStore.EXTRA_OUTPUT吗? - Arpit Garg
不好意思,我不确定如何使用它。你能给我一个代码片段吗? - prometheuspk
@OsamaRao 你解决了吗?你还记得你测试的是哪款手机吗?SonyEricson Xperia 给我带来了这个确切的问题,而 Samsung Ace2 或 HTC 就可以正常工作。 - hendrix
@matej.smitala 我想这真的是一个设备特定的错误。当我提出这个问题时,我正在使用三星Galaxy Y。但现在在我的新HTC手机上它运行得非常完美。 - prometheuspk
@OsamaRao,我也这么认为...谢谢你的时间;) - hendrix
显示剩余4条评论
2个回答

8
每当您通过相机意图传递 EXTRAOUTPUT 保存图像时,
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

在一个文件中,onActivityResult 中的数据参数总是返回 null。因此,不要使用 data 来检索图像,而是使用文件路径来检索 Bitmap

所以 onActivityResult 应该是这样的:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            String[] fileColumn = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(imageUri,
                fileColumn, null, null, null);
            String contentPath = null;
            if (cursor.moveToFirst()) {
                contentPath = cursor.getString(cursor
                    .getColumnIndex(fileColumn[0]));

                Bitmap bmp = BitmapFactory.decodeFile(contentPath);
                ImageView img = (ImageView) findViewById(R.id.imageView1);
                img.setImageBitmap(bmp);


            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Capture Cancelled", Toast.LENGTH_LONG)
                .show();
            } else {
                Toast.makeText(this, "Capture failed", Toast.LENGTH_LONG)
                .show();
            }

        }

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

确保已将imageUri或fileUri作为全局变量,以便您可以在onActivityResult中访问它。祝你好运。


0

在这些情况下处理数据的正确/首选方式应该是:

在调用的 Activity 中,将数据设置到 Intent 中,然后将 setResult 代码设置为 RESULT_OK,最后结束该 Activity。

在接收的 Activity 中,检查结果代码,并从 Intent 变量中检索数据:intent.getExtra("... "); // 这些变量是您在已关闭的子 Activity 中设置的。


你误解了我的意思。我实际上是在调用手机自带的相机应用程序。我不需要自己设置结果。 - prometheuspk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接