默认相机活动在点击“确定”按钮后未关闭

19

我从我的Activity中调用默认的相机,然后处理onActivityResult。我在LG Ally上的代码似乎可以正常工作,因为它拍照时没有确认提示。然而,当我在Nexus S上运行同样的应用程序时,它会在返回到我的Activity之前提示我是否要“确定”,“重拍”或“取消”。虽然“取消”可以无效地返回我的Activity而不保存图片,“确定”似乎没有任何效果,甚至不返回到我的Activity。

下面是我的代码:

private void captureImage() {

    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + (new UserContextAdapter(this)).getUser() + "/");
        path.mkdirs();
        File file = new File(path, "Image_Story_" + mRowId.toString() + ".jpg");

        newImageUri = Uri.fromFile(file);

        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, newImageUri);

        startActivityForResult(intent, CAPTURE_IMAGE);
    }

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    switch (requestCode) {
    case CAPTURE_IMAGE:
        switch (resultCode ) {
        case 0:
            Log.i("CAPTURE", "Cancelled by User");
            break;
        case -1:
            mImageUri = newImageUri;
            setImageFromUri();
            }
    }

请确保您已经授予存储权限。 - Hamid Goodarzi
4个回答

15

我觉得我刚遇到了完全相同的问题。

如果保存图片的路径不正确,摄像头就无法返回到您的应用程序中。一旦确保目录存在,一切都会正常工作。请确保目录已存在,然后它就应该正常工作。

-- 编辑 --

我刚刚看到你调用了 path.mkdirs(); 但我认为这并不起作用。如您可以在Android文档中阅读到的那样,“请注意,此方法在失败时不会抛出IOException。调用者必须检查返回值。”。请务必检查目录是否真的存在。

希望对你有帮助。


嗯,这已经是很久以前的事了,我实际上不记得我是如何解决我的问题的,但感谢@qedejavu发布了您的解决方案 ^.^ - Rahul Gupta-Iwasaki
2
嗨Rahul,实际上我确实检查了文件夹的存在,并且它确实存在,图片也存储在那里,但是仍然无法通过“确定”按钮返回到我的活动。因此,@qedejavu所写的似乎不是解决方案。你还记得你是如何解决这个问题的吗? - Tom Burger
2
当本机相机应用程序无法访问您要保存到的目录时,这也会发生。例如,您的应用程序的私有存储对本机相机应用程序不可访问。 - Joshua Pinter

1
请检查这个。
案例1:
Uri newImageUri = null;

File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/");

path.mkdirs();

boolean setWritable = false;

setWritable = path.setWritable(true, false);

File file = new File(path, "Image_Story_" + System.currentTimeMillis() + ".jpg");

newImageUri = Uri.fromFile(file);

Log.i("MainActivity", "new image uri to string is " + newImageUri.toString());

Log.i("MainActivity", "new image path is " + newImageUri.getPath());            

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

intent.putExtra(MediaStore.EXTRA_OUTPUT, newImageUri);

startActivityForResult(intent, REQUEST_CODE_CAPTURE_IMAGE);

案例2:
String fileName = "" + System.currentTimeMillis() + ".jpg";

ContentValues values = new ContentValues();

values.put(MediaStore.Images.Media.TITLE, fileName);

values.put(MediaStore.Images.Media.DESCRIPTION, "Image capture by camera");

values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");

Uri imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

Log.i("MainActivity", "new image uri to string is " + imageUri.toString());

Log.i("MainActivity", "new image path is " + imageUri.getPath());

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

startActivityForResult(intent, REQUEST_CODE_CAPTURE_IMAGE);

我能够通过 Nexus S 摄像头在上述两种情况下保存图像: 情况 1: a. 图像存储在自定义文件夹中。 b. 如果将 "System.currentTimeMillis()" 更改为 ("new Date().toString()"),则图像不会被保存,相机也不会返回到我的活动界面。(可能是因为 "System.currentTimeMillis" 没有空格,而 "new Date().toString()" 可能具有特殊字符和空格) 情况 2: a. 图像存储在相机文件夹中。
感谢所有人。

1
此外,如果您在使用Environment.getExternalStorageDirectory().getPath(),请确保您的应用程序具有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />权限。

希望这可以帮助到您 =)


0

我有同样的问题。你只需要做一件事,在你的手机存储中检查是否有图片目录。如果没有这样的目录,则手动创建。

希望这对你有用。


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