Camera Intent结果很糟糕
我正在尝试启动内置摄像头来拍摄照片,这张照片的名称将由启动摄像头的活动指定。 (以下代码)
-
当相机返回时,
onActivityResult()
直接进入resultCode == Activity.RESULT_CANCELED
。 对此和解决方案的任何解释将不胜感激。 -
相机确实拍摄了图像,我可以在带有文件查看器的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; } }