Подтвердить что ты не робот

Как захватить изображение и сохранить его с помощью встроенной камеры Android

У меня возникла проблема с захватом изображения и его сохранением из собственного приложения для камеры. Ниже приведен пример моего кода.

_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg";
File file = new File( _path );
Uri outputFileUri = Uri.fromFile( file );

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

startActivityForResult( intent, 0 );

После того, как снимок сделан, и я вернусь к первоначальной операции, когда я перехожу на свою SD-карту через Android DDMS File Explorer, изображения там нет. Кто-нибудь знает, почему это не сохраняется?

4b9b3361

Ответ 1

Вы проверили, какой результат имеет файл Environment.getExternalStorageDirectory(), потому что если он не содержит трейлинг файла (/), то ваше изображение окажется в каталоге, который не находится на SD-карте, например:

 /mnt/sdcardmake_machine_example.jpg

Когда вы действительно хотите:

 /mnt/sdcard/make_machine_example.jpg

Попробуйте использовать этот код:

 _path = Environment.getExternalStorageDirectory() + File.separator +  "make_machine_example.jpg";

Ответ 2

Здесь был конечный продукт, если кто-то еще посещает этот поток:

public class CameraCapture extends Activity {

    protected boolean _taken = true;
    File sdImageMainDirectory;

    protected static final String PHOTO_TAKEN = "photo_taken";

    @Override
    public void onCreate(Bundle savedInstanceState) {

        try {

            super.onCreate(savedInstanceState);         
                    File root = new File(Environment
                            .getExternalStorageDirectory()
                            + File.separator + "myDir" + File.separator);
                    root.mkdirs();
                    sdImageMainDirectory = new File(root, "myPicName");


                startCameraActivity();
            }
        } catch (Exception e) {
            finish();
            Toast.makeText(this, "Error occured. Please try again later.",
                    Toast.LENGTH_SHORT).show();
        }

    }

    protected void startCameraActivity() {

        Uri outputFileUri = Uri.fromFile(sdImageMainDirectory);

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

        startActivityForResult(intent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (resultCode) {
        case 0:
            finish();
            break;

        case -1:

            try {
                StoreImage(this, Uri.parse(data.toURI()),
                        sdImageMainDirectory);
            } catch (Exception e) {
                e.printStackTrace();
            }

            finish();
            startActivity(new Intent(CameraCapture.this, Home.class));

        }

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) {
            _taken = true;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken);
    }

        public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) {
        Bitmap bm = null;
        try {
            bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);
            FileOutputStream out = new FileOutputStream(imageDir);
            bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
            bm.recycle();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

Ответ 3

1. Просто используйте

new File(Environment.getExternalStorageDirectory(),  "make_machine_example.jpg");

и не беспокоиться о разделителях.

2. Столкнулась с той же проблемой. Телефоны SenseUI имеют собственное приложение камеры, которое не создает файл. Какое устройство вы используете? Возможно, он уже исправлен на последних устройствах, но он также может быть проблемой. Итак, вот полный пример, как его преодолеть Проблемы с сохранением фотографии в файл.

Ответ 4

Вы должны выполнить сканирование носителей после сохранения изображения

 sendBroadcast(new Intent(
            Intent.ACTION_MEDIA_MOUNTED,
            Uri.parse("file://" + Environment.getExternalStorageDirectory())));

Ответ 5

Добавьте эту строку в файл AndroidManifest.xml и удалите расширение make_machine_example:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Он начнет снимать Фото и хранить в SD-карте.