2009-03-16 9 views
10

Para mi aplicación, he 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 integrada en Android para hacer el trabajo , pero parece que no puedo guardarlo. ¿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 busqué el "resultado" en Extras para guardar el archivo. Cualquier ayuda sería muy apreciada.¿Cómo guardo los datos de la cámara en el disco usando MediaStore en Android?

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


} 

Respuesta

14

Esto funcionó con el siguiente código, concedido que estaba siendo un poco tonto con el último. Sigo pensando que debe haber una mejor manera para que la imagen original aún se guarde en algún lugar. Todavía me envía la imagen de tamaño más pequeño 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 arreglar pronto el tamaño de la imagen pequeña.

+1

bueno gracias u tan tan tan much.it funciona realmente gracias u – Geetanjali

+0

: hey he utilizado código ur pero tengo una problem.I han utilizado la relación de aspecto y la opción de los cultivos, pero su relación de aspecto no tomar .¿Por ¿Es este comportamiento anormal? Por favor, ayúdenme – Geetanjali

4

En su primer intento, es posible que la aplicación de la cámara se bloquee cuando lee su "salida" adicional, ya que espera que sea un Uri, mientras proporciona una Cadena. La aplicación de la cámara parece leer la bandera extra después de capturar la foto. Debería proporcionar uri y no uri.getPath(). Entonces, 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%) de nuevo. Está pensado principalmente para vistas. Creo que el mapa de bits de tamaño completo es demasiado grande para el presupuesto de memoria de la aplicación. Esta puede ser la razón de la reducción de escala.

+0

Tiene sentido. Recuerdo que tuve problemas con el tipo de desbordamiento del búfer con imágenes más grandes o con más de una imagen sin escala en la pantalla ... – prasanna

0

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

+0

si es correcto, los emuladores no funcionan con la cámara. –

+0

emuladores nope funcionan con la cámara – Trikaldarshi

4

FYI, encontró esto en los 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 de tamaño completo se escribirá en el valor Uri de EXTRA_OUTPUT.

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

por lo que la aplicación de la imagen a tamaño completo puede ahorrar para usted, si usted 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 lleva un error que siempre guarda la imagen en baja resolución. puede almorzar la actividad de la cámara y usar la función compartir de la cámara para usar la imagen de tamaño completo.

6

El siguiente código iniciará la cámara predeterminada y hará que la cámara guarde la imagen en el uri especificado. La clave es poner el "MediaStore.EXTRA_OUTPUT" adicional junto con el uri deseado.

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

¿hay alguna manera de guardar automáticamente el archivo una vez que se ha tomado la fotografía? o sería mejor para el usuario decidir una vez que hayan encendido la cámara y tomado una foto. –

Cuestiones relacionadas