tesis sobre investigacion caracteristicas android android-intent camera

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:

  1. Algunos dispositivos devuelven un null cuando llama a extras.get("data"); en el método onActivityResult lo que su problema puede ser una NullPointerException . Para resolver esto, debe pasar la ubicación URI exacta para indicar a la aplicación de la cámara dónde desea que la almacene y utilizarla en onActivityResult para recuperar la imagen como un Bitmap .

  2. Algunos otros dispositivos devuelven un Bitmap tamaño completo cuando extras.get("data"); en onActivityResult . Si el mapa de bits es demasiado grande, puede resultar en un OutOfMemmoryError , 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

    BitmapFactory OOM me vuelve loco

  3. Tal vez el GC destruya su actividad, por lo que debe usar onSavedInstanceState y onRestoreInstanceState para guardar los datos de su Activity . Vea la respuesta de este post anterior para más información.

No sé si ya ha tratado con estos problemas.

Espero que ayude:)