Как сохранить данные с камеры на диск с помощью MediaStore на Android? - PullRequest
10 голосов
/ 16 марта 2009

Для моего приложения я использовал свой собственный класс Camera для съемки изображений и свою собственную базу данных, но довольно скоро я не смог поспеть за изменениями и решил использовать встроенное приложение камеры в Android, чтобы работа, но я не могу получить его, чтобы сохранить файл. Что мне здесь не хватает? Приложение, кажется, сохраняет файл, но это просто 0 байтов. Я посмотрел исходный код приложения Camera, и он ищет «выходные данные» в Extras для сохранения файла. Любая помощь будет принята с благодарностью.

Public class CameraTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button cameraButton = (Button) findViewById(R.id.cameraButton);
        cameraButton.setOnClickListener( new OnClickListener(){
            public void onClick(View v ){
                ContentValues values = new ContentValues();
                values.put(Images.Media.TITLE, "title");
                values.put(Images.Media.BUCKET_ID, "test");
                values.put(Images.Media.DESCRIPTION, "test Image taken");
                Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra("output", uri.getPath());
                startActivityForResult(intent,0);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode== 0 && resultCode == Activity.RESULT_OK){
            ((ImageView)findViewById(R.id.pictureView)).setImageURI(data.getData());
        }
    }


}

Ответы [ 5 ]

15 голосов
/ 16 марта 2009

Это работало со следующим кодом, если, конечно, я немного тупил с последним. Я все еще думаю, что должен быть лучший способ, чтобы исходное изображение все еще сохранялось где-то. Он все еще посылает мне уменьшенное изображение размером 25%.

public class CameraTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button cameraButton = (Button) findViewById(R.id.cameraButton);
    cameraButton.setOnClickListener( new OnClickListener(){
        public void onClick(View v ){

            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

            startActivityForResult(intent,0);
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode== 0 && resultCode == Activity.RESULT_OK) {
        Bitmap x = (Bitmap) data.getExtras().get("data");
        ((ImageView)findViewById(R.id.pictureView)).setImageBitmap(x);
        ContentValues values = new ContentValues();
        values.put(Images.Media.TITLE, "title");
        values.put(Images.Media.BUCKET_ID, "test");
        values.put(Images.Media.DESCRIPTION, "test Image taken");
        values.put(Images.Media.MIME_TYPE, "image/jpeg");
        Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
        OutputStream outstream;
        try {
            outstream = getContentResolver().openOutputStream(uri);
            x.compress(Bitmap.CompressFormat.JPEG, 70, outstream);
            outstream.close();
        } catch (FileNotFoundException e) {
            //
        } catch (IOException e) {
            //
        }
    }
}

Кроме того, я знаю, что выпуск Android-кексов должен скоро исправить маленький размер изображения.

6 голосов
/ 02 сентября 2011

Приведенный ниже код запустит камеру по умолчанию, и камера сохранит изображение в указанном URI. Ключ должен поместить дополнительный MediaStore.EXTRA_OUTPUT вместе с желаемым URI.

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + image_name + ".jpg");
Uri imageUri = Uri.fromFile(file);

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

startActivityForResult(intent, 0);
4 голосов
/ 28 июня 2010

К вашему сведению, нашел это в документах: Вызывающий может передать дополнительный EXTRA_OUTPUT, чтобы указать, где будет записано это изображение. Если EXTRA_OUTPUT отсутствует, то изображение небольшого размера возвращается в качестве растрового объекта в дополнительное поле. Это полезно для приложений, которым нужно только небольшое изображение. Если EXTRA_OUTPUT присутствует, то полноразмерное изображение будет записано в значение Uri EXTRA_OUTPUT.

находится здесь: http://developer.android.com/reference/android/provider/MediaStore.html

, чтобы приложение могло сохранить для вас полноразмерное изображение, если вы укажете, где.

** Редактировать: Это не относится к устройствам HTC. HTC (не nexus), использующий htc sense ui, имеет ветвление с Android 1.5 и содержит ошибку, которая всегда сохраняет изображение в низком разрешении. Вы можете использовать ланч для камеры и использовать функцию обмена с камеры, чтобы использовать полноразмерное изображение.

4 голосов
/ 24 августа 2009

В вашей первой попытке может произойти сбой приложения «Камера», когда он считывает ваш дополнительный «вывод», поскольку он ожидает, что это будет Uri, а вы предоставляете строку. Приложение Камера, кажется, читает дополнительный флаг после захвата фотографии. Вы должны просто предоставить uri, а не uri.getPath (). Тогда, поскольку вы уже знаете URI для фотографии, он не будет возвращен в вызове onResult. Вам нужно запомнить URI в переменной-члене.

Во второй попытке вы получите обратно уменьшенное (до 50%) растровое изображение. Он в первую очередь предназначен для просмотров. Я думаю, что полноразмерное растровое изображение слишком велико для бюджета памяти приложения. Это может быть причиной уменьшения масштаба.

0 голосов
/ 25 марта 2010

У меня такая же проблема с эмулятором, Я попробовал это на реальном телефоне, и это сработало, может быть, это потому, что виртуальный телефон не может делать снимки.

...