android - seleccionar - No se puede cargar la imagen tomada desde la cámara en un ImageView
programacion android pdf 2018 (5)
Puedo guardar la imagen tomada desde la cámara en el almacenamiento interno, sin embargo, no puedo cargarla en ImageView, que permanece vacía. He leído todas las sugerencias relevantes pero no he podido encontrar una solución adecuada. Por favor, busque el código relevante a continuación, cualquier ayuda será MUCHO apreciada, ya que estoy luchando con ella durante días ...
Permisos manifiestos:
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
ImageView en XML:
<ImageView
android:id="@+id/recipeImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:background="@color/backgroundColorHomeBottomLayout"
android:padding="30dp" />
Actividad relevante:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE) {
if (resultCode == RESULT_OK) {
setPic();
//mImageView.setImageURI(fileUri);
}
else if (resultCode == RESULT_CANCELED) {
/** user cancelled Image capture */
Toast.makeText(this,
"User cancelled image capture", Toast.LENGTH_SHORT)
.show();
} else {
/** failed to capture image */
Toast.makeText(this,
"Sorry! Failed to capture image", Toast.LENGTH_SHORT)
.show();
}
}
}
/** Internal memory methods */
private void launchCameraIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
/** Ensure that there''s a camera activity to handle the intent */
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
/** Create the File where the photo should go */
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"v3.com.mycookbook5.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
/** return a unique file name for a new photo using a date-time stamp */
private File createImageFile() throws IOException {
/** Create an image file name */
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
/** Save a file: path for use with ACTION_VIEW intents */
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}
private void setPic() {
// Get the dimensions of the View
int targetW = mImageView.getWidth();
int targetH = mImageView.getHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
mImageView.setImageBitmap(bitmap);
}
Iniciar sesión:
07-03 12:56:07.188 3950-16091/? E/Drive.UninstallOperation: Package still installed v3.com.mycookbook5
07-03 12:56:35.350 19680-19680/v3.com.mycookbook5 E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: file:/storage/emulated/0/Android/data/v3.com.mycookbook5/files/Pictures/JPEG_20160703_125629_-664091716.jpg: open failed: ENOENT (No such file or directory)
07-03 12:56:35.350 19680-19680/v3.com.mycookbook5 E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: file:/storage/emulated/0/Android/data/v3.com.mycookbook5/files/Pictures/JPEG_20160703_125629_-664091716.jpg: open failed: ENOENT (No such file or directory)
Problema resuelto. Para ayudar a los demás, aquí es cómo se debe realizar:
- Renueve targetSdkVersion en build.gradle desde 23 -> 22, para evitar problemas de permisos.
Agregue el siguiente código al método launchCameraIntent ():
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
Cambie el método setPic de la siguiente manera:
Bitmap bitmap = BitmapFactory.decodeFile(photoFile.getPath()); Matrix matrix = new Matrix(); matrix.postRotate(90); Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 200, 150 ,false); mImageView.setImageBitmap(scaledBitmap);
Creo que su problema se debe a que no le está dando a la imagen el tiempo necesario para guardarla en la tarjeta SD ya que el código comienza a buscarla antes de que se guarde por completo, por lo que debe proporcionar un manejador diferido para asegurarse de que la imagen se guardó con éxito, también use la siguiente manera para obtener la ruta de la imagen:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setPic();
}
}, 750);
y para obtener la imagen de la tarjeta SD:
File file = new File(Environment.getExternalStorageDirectory()+File.separator + "image_name.jpg");
Bitmap bitmap = decodeSampledBitmapFromFile(file.getAbsolutePath(), 1000, 700);
public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight)
{
/*
* here you set all of your bmOptions specs
*/
return BitmapFactory.decodeFile(path, bmOptions);
}
Te das cuenta de que tendrás que extraer los datos adicionales del intento ¿no? ''onActivityResult'' regresará a su actividad con un código de resultado y CON DATOS ADICIONALES que es el mapa de bits de la imagen, debe pasar esos datos (de la manera que elija) a su método setPic.
Para obtener la foto de mapa de bits, puede usar el código a continuación
if (requestCode == REQUEST_IMAGE_CAPTURE) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
}
Yo diría que podría obtener una imagen de tamaño cero debido a tratar de cambiar el tamaño del tamaño de la vista de imagen (que, si no se representa todavía, puede ser de tamaño cero).
Intente cargar la imagen sin ningún tipo de manipulación y, después de tener éxito, cambie su código para reducir el consumo de memoria, pero hasta que obtenga el resultado óptimo.
Buena suerte.
prueba este código para malvavisco
Uri imageFileUri = data.getData();
final Bitmap bitmap = getBitmapFromUri(imageFileUri);
private Bitmap getBitmapFromUri(Uri uri) throws IOException {
ParcelFileDescriptor parcelFileDescriptor =
getLocalContext().getContentResolver().openFileDescriptor(uri, "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
return image;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE) {
if (resultCode == RESULT_OK) {
//mImageView.setImageURI(fileUri);
Uri imageFileUri = data.getData();
final Bitmap bitmap = getBitmapFromUri(imageFileUri);
setPic(bitmap);
}
else if (resultCode == RESULT_CANCELED) {
/** user cancelled Image capture */
Toast.makeText(this,
"User cancelled image capture", Toast.LENGTH_SHORT)
.show();
} else {
/** failed to capture image */
Toast.makeText(this,
"Sorry! Failed to capture image", Toast.LENGTH_SHORT)
.show();
}
}
}