【问题标题】:Android Camera passing bitmap from Camera Intent to MainActivityAndroid Camera 将位图从 Camera Intent 传递到 MainActivity
【发布时间】:2016-01-22 21:56:59
【问题描述】:

我正在尝试拍照并将其在我的 MainActivity 中设置为 ImageView。 我想将我的相机活动作为一个单独的课程,所以我尝试了以下方法: 主要活动:

public void onClick(View v) {
    switch (v.getId()) {
        case R.id.action_button:
            Intent camera = new Intent(MainActivity.this,Camera.class);
            startActivityForResult(camera ,CAMERA_IDENTIFITER);
            break;
        default:
            break;
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    //super.onActivityResult(requestCode, resultCode, data);
    Log.d("onActivityResult","Sucessfully callbacked!"); //This one wont be executed!
    switch(requestCode) {
        case (CAMERA_IDENTIFITER) : {
            if (resultCode == Activity.RESULT_OK) {
                Bitmap bitmap = (Bitmap) data.getParcelableExtra(MediaStore.EXTRA_OUTPUT);
                mImageView.setImageBitmap(bitmap);
            }
            break;
        }
    }
}

这是我的相机活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);
    takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    pm = getPackageManager();
}
@Override
protected void onStart() {
    super.onStart();
    if(!isFromActivityResult){
        dispatchTakePictureIntent();
    }
}
public void dispatchTakePictureIntent() {
    if (takePictureIntent.resolveActivity(pm) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch {...}
        if (photoFile != null) {
            pictureTaken = true;
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(photoFile));
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    } 
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
        try {
            bitmap = ImageFileHandler.handleSamplingAndRotationBitmap(this, Uri.fromFile(new File(mCurrentPhotoPath)));
            //mImageView.setImageBitmap(bitmap);
            resultIntent = new Intent();
            resultIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    bitmap);
            setResult(Activity.RESULT_OK, resultIntent);
            Log.d("onActivityResult","finish() executed!"); //This one gets executed!
            finish();
        } catch {...}
    }
}

相机意图正常启动,但是当我拍照时,我没有回到 MainActivity 中的 onActivityResult ,我卡在相机意图中。

【问题讨论】:

    标签: android android-intent bitmap callback camera


    【解决方案1】:

    你的 onStart() 在 onActivityResult() 被执行后被调用。因此,一次又一次地启动相机意图。放置日志并测试自己。 解决问题 在您的活动中保留一个布尔变量 isFronActivityResult。保持默认值为 false 并执行 isFromActivityResult = true;在 onActivityResult() 中。在 onStart 中执行以下操作:

              @Override
            protected void onStart() {
                super.onStart();
                if(!isFromActivityResult)
                  dispatchTakePictureIntent();
            }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
            try {
                bitmap = ImageFileHandler.handleSamplingAndRotationBitmap(this, Uri.fromFile(new File(mCurrentPhotoPath)));
                //mImageView.setImageBitmap(bitmap);
                resultIntent = new Intent();
                resultIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        bitmap);
                setResult(Activity.RESULT_OK, resultIntent);
                isFromActivityResult = true;// add this line
                finish();
            } catch {...}
        }
    }
    

    【讨论】:

    • 试过了,我现在返回相机活动,但不返回 MainActivity。
    • 您没有遇到任何异常吗?请尝试将日志放在finish() 之前,看看它是否执行。
    • 是的,日志正在执行,之后我得到一个 E/JavaBinder: !!! Binder 交易失败!!! (包裹大小 = 23971076)但我不知道那是什么。我还在main的result方法里放了一个log,这个没有执行。
    • 我已经尝试了示例应用程序,它在我的终端上运行良好。请明确查看是否正在执行 finish()。如果你能更新你的代码,那将是有帮助的。
    • 更新了代码和我的问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2013-10-30
    相关资源
    最近更新 更多