Cómo obtener la ruta correcta después de cortar la imagen?

Quiero recortar la captura / imagen seleccionada y cargarlo en el servidor.

¿Qué problema estoy enfrentando: después de recortar la imagen no estoy recibiendo el camino real para que la imagen recortada. He hecho mi código a continuación. Estoy cortando la imagen correctamente también todo funciona bien aquí, pero imageview no se muestra la imagen original en lugar de imagen recortada.

Sin embargo, cuando he buscado bitmap con Bitmap photo = extras.getParcelable("data"); Dentro onActivityResult() estoy recibiendo la imagen recortada se muestra en imageview.but no conseguir capaz de ruta absoluta para que Cropped Image.

¿Puede alguien por favor me guíe donde me falta. He intentado con muchos enlaces SO, pero no es capaz de obtener la solución exacta para mi problema.

Aquí está mi código:

 public class MainActivity extends Activity { private Uri mImageCaptureUri; private ImageView mImageView; private static final int PICK_FROM_CAMERA = 1; private static final int CROP_FROM_CAMERA = 2; private static final int PICK_FROM_FILE = 3; private String selectedImagePath = ""; boolean GallaryPhotoSelected = false; public static String Finalmedia = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final String[] items = new String[] { "Take from camera", "Select from gallery" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, items); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select Image"); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { // pick from // camera if (item == 0) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); mImageCaptureUri = Uri.fromFile(new File(Environment .getExternalStorageDirectory(), "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg")); intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri); try { intent.putExtra("return-data", true); startActivityForResult(intent, PICK_FROM_CAMERA); } catch (ActivityNotFoundException e) { e.printStackTrace(); } } else { // pick from file Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE); } } }); final AlertDialog dialog = builder.create(); Button button = (Button) findViewById(R.id.btn_crop); mImageView = (ImageView) findViewById(R.id.iv_photo); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.show(); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) return; switch (requestCode) { case PICK_FROM_CAMERA: doCrop(); break; case PICK_FROM_FILE: mImageCaptureUri = data.getData(); Log.i("TAG", "After Crop mImageCaptureUri " + mImageCaptureUri.getPath()); GallaryPhotoSelected = true; doCrop(); break; case CROP_FROM_CAMERA: Bundle extras = data.getExtras(); selectedImagePath = mImageCaptureUri.getPath(); Log.i("TAG", "After Crop selectedImagePath " + selectedImagePath); if (GallaryPhotoSelected) { selectedImagePath = getRealPathFromURI(mImageCaptureUri); Log.i("TAG", "Absolute Path " + selectedImagePath); GallaryPhotoSelected = true; } Finalmedia = selectedImagePath; Log.i("TAG", "Finalmedia Path " + Finalmedia); if (extras != null) { Bitmap photo = extras.getParcelable("data"); Bitmap bm = BitmapFactory.decodeFile(Finalmedia); mImageView.setImageBitmap(bm); } // File f = new File(mImageCaptureUri.getPath()); // // if (f.exists()) f.delete(); break; } } public static Bitmap decodeFile(String path) { int orientation; try { if (path == null) { return null; } // decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; // Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE = 70; int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 2; // while (true) { // if (width_tmp / 2 < REQUIRED_SIZE // || height_tmp / 2 < REQUIRED_SIZE) // break; // width_tmp /= 2; // height_tmp /= 2; // scale++; // } // decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; Bitmap bm = BitmapFactory.decodeFile(path, o2); Bitmap bitmap = bm; ExifInterface exif = new ExifInterface(path); orientation = exif .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); Log.e("ExifInteface .........", "rotation =" + orientation); // exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90); Log.e("orientation", "" + orientation); Matrix m = new Matrix(); if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) { m.postRotate(180); // m.postScale((float) bm.getWidth(), (float) bm.getHeight()); // if(m.preRotate(90)){ Log.e("in orientation", "" + orientation); bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bitmap; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { m.postRotate(90); Log.e("in orientation", "" + orientation); bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bitmap; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { m.postRotate(270); Log.e("in orientation", "" + orientation); bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bitmap; } return bitmap; } catch (Exception e) { return null; } } public String getRealPathFromURI(Uri contentUri) { String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(contentUri, proj, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } private void doCrop() { final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>(); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setType("image/*"); List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0); int size = list.size(); if (size == 0) { Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show(); return; } else { intent.setData(mImageCaptureUri); intent.putExtra("outputX", 200); intent.putExtra("outputY", 200); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("scale", true); intent.putExtra("return-data", true); if (size == 1) { Intent i = new Intent(intent); ResolveInfo res = list.get(0); i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); startActivityForResult(i, CROP_FROM_CAMERA); } else { for (ResolveInfo res : list) { final CropOption co = new CropOption(); co.title = getPackageManager().getApplicationLabel( res.activityInfo.applicationInfo); co.icon = getPackageManager().getApplicationIcon( res.activityInfo.applicationInfo); co.appIntent = new Intent(intent); co.appIntent .setComponent(new ComponentName( res.activityInfo.packageName, res.activityInfo.name)); cropOptions.add(co); } CropOptionAdapter adapter = new CropOptionAdapter( getApplicationContext(), cropOptions); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Choose Crop App"); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { startActivityForResult( cropOptions.get(item).appIntent, CROP_FROM_CAMERA); } }); builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { if (mImageCaptureUri != null) { getContentResolver().delete(mImageCaptureUri, null, null); mImageCaptureUri = null; } } }); AlertDialog alert = builder.create(); alert.show(); } } } } 

Después de pasar horas en este tema finalmente hacer que funcione por debajo de Way si alguien está teniendo este problema en el futuro.

 public class MainActivity extends Activity { private Uri mImageCaptureUri; private ImageView mImageView; private static final int PICK_FROM_CAMERA = 1; private static final int CROP_FROM_CAMERA = 2; private static final int PICK_FROM_FILE = 3; private String selectedImagePath = ""; boolean GallaryPhotoSelected = false; public static String Finalmedia = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final String[] items = new String[] { "Take from camera", "Select from gallery" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, items); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select Image"); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { // pick from // camera if (item == 0) { String storageState = Environment.getExternalStorageState(); if (storageState.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); // intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, // mImageCaptureUri); // if (hasImageCaptureBug()) { String path = Environment.getExternalStorageDirectory() .getName() + File.separatorChar + System.currentTimeMillis() + ".jpg"; File file = new File(path); // mImageCaptureUri = Uri.fromFile(new File( // Environment.getExternalStorageDirectory(), // "tmp_avatar_" // + String.valueOf(System // .currentTimeMillis()) // + ".jpg")); Log.i("TAG", "Final path" + path); try { if (file.exists() == false) { file.getParentFile().mkdirs(); file.createNewFile(); } } catch (IOException e) { Log.e("TAG", "Could not create file.", e); } mImageCaptureUri = Uri.fromFile(file); intent.putExtra( android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri); // } else { // intent.putExtra( // android.provider.MediaStore.EXTRA_OUTPUT, // android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // } try { // intent.putExtra("return-data", true); startActivityForResult(intent, PICK_FROM_CAMERA); } catch (ActivityNotFoundException e) { e.printStackTrace(); } } else { new AlertDialog.Builder(MainActivity.this) .setMessage( "External Storeage (SD Card) is required.\n\nCurrent state: " + storageState) .setCancelable(true).create().show(); } } else { // pick from file Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE); } } }); final AlertDialog dialog = builder.create(); Button button = (Button) findViewById(R.id.btn_crop); mImageView = (ImageView) findViewById(R.id.iv_photo); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.show(); } }); } public boolean hasImageCaptureBug() { // list of known devices that have the bug ArrayList<String> devices = new ArrayList<String>(); devices.add("android-devphone1/dream_devphone/dream"); devices.add("generic/sdk/generic"); devices.add("vodafone/vfpioneer/sapphire"); devices.add("tmobile/kila/dream"); devices.add("verizon/voles/sholes"); devices.add("google_ion/google_ion/sapphire"); return devices.contains(android.os.Build.BRAND + "/" + android.os.Build.PRODUCT + "/" + android.os.Build.DEVICE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) return; switch (requestCode) { case PICK_FROM_CAMERA: Log.i("TAG", "Inside PICK_FROM_CAMERA"); // mImageCaptureUri = data.getData(); // Bitmap bm1 = (Bitmap) data.getExtras().get("data"); // mImageView.setImageBitmap(bm1); // Bundle extras1 = data.getExtras(); // Bitmap bm1 = (Bitmap) extras1.get("data"); // mImageView.setImageBitmap(bm1); /* * try { if (hasImageCaptureBug()) { Log.i("TAG", "Inside Bug"); * selectedImagePath = String.valueOf(System .currentTimeMillis()) + * ".jpg"; File fi = new File( * Environment.getExternalStorageDirectory(), selectedImagePath); * try { mImageCaptureUri = Uri * .parse(android.provider.MediaStore.Images.Media * .insertImage(getContentResolver(), fi.getAbsolutePath(), null, * null)); if (!fi.delete()) { Log.i("logMarker", * "Failed to delete " + fi); } } catch (FileNotFoundException e) { * e.printStackTrace(); } } else { mImageCaptureUri = * data.getData(); } } catch (Exception e) { Log.i("TAG", * "Inside Bug"); selectedImagePath = * String.valueOf(System.currentTimeMillis()) + ".jpg"; File fi = * new File(Environment.getExternalStorageDirectory(), * selectedImagePath); try { mImageCaptureUri = Uri * .parse(android.provider.MediaStore.Images.Media * .insertImage(getContentResolver(), fi.getAbsolutePath(), null, * null)); if (!fi.delete()) { Log.i("logMarker", * "Failed to delete " + fi); } } catch (FileNotFoundException e1) { * e1.printStackTrace(); } } */ String path = mImageCaptureUri.getPath(); Log.i("TAG", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!After capture path " + path); doCrop(); break; case PICK_FROM_FILE: mImageCaptureUri = data.getData(); Log.i("TAG", "After Crop mImageCaptureUri " + mImageCaptureUri.getPath()); GallaryPhotoSelected = true; doCrop(); break; case CROP_FROM_CAMERA: Bundle extras = data.getExtras(); selectedImagePath = mImageCaptureUri.getPath(); Log.i("TAG", "After Crop selectedImagePath " + selectedImagePath); if (GallaryPhotoSelected) { selectedImagePath = getRealPathFromURI(mImageCaptureUri); Log.i("TAG", "Absolute Path " + selectedImagePath); GallaryPhotoSelected = true; } Finalmedia = selectedImagePath; if (extras != null) { // Bitmap photo = extras.getParcelable("data"); Log.i("TAG", "Inside Extra " + selectedImagePath); Bitmap photo = (Bitmap) extras.get("data"); selectedImagePath = String.valueOf(System.currentTimeMillis()) + ".jpg"; Log.i("TAG", "new selectedImagePath before file " + selectedImagePath); File file = new File(Environment.getExternalStorageDirectory(), selectedImagePath); try { file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); photo.compress(Bitmap.CompressFormat.PNG, 95, fos); } catch (IOException e) { // TODO Auto-generated catch block Toast.makeText(this, "Sorry, Camera Crashed-Please Report as Crash A.", Toast.LENGTH_LONG).show(); } selectedImagePath = Environment.getExternalStorageDirectory() + "/" + selectedImagePath; Log.i("TAG", "After File Created " + selectedImagePath); Bitmap bm = decodeFile(selectedImagePath); mImageView.setImageBitmap(bm); } /* * File f = new File(mImageCaptureUri.getPath()); * * if (f.exists()) f.delete(); */ break; } } public static Bitmap decodeFile(String path) { int orientation; try { if (path == null) { return null; } // decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; // Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE = 70; int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; // while (true) { // if (width_tmp / 2 < REQUIRED_SIZE // || height_tmp / 2 < REQUIRED_SIZE) // break; // width_tmp /= 2; // height_tmp /= 2; // scale++; // } // decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; Bitmap bm = BitmapFactory.decodeFile(path, o2); Bitmap bitmap = bm; ExifInterface exif = new ExifInterface(path); orientation = exif .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); Log.e("ExifInteface .........", "rotation =" + orientation); // exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90); Log.e("orientation", "" + orientation); Matrix m = new Matrix(); if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) { m.postRotate(180); // m.postScale((float) bm.getWidth(), (float) bm.getHeight()); // if(m.preRotate(90)){ Log.e("in orientation", "" + orientation); bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bitmap; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { m.postRotate(90); Log.e("in orientation", "" + orientation); bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bitmap; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { m.postRotate(270); Log.e("in orientation", "" + orientation); bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bitmap; } return bitmap; } catch (Exception e) { return null; } } public String getRealPathFromURI(Uri contentUri) { String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(contentUri, proj, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } private void doCrop() { final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>(); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setType("image/*"); List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0); int size = list.size(); if (size == 0) { Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show(); return; } else { intent.setData(mImageCaptureUri); intent.setClassName("com.android.camera", "com.android.camera.CropImage"); intent.putExtra("outputX", 100); intent.putExtra("outputY", 100); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("scale", true); intent.putExtra("return-data", true); // startActivityForResult(intent, CROP_FROM_CAMERA); if (size == 1) { Intent i = new Intent(intent); ResolveInfo res = list.get(0); i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); startActivityForResult(i, CROP_FROM_CAMERA); } else { for (ResolveInfo res : list) { final CropOption co = new CropOption(); co.title = getPackageManager().getApplicationLabel( res.activityInfo.applicationInfo); co.icon = getPackageManager().getApplicationIcon( res.activityInfo.applicationInfo); co.appIntent = new Intent(intent); co.appIntent .setComponent(new ComponentName( res.activityInfo.packageName, res.activityInfo.name)); cropOptions.add(co); } CropOptionAdapter adapter = new CropOptionAdapter( getApplicationContext(), cropOptions); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Choose Crop App"); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { startActivityForResult( cropOptions.get(item).appIntent, CROP_FROM_CAMERA); } }); builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { if (mImageCaptureUri != null) { getContentResolver().delete(mImageCaptureUri, null, null); mImageCaptureUri = null; } } }); AlertDialog alert = builder.create(); alert.show(); } } } } 
  • ¿Cómo resaltar ImageView cuando se enfoca o hace clic?
  • Picasso no carga la imagen
  • Android: cómo convertir todo ImageView a Bitmap?
  • Imagen que se muestra en Android Studio pero no en el teléfono
  • Alinear ImageView en la parte superior derecha de la pantalla
  • Rellene dos superposiciones de imagen como la barra de búsqueda en el evento táctil de la vista de imagen
  • Extraño comportamiento de las imágenes en RecyclerView
  • BaseAdapter y ContextMenu
  • Cómo rellenar la imagen dentro de ImageView por la costumbre de la izquierda y la coordenada superior | Androide
  • Android-TextView setText en Html.fromHtml para mostrar la imagen y el texto
  • ¿Cómo destruir un dibujable dentro de un ImageView si no lo necesitamos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.