android - caracteristicas - investigacion sobre youtube pdf
Android se bloquea después de la cámara Intento (7)
Tengo una aplicación publicada y una de las características fundamentales es permitir que el usuario tome una foto y luego guarde esa foto en una carpeta específica en su almacenamiento externo.
Todo parece estar funcionando bien, pero ahora he recibido dos informes que afirman que después de tomar una foto y hacer clic en "Listo" para salir de la cámara (y regresar a la Actividad), la aplicación se cerró de manera forzada y el usuario Volver a la pantalla de inicio.
Esto sucede en un Samsung Nexus S y en el Galaxy Tab. A continuación, publiqué mi código para mostrar que configuré mi intención y cómo manejo guardar y mostrar la foto en onActivityResult (). ¡Cualquier orientación sobre lo que podría estar causando que se bloquee después de que hagan clic en "Listo" para salir de la aplicación de la cámara, sería muy apreciada!
Una vez más, esto parece funcionar bien en la mayoría de los dispositivos, pero me preguntaba si es un enfoque más eficiente y universal que debería estar tomando. Gracias
Cómo estoy disparando la intención de la cámara
case ACTION_BAR_CAMERA:
// numbered image name
fileName = "image_" + String.valueOf(numImages) + ".jpg";
output = new File(direct + File.separator + fileName); // create
// output
while (output.exists()) { // while the file exists
numImages++; // increment number of images
fileName = "image_" + String.valueOf(numImages) + ".jpg";
output = new File(outputFolder, fileName);
}
camera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
uriSavedImage = Uri.fromFile(output); // get Uri of the output
camera.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); //pass in Uri to camera intent
startActivityForResult(camera, 1);
break;
default:
return super.onHandleActionBarItemClick(item, position);
}
return true;
}
Cómo estoy configurando onActivityResult ()
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) { // If data was passed successfully
Bundle extras = data.getExtras();
//Bundle extras = data.getBundleExtra(MediaStore.EXTRA_OUTPUT);
/*ad = new AlertDialog.Builder(this).create();
ad.setIcon(android.R.drawable.ic_menu_camera);
ad.setTitle("Save Image");
ad.setMessage("Save This Image To Album?");
ad.setButton("Ok", this);
ad.show();*/
bmp = (Bitmap) extras.get("data"); // Set the bitmap to the bundle
// of data that was just
// received
image.setImageBitmap(bmp); // Set imageview to image that was
// captured
image.setScaleType(ScaleType.FIT_XY);
}
}
En el evento de clic del botón de la cámara, puedes probar esto:
final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(getTempFile(this)));
startActivityForResult(intent, TAKE_PHOTO_CODE);
declare TAKE_PHOTO_CODE globally as:
private static final int TAKE_PHOTO_CODE = 1;
Agregue la función getTempFile en el código que ayudará a guardar la imagen llamada myImage.png en la que hizo clic en la tarjeta sd bajo la carpeta denominada como el nombre del paquete de su aplicación.
private File getTempFile(Context context) {
final File path = new File(Environment.getExternalStorageDirectory(),
context.getPackageName());
if (!path.exists()) {
path.mkdir();
}
return new File(path, "myImage.png");
}
Ahora en la función OnActivityResult agrega esto:
if (requestCode == TAKE_PHOTO_CODE) {
final File file = getTempFile(this);
try {
Uri uri = Uri.fromFile(file);
Bitmap captureBmp = Media.getBitmap(getContentResolver(),
uri);
image.setImageBitmap(captureBmp);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
En caso de que tengas problemas de memoria, agrega el siguiente código:
@Override
protected void onPause() {
image.setImageURI(null);
super.onPause();
}
Espero que esto ayude
Hola, se me ha dado una respuesta, pero como esta es también una de las soluciones más fáciles que he encontrado
¡Este es el ejemplo que más le molesta al dispositivo!
AndroidCameraUtils : descargue el proyecto y del proyecto de biblioteca incluyéndolo a continuación ¡es el fragmento de código que puede usar!
private void setupCameraIntentHelper () {mCameraIntentHelper = new CameraIntentHelper (this, new CameraIntentHelperCallback () ());
Bitmap photo = BitmapHelper.readBitmap(CameraIntentActivity.this, photoUri);
if (photo != null) {
photo = BitmapHelper.shrinkBitmap(photo, 300, rotateXDegrees);
ImageView imageView = (ImageView) findViewById(de.ecotastic.android.camerautil.sample.R.id.activity_camera_intent_image_view);
imageView.setImageBitmap(photo);
}
}
@Override
public void deletePhotoWithUri(Uri photoUri) {
BitmapHelper.deleteImageWithUriIfExists(photoUri, CameraIntentActivity.this);
}
@Override
public void onSdCardNotMounted() {
Toast.makeText(getApplicationContext(), getString(R.string.error_sd_card_not_mounted), Toast.LENGTH_LONG).show();
}
@Override
public void onCanceled() {
Toast.makeText(getApplicationContext(), getString(R.string.warning_camera_intent_canceled), Toast.LENGTH_LONG).show();
}
@Override
public void onCouldNotTakePhoto() {
Toast.makeText(getApplicationContext(), getString(R.string.error_could_not_take_photo), Toast.LENGTH_LONG).show();
}
@Override
public void onPhotoUriNotFound() {
messageView.setText(getString(R.string.activity_camera_intent_photo_uri_not_found));
}
@Override
public void logException(Exception e) {
Toast.makeText(getApplicationContext(), getString(R.string.error_sth_went_wrong), Toast.LENGTH_LONG).show();
Log.d(getClass().getName(), e.getMessage());
}
});
}
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
mCameraIntentHelper.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mCameraIntentHelper.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
mCameraIntentHelper.onActivityResult(requestCode, resultCode, intent);
}
}
NOTA : - Probé muchos ejemplos de utilidades de cámara y, por supuesto, hay otras formas de manejarlo, pero para los principiantes y las personas que no están demasiado familiarizadas con los conceptos básicos sería más cómoda con este proyecto. ¡Gracias!
Me enfrenté al mismo problema. Al parecer, la solución es hacer que uriSavedImage sea estática. No estoy seguro de si esta es la mejor manera. Pero esto funciona para mí.
Primero dejemos claro: tenemos dos opciones para tomar datos de imágenes en onActivityResult de la cámara:
1. Inicie la cámara pasando la ubicación exacta Uri de la imagen donde desea guardar.
2. Simplemente inicie la cámara no pase ningún Loaction Uri.
1. EN PRIMER CASO:
Inicia la cámara pasando la imagen Uri donde quieres guardar:
String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/picture.jpg";
File imageFile = new File(imageFilePath);
Uri imageFileUri = Uri.fromFile(imageFile); // convert path to Uri
Intent it = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
it.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
startActivityForResult(it, CAMERA_RESULT);
En onActivityResult recibe la imagen como:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (RESULT_OK == resultCode) {
iv = (ImageView) findViewById(R.id.ReturnedImageView);
// Decode it for real
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inJustDecodeBounds = false;
//imageFilePath image path which you pass with intent
Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
// Display it
iv.setImageBitmap(bmp);
}
}
2. EN SEGUNDO CASO:
Inicie la cámara sin pasar la imagen Uri, si desea recibir la imagen en Intención (datos):
Intent it = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(it, CAMERA_RESULT);
En onActivityResult recive la imagen como:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (RESULT_OK == resultCode) {
// Get Extra from the intent
Bundle extras = data.getExtras();
// Get the returned image from extra
Bitmap bmp = (Bitmap) extras.get("data");
iv = (ImageView) findViewById(R.id.ReturnedImageView);
iv.setImageBitmap(bmp);
}
}
***** Feliz codificación !!!! *****
Primero, asegúrese de verificar el código de solicitud, podría estar detectando el resultado de otra persona allí. En segundo lugar, no use el mapa de bits de datos de la intención; en todo caso, es pequeño, pero dado que proporciona la ruta para almacenar la imagen capturada, ni siquiera debería estar allí (consulte here ). Entonces, almacene la URL que proporcionó como ruta de salida del archivo y lea Bitmap desde allí cuando haya recibido RESULTADO para su solicitud:
...
// save your file uri, not necessarily static
mUriSavedImage = Uri.fromFile(output);
startActivityForResult(camera, MY_REQUEST_CODE);
/* Make a String like "com.myname.MY_REQUEST_CODE" and hash it into int to give it
a bit of uniqueness */
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
Bitmap bmp = BitmapFactory.decodeFile(mUriSavedImage);
if (bmp != null) {
image.setImageBitmap(bmp); // Set imageview to image that was
// captured
image.setScaleType(ScaleType.FIT_XY);
} else {
Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
Siga los pasos dados en este link . Espero que esto te sea de utilidad.
O
Recuperando tu imagen sin estrellarse
Escriba el siguiente código en MainActivity
// Storage for camera image URI components
private final static String CAPTURED_PHOTO_PATH_KEY = "mCurrentPhotoPath";
private final static String CAPTURED_PHOTO_URI_KEY = "mCapturedImageURI";
// Required for camera operations in order to save the image file on resume.
private String mCurrentPhotoPath = null;
private Uri mCapturedImageURI = null;
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
if (mCurrentPhotoPath != null) {
savedInstanceState.putString(CAPTURED_PHOTO_PATH_KEY, mCurrentPhotoPath);
}
if (mCapturedImageURI != null) {
savedInstanceState.putString(CAPTURED_PHOTO_URI_KEY, mCapturedImageURI.toString());
}
super.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.containsKey(CAPTURED_PHOTO_PATH_KEY)) {
mCurrentPhotoPath = savedInstanceState.getString(CAPTURED_PHOTO_PATH_KEY);
}
if (savedInstanceState.containsKey(CAPTURED_PHOTO_URI_KEY)) {
mCapturedImageURI = Uri.parse(savedInstanceState.getString(CAPTURED_PHOTO_URI_KEY));
}
super.onRestoreInstanceState(savedInstanceState);
}
Sospecho que 3 problemas posibles pueden haber creado tu problema:
Algunos dispositivos devuelven un
null
cuando llama aextras.get("data");
en el métodoonActivityResult
lo que su problema puede ser unaNullPointerException
. Para resolver esto, debe pasar la ubicaciónURI
exacta para indicar a la aplicación de la cámara dónde desea que la almacene y utilizarla enonActivityResult
para recuperar la imagen como unBitmap
.Algunos otros dispositivos devuelven un
Bitmap
tamaño completo cuandoextras.get("data");
enonActivityResult
. Si el mapa de bits es demasiado grande, puede resultar en unOutOfMemmoryError
, por lo que tal vez necesite descodificar su imagen en un tamaño más pequeño para no tener que acumular tanta memoria. Estos dos enlaces pueden ayudarte en esta situación:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
Tal vez el
GC
destruya su actividad, por lo que debe usaronSavedInstanceState
yonRestoreInstanceState
para guardar los datos de suActivity
. Vea la respuesta de este post anterior para más información.
No sé si ya ha tratado con estos problemas.
Espero que ayude:)