2012-10-04 19 views
5

Estoy tratando de capturar una imagen de una aplicación de cámara existente, guardar la imagen en una carpeta personalizada y mostrar la miniatura en y en imageView. La cámara suministra la miniatura, siempre y cuando no he especificado dónde guardar el archivo:Cómo capturar miniaturas de imágenes Y guardar archivos en una carpeta personalizada en Android

puedo conseguir la miniatura de la intención de volver:

... 
    Intent i = = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(i) 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent);  
    Bundle extras = intent.getExtras(); 
    Bitmap mImageBitmap = (Bitmap) extras.get("data"); 
} 

O puedo guardar el archivo en una carpeta especificada (que funciona bien)

... 
    Intent i = = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    i.putExtra((MediaStore.EXTRA_OUTPUT, outputFileUri); 
    startActivityForResult(i) 
} 

pero la miniatura ya no se almacena en los "datos" intención extra, y cuando intento para recuperar la uña del pulgar, me sale un error (esto es de mi LogCat)

10-04 06:30:14.463: E/AndroidRuntime(1967): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity: java.lang.NullPointerException 

Como puede ver, el campo devuelto es nulo en lugar de la miniatura del mapa de bits. Intenté decodificar el mapa de bits después para generar una miniatura desde el archivo directamente, pero lleva demasiado tiempo (incluso cuando estoy sin procesar me sale el error de memoria), y parece contradictorio hacer el trabajo dos veces. ¿Alguna sugerencia?

+0

creo que [la respuesta] [1] que puede ayudar a especificando el directorio de archivos. [1]: http://stackoverflow.com/a/9734268/1172945 – Tugrul

Respuesta

4

bien. Si está transfiriendo una IUR de salida al intento, no podrá volver a recibir los datos de la intención en el resultado de la actividad().

Creo única opción es utilizar el mismo outputURI para mostrar la miniatura ..

probar esto.

void captureImage(){ 
    File file = new File(Environment.getExternalStorageDirectory() 
    .getAbsolutePath() + "/MyFolder", "myImage"+ ".jpg"); 

mCapturedImagePath = file.getAbsolutePath(); 
     Uri outputFileUri = Uri.fromFile(file); 
    Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    i.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
    startActivityForResult(i, CAMERA_REQUEST); 

}

onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAMERA_REQUEST) { 
      if (resultCode == RESULT_OK) { 

File file = new File(mCapturedImagePath); 
imageView.setImageURI(Uri.fromFile(file)); 

} 
+0

Gracias por su sugerencia, pero estoy probando el resultado del intento devuelto dentro de la misma actividad (en realidad, en ActivityResult). La cámara no devuelve una miniatura si le di un i.putExtra (MediaStore.EXTRA_OUTPUT, outputFileUri); – keighty

+0

He editado mi pregunta para que quede más clara. – keighty

+0

camera_request es un código de solicitud entero y le da el valor que desee. por ejemplo CAMERA_REQUEST = 1 –

0

Su mapa de bits mImageBitmap es una variable local, hacen que global si desea utilizarlo fuera del onActivityResultFunction establece lo contrario la imagen hay que

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAMERA_REQUEST) { 
     photo = (Bitmap) data.getExtras().get("data"); 
     imageView.setImageBitmap(photo); 
    } 
} 
+0

gracias por la respuesta, pero el problema no es que no puedo usar el mapa de bits en otros lugares, es que la cámara no devuelve la miniatura cuando le doy un nombre de archivo de salida – keighty

+0

intente esto Intent cameraIntent = new Intent (android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult (cameraIntent, CAMERA_REQUEST); –

+0

CAMERA_REQUEST es un entero devuelto por la cámara. ¿Por qué iniciar la aplicación de la cámara con otro intento cuando acaba de regresar? – keighty

-1

probar esto

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(cameraIntent, CAMERA_REQUEST); 
Cuestiones relacionadas