Camera Intent结果很糟糕

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

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

 @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(); } } } 

这两个问题可能是相关的,与您创建传递给摄像机的文件引用的方式有关。 如果您希望将图像文件保存到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附加function可以通过此Intent传递。 通常,如果要将元数据附加到图像,则必须在将图像保存到磁盘之前将带有该元数据的Uri引用插入MediaStore ContentProvider。

希望有所帮助!

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

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

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

不确定你的代码有什么问题,这对我有用:

 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; } }