Pregunta

Estoy tratando de recortar una imagen de la Galería de Medios. Puedo acceder a la imagen, iniciar la herramienta de cultivo predeterminada e incluso guardar el resultado de la imagen recortada.

Sin embargo, la intención que estoy usando simplemente no devolverá ningún resultado si el recorte fue exitoso.

Mi método principal:

// Crop photo intent.
Intent intent = new Intent("com.android.camera.action.CROP", null);         
intent.setData(uri);   
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
intent.putExtra("scale", scale);
intent.putExtra("return-data", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, createTempCroppedImageFile());
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

// Publish intent to crop picture.
activity.startActivityForResult(intent, activity.CROP_PHOTO_REQUEST_CODE);  

- Método OnActivityResult () -

// Photo crop activity.
if (requestCode == CROP_PHOTO_REQUEST_CODE) {
    if (resultCode == RESULT_OK) {
        Log.d(TAG, "user cropped a photo");
        signupScreen.setImage(new PhotoTool(this).getTempCroppedImageFileLocation());
    } else
        Log.d(TAG, "user cancelled photo crop");
}

Si cancelo con la actividad de la cosecha, recibo con éxito el mensaje "Crop de fotos cancelado por el usuario". Pero si recorto una imagen, la nueva imagen recortada aparecerá en el directorio objetivo, pero la función OnActivityResult () nunca se llama. ¿Lo que da?

Mirando el LogCat, descubro que cada vez que guardo la imagen recortada, "Javabinder" se queja "de la transacción de aglutinante fallida". Entiendo que esto está de alguna manera relacionado con la memoria, pero el archivo recortado tiene solo 24 kb de tamaño.

¿Fue útil?

Solución

Encontró el problema para este problema. Desafortunadamente es una limitación de Android.

Ver ¿Android Cropper no puede ir más allá de los 256?

Había establecido la salida de mi imagen recortada en 400x400. Desafortunadamente, el Cropper predeterminado de Android solo puede hacer 256x256. Esto es tan completamente frustrante, especialmente cuando no hay documentación sobre los límites.

Otros consejos

Estás llamando setResult(int) (Enlace) en la intención del cultivo?

ACTUALIZAR:\

Enviar result_cancelled es el valor predeterminado. Siempre se enviará de regreso a menos que implementa algunas cosas.

En la intención de su cultivo, cuando haya terminado la edición (es decir, el usuario aprovecha el botón hecho, o algo similar), parte de ese proceso llamaría setResult(RESULT_OK).

ejemplo:

public void doneBTNPressed( View view ) {
    if ( view.getId() == R.id.doneBTN ) {
        this.isCropped = true;
    }
}

@Override    
protected void onPause() {
        if ( this.isCropped ) {
            setResult(RESUL_OK);
        }
        super.onPause();
    }

Ese resultado (result_ok, más otro entero que especifica) se vuelve a pasar a la actividad de llamadas (suponiendo que se usara StartActivityForResult ()). También hay algunas anulaciones, dependiendo de sus necesidades. En la actividad de llamadas (padre), tendría que implementar onActivityResultint,int,Intent) Para obtener el resultado de la actividad de salida.

En el enlace proporcionado anteriormente, hay una sección titulada "Actividades iniciales y obteniendo resultados", lo que explica las múltiples formas de obtener información de una actuación de salida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top