相机意图结果困难

时间:2011-06-07 20:36:16

标签: java android android-intent bitmap camera

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

  1. 相机返回时,onActivityResult()会直接转到resultCode == Activity.RESULT_CANCELED。对此和解决方案的任何解释将不胜感激。

  2. 相机确实拍摄了图像,我可以在带有文件查看器的SD卡中看到它,但它的名字来自相机的库存。如何将此拍摄图像的名称作为活动提供的图像?

  3. 相机意图代码

    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代码

    @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 个答案:

答案 0 :(得分:6)

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

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

当我删除“singleInstance”时,我的相机正常。

答案 1 :(得分: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。

希望有所帮助!

答案 2 :(得分: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;
}
}