OnActivityResult仅在取消时调用

时间:2017-04-25 10:21:06

标签: android camera

我有一个使用startActivityForResult启动意图的活动

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE_SECURE);

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,getFilesDir());
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);

在同一个班级中,onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
    }
    else
    {
        if(resultCode == RESULT_CANCELED){
            finish();
        }
    }
}

该类扩展了AppCompatActivity。 只有当我取消意图时(按下后退按钮时)才会触发onActivityResult。拍摄照片时没有任何反应。

有人有解决方案吗?

我知道这是重复的 https://meta.stackexchange.com/questions/7046/getting-attention-for-unanswered-questions

但根据How to re-ask an old question which is not answered yet?,我只能编辑问题(我显然不允许这样做)并且我没有足够的赏金来放置它,所以我只能问问题再次..

2 个答案:

答案 0 :(得分:0)

你有两个错误:

首先,EXTRA_OUTPUT需要指向文件,而不是目录

其次,你忽略了EXTRA_OUTPUT,希望通过"data"额外的图片回来。

我建议您先评论takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,getFilesDir());行。此时,有两种可能性:

  1. 事情开始奏效。在这种情况下,发生的事情是您的无效EXTRA_OUTPUT值导致用户选择的相机应用失败。

  2. 当用户拍照时,您仍无法控制onActivityResult()。在这种情况下,相机应用程序很可能是错误的,而且你可以做的很少。

答案 1 :(得分:0)

试试这段代码......

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri=Uri.fromFile(getOutputMediaFile(MEDIA_TYPE_IMAGE));
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);

并在您的ActivityResult

if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
    BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 8;
            bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                    options);
    }

private static File getOutputMediaFile(int type) {

        File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/yourFolderName/");

        // Create the storage directory if it does not exist
        if (!dir.exists()) {
            if (!dir.mkdirs()) {
                return null;
            }
        }

        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                Locale.getDefault()).format(new Date());
        File mediaFile;
        if (type == MEDIA_TYPE_IMAGE) {
            mediaFile = new File(dir.getPath() + File.separator
                    + "IMG_" + timeStamp + ".jpg");
        } else {
            return null;
        }
        System.out.println("Media FIle is:--" + mediaFile);
        return mediaFile;
    }