我正在尝试启动内置摄像头来拍摄照片,这张照片的名称将由启动相机的活动指定。 (以下代码)
相机返回时,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();
}
}
}
答案 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;
}
}