Pregunta

Para mi aplicación, había estado usando mi propia clase de cámara para tomar imágenes y mi propia base de datos, pero pronto no pude seguir el ritmo de los cambios y decidí usar la aplicación de cámara incorporada en Android para hacer el trabajo, pero parece que no puedo conseguir que guarde el archivo. ¿Que me estoy perdiendo aqui? La aplicación parece guardar el archivo pero solo tiene 0 bytes. Busqué el código fuente de la aplicación de la cámara y está buscando la salida '' en Extras para guardar el archivo. Cualquier ayuda sería muy apreciada.

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());
        }
    }


}
¿Fue útil?

Solución

Esto funcionó con el siguiente código, dado que estaba siendo un poco tonto con el último. Todavía creo que debe haber una mejor manera para que la imagen original todavía se guarde en algún lugar. Todavía me envía la imagen más pequeña del 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) {
            //
        }
    }
}

Además, sé que el lanzamiento de cupcake de Android debería corregir el tamaño de la imagen pequeña pronto.

Otros consejos

El siguiente código iniciará la cámara predeterminada y hará que la cámara guarde la imagen en la uri especificada. La clave es poner el extra '' MediaStore.EXTRA_OUTPUT '' junto con la uri deseada.

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);

En su primer intento, podría ser que la aplicación de la cámara se bloquee cuando lee su " salida " extra, ya que espera que sea un Uri, mientras proporciona una cadena. La aplicación de la cámara parece leer la bandera adicional después de capturar la foto. Solo debe proporcionar uri, y no uri.getPath (). Luego, como ya conoce el URI de la foto, no se devolverá en la llamada onResult. Debe recordar el URI en una variable miembro.

En el segundo intento, obtendrá un mapa de bits reducido (50%). Está destinado principalmente a las vistas. Creo que el mapa de bits de tamaño completo es demasiado grande para el presupuesto de memoria de la aplicación. Este puede ser el motivo de la reducción de escala.

Para su información, encontré esto en documentos: La persona que llama puede pasar un EXTRA_OUTPUT adicional para controlar dónde se escribirá esta imagen. Si EXTRA_OUTPUT no está presente, se devuelve una imagen de tamaño pequeño como un objeto de mapa de bits en el campo adicional. Esto es útil para aplicaciones que solo necesitan una imagen pequeña. Si EXTRA_OUTPUT está presente, la imagen a tamaño completo se escribirá con el valor Uri de EXTRA_OUTPUT.

ubicado aquí: http://developer.android.com/reference/ android / provider / MediaStore.html

para que la aplicación pueda guardar imágenes a tamaño completo para usted, si le dice dónde.

** Editar: este no es el caso con los dispositivos HTC. HTC (no nexus) que usa htc sense ui se ha ramificado desde android 1.5 y tiene un error que siempre guarda la imagen en baja resolución. puede almorzar la actividad para la cámara y usar la función compartir de la cámara para usar la imagen a tamaño completo.

Tengo el mismo problema con el emulador, Lo probé en un teléfono real y funcionó, tal vez sea porque el teléfono virtual realmente no puede tomar fotos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top