相机意图结果问题

3

我正在尝试启动内置相机来拍照,这张照片将由启动相机的活动指定名称。(以下是代码)

  1. 当相机返回时,onActivityResult() 直接进入 resultCode == Activity.RESULT_CANCELED。有关此问题的任何解释和解决方案将不胜感激。

  2. 相机确实拍摄了图像,我可以在我的sd卡中用文件查看器看到它,但它的名称是相机的默认名称。如何使所拍摄的图像名称为活动提供的名称?

相机意图代码

Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = new File("Team image.jpg");
camera.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
camera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
camera.putExtra(MediaStore.Images.Media.TITLE, "Team image");
        startActivityForResult(camera, PICTURE_RESULT);

activityresult code

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

    if(requestCode == PICTURE_RESULT){
        if(resultCode == Activity.RESULT_OK) {
            if(data!=null){
                Bitmap image = BitmapFactory.decodeFile(data.getExtras().get(MediaStore.Images.Media.TITLE).toString());
                grid.add(image);            
                images.addItem(image);
            }
            if(data==null){
                Toast.makeText(Team_Viewer.this, "no data.", Toast.LENGTH_SHORT).show();
            }
        }
        else if(resultCode == Activity.RESULT_CANCELED) {
            Toast.makeText(Team_Viewer.this, "Picture could not be taken.", Toast.LENGTH_SHORT).show();
        }
}
}
3个回答

6

您是否将活动的启动模式标记为"singleInstance"?

这可能会导致您的第一个问题。

当我移除"singleInstance"时,我的相机恢复正常。


它解决了我的问题。谢谢。 - Pier Betos
我和楼主遇到了同样的问题,这个方法解决了它。谢谢!(尽管这只发生在Lollipop之前的设备上) - ravindu1024

4
这两个问题可能相关,与您创建传递给相机的文件引用方式有关。如果您希望图像文件保存到SD卡中,您需要创建一个包含完整路径的文件引用,而不仅仅是文件名。例如,以下代码将在SD卡根目录上保存图像文件:
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = new File(Environment.getExternalStorageDirectory(),"TeamImage.jpg");
camera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));

startActivityForResult(camera, PICTURE_RESULT);

我把你的文件名改了,不包含空格;只是因为我不确定相机应用程序是否也会出现这个问题。由于相机在尝试打开和写入文件位置时变得混乱,这可能就是为什么你总是返回 RESULT_CANCELED 的原因。在这里,你不需要 WRITE_EXTERNAL_STORAGE 权限,因为相机应用正在进行 SD 卡访问。
还有一点要注意:我不认为其他 MediaStore 额外信息可以通过此 Intent 传递。通常,如果你想将元数据附加到图像上,你必须在将图像保存到磁盘之前将带有该元数据的 Uri 引用插入到 MediaStore ContentProvider 中。
希望这能帮助你!

非常感谢,这就是问题所在! - kaz odan

1

不确定你的代码哪里出了问题,这是对我有效的解决方案:

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA_PIC_REQUEST);

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {

            switch (requestCode) {
                case CAMERA_PIC_REQUEST:
                    Bitmap b = (Bitmap) data.getExtras().get("data");
                    if (b != null) {
                        updateThumbnail(b);

                        if (mBitmap != b) {
                            b.recycle();
                        }
                    }
                    break;
}
}

2
在这种情况下,结果“位图”的分辨率非常低。 - dragon

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