Как сохранить данные с камеры на диск с помощью Mediastore на Android?

голоса
10

Для моего приложения, я использовал свой собственный класс камеры для съемки изображения и свою собственную базу данных, но достаточно скоро я не мог идти в ногу с изменениями и я решил использовать встроенное приложение камеры в Android, чтобы сделать работу, но Я не могу показаться, чтобы получить его, чтобы сохранить файл. Что я здесь отсутствует? Приложение кажется, сохранить файл, но это всего 0 байт. Я посмотрел исходный код приложения камеры, и она ищет «выход» в 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());
        }
    }


}
Задан 16/03/2009 в 03:22
источник пользователем
На других языках...                            


5 ответов

голоса
14

Это работает со следующим кодом, получил я был немного тупой с последним. Я до сих пор думаю, что там должен быть лучшим способом, так что исходное изображение еще сохраняются где-то. Он по-прежнему посылает мне меньше 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) {
            //
        }
    }
}

Кроме того, я знаю, что релиз кекса Андроида должен зафиксировать небольшой размер изображения в ближайшее время.

Ответил 16/03/2009 в 04:31
источник пользователем

голоса
6

Ниже код начнет камеру по умолчанию и камера сохранить изображение на указанный 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);
Ответил 01/09/2011 в 22:20
источник пользователем

голоса
4

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

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

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

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

Ответил 28/06/2010 в 08:25
источник пользователем

голоса
4

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

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

Ответил 24/08/2009 в 12:57
источник пользователем

голоса
0

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

Ответил 25/03/2010 в 18:53
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more