Intención para seleccionar fondo de pantalla con resalte de región de papel tapiz

Me gustaría saber si es posible crear una Intención que hace que el recorte de la galería muestre el resaltado de papel tapiz. Esta característica se ha introducido en Honeycomb. Para tener una idea de lo que estoy buscando echar un vistazo a la tableta en la imagen (los tres rectángulos azules).

He echado un vistazo al código fuente de la aplicación de galería ICS, pero no pude encontrar lo que estoy buscando.

esta

Me gustaría saber si es posible crear una Intención que hace que el recorte de la galería muestre el resaltado de papel tapiz.

Suponiendo que desea que su aplicación se comporte correctamente en todos los dispositivos Android, la respuesta es no. Ni la actividad de cultivo ni la vista de cultivo resaltada forman parte de la API pública; Ambos son internos a la aplicación Galería 3D. En otras palabras, podría pasar todo el tiempo en el mundo tratando de encontrar una acción de Intent para conseguir que esto funcione mágicamente para usted, pero el hecho es que algunos dispositivos simplemente no lo soportan. Por ejemplo, muchos dispositivos, como el HTC Sense y Samsung Galaxy, han personalizado versiones de Android que tienen su propia aplicación de galería. Dado que estas aplicaciones de Galería son específicas para las empresas que las diseñaron, estos dispositivos no tendrán necesariamente una clase CropImage para lanzar.

Dicho esto, para garantizar que su aplicación funciona en todos los dispositivos, tendrá que incorporar el código de recorte directamente en su proyecto. Y si por alguna razón encuentras una manera de lanzar la actividad del cultivo con un Intent, deberías probar si el paquete com.android.gallery3d existe como mínimo y manejarlo de alguna manera.

He incluido debajo de un trabajo que podría ayudarle a incorporar el código de Android en su proyecto. Actualmente no tengo acceso a una tableta que ejecute Honeycomb / ICS, por lo que no puedo ser más específico en lo que respecta a cómo hacerlo funcionar en versiones más recientes de Android, pero me imagino que implica un análisis similar y un poco de copiar y pegar Desde el paquete com.android.gallery3d .


Reutilizando la "Actividad de cultivo" en Android 2.x

He probado esto en mi Nexus One y justo antes de que el suave "crop-rectangle" apareció, tengo la siguiente salida logcat:

 I/ActivityManager( 94): Starting: Intent { act=android.intent.action.CHOOSER cmp=android/com.android.internal.app.ChooserActivity (has extras) } from pid 558 I/ActivityManager( 94): Starting: Intent { act=android.intent.action.ATTACH_DATA dat=content://media/external/images/media/648 typ=image/jpeg flg=0x3000001 cmp=com.google.android.gallery3d/com.cooliris.media.Photographs (has extras) } from pid 558 I/ActivityManager( 94): Starting: Intent { dat=content://media/external/images/media/648 cmp=com.google.android.gallery3d/com.cooliris.media.CropImage (has extras) } from pid 558 

Así que por lo que puedo decir, la secuencia de eventos que se produce cuando se realiza esta acción es la siguiente:

  1. Navega a una imagen en la galería y selecciona "establecer como …". ActivityChooser un ActivityChooser y selecciona "Wallpaper".
  2. Esta selección activa una Intent con acción ATTACH_DATA y componente com.cooliris.media.Photographs , que es una clase en el framework de Android que sirve como "selector de fondos de pantalla" para la aplicación de cámara; Sólo redirecciona a la acción de selección estándar. Puesto que hemos dado a Intent un URI que especifica la imagen que se va a definir como fondo de pantalla, esta clase ejecutará inevitablemente el código siguiente (ver el método onResume la clase):

     Intent intent = new Intent(); intent.setClass(this, CropImage.class); intent.setData(imageToUse); formatIntent(intent); startActivityForResult(intent, CROP_DONE); 
  3. Esto CropImage otro Intent que inicia la actividad CropImage … aquí es donde se especifica el área recortada utilizando el rectángulo suave. Cuando especifica el recorte, el resultado se establece en RESULT_OK con requestCode = CROP_DONE . La onActivityResult Photographs onActivityResult casos sobre estas dos constantes y, a continuación, establece el papel en consecuencia (consulte el método onActivityResult la clase onActivityResult ).

Por desgracia, por alguna razón, el equipo de Android decidió eliminar estas funcionalidades del SDK a partir de API 4 (Android v1.6) … así que si querías disparar una Intent para realizar esta secuencia exacta de eventos, Revise el paquete com.cooliris.media y copie y pegue las clases relevantes en su proyecto. En mi experiencia pasada, hacer esto es a menudo más problemas de lo que vale la pena (a menos que sea para realizar una acción relativamente simple), pero es definitivamente posible.

Aquí está un buen tutorial sobre cómo puede simplificar el proceso … requiere copiar y pegar 12 clases Java en su proyecto en lugar de todo el paquete com.cooliris.media . Estas clases juntas deben ser suficientes para CropImage correctamente la actividad CropImage , pero tendrá que configurar el fondo de pantalla manualmente en el CropImage actividad CropImage .

También tenga en cuenta que el código de ejemplo proporcionado supone que desea recortar inmediatamente después de que la cámara toma una fotografía. Por ejemplo, para iniciar la Actividad CropImage con una imagen pre-seleccionada de la galería, llamaría,

 Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, ACTIVITY_SELECT_IMAGE); 

Y luego en onActivityResult , (si requestCode == ACTIVITY_SELECT_IMAGE y resultCode == RESULT_OK ), inicie la actividad CropImage con los datos Uri dados en el tercer argumento de onActivityResult (vea el ejemplo de código para un ejemplo de cómo iniciar la Actividad).

Si algo, espero que esto le ayudará a señalar en la dirección correcta. Déjeme saber cómo va y deje un comentario si usted quiere que aclare cualquier cosa.

Esto me ayudará:

 public class CropSelectedImageActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, 1); } public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { final Bundle extras = data.getExtras(); Uri photoUri = data.getData(); if (photoUri != null) { Intent intent = new Intent("com.android.camera.action.CROP"); //intent.setClassName("com.android.camera", "com.android.camera.CropImage"); intent.setData(photoUri); intent.putExtra("outputX", 96); intent.putExtra("outputY", 96); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("scale", true); intent.putExtra("return-data", true); startActivityForResult(intent, 1); } } } } 

Tomado de : ImageCropper

No he probado esto, pero si usted echa un vistazo aquí

  Bundle newExtras = new Bundle(); // maybe that here - for more options see your source code link newExtras.putString("circleCrop", "true"); Intent cropIntent = new Intent(); // Uri would be something from MediaStore.Images.Media.EXTERNAL_CONTENT_URI cropIntent.setData(img.fullSizeImageUri()); // edit: it's inside com.android.gallery in case that is even installed. // should work if you replace that with setClassName("com.android.gallery", "com.android.camera.CropImage") cropIntent.setClass(this, CropImage.class); cropIntent.putExtras(newExtras); startActivityForResult(cropIntent, CROP_MSG); 

Entonces esto podría funcionar para usted.

A través de la intención de selección tal vez de esa manera:

 Intent i = new Intent(Intent.ACTION_PICK); i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivity(i); 

Hay una bonita biblioteca que se basa en la pantalla de recorte de ICS (desde la aplicación de la galería), aquí .

Usted puede modificarlo a sus necesidades, para seleccionar la parte que debe recortarse.

El código se basa en la aplicación Galería de Android (enlace aquí ), en "/ com / android / camera / gallery", mientras que la clase más importante es "CropImage" en "/ com / android / camera /". Está disponible para todos, incluso en caso de que falte la biblioteca (el código de Google siempre está disponible), como tal:

 git clone https://android.googlesource.com/platform/packages/apps/Gallery3D/ 

(E incluso si esto no estará disponible, estoy seguro de que habrá otros)

Ventajas sobre las otras soluciones aquí:

  • independiente
  • Personalizable
  • No se puede bloquear debido a los cambios en la ROM. Otras soluciones asumen la existencia de clases y aplicaciones exactas.
  • fuente abierta.
  • Una implementación real, y no iniciar una intención para otra aplicación.
  • Otras soluciones son altamente no recomendado, sólo por el uso de intenciones no oficiales, como se escribe aquí . Esto es escrito por un usuario muy conocido StackOverflow llamado " CommonsWare ", que es un usuario muy respetable que puede contar en un montón de temas relacionados con Android.

Una vez más, lo más recomendado para recortar imágenes sigue siendo una biblioteca de terceros. No utilizar soluciones de intentos.

Sólo haz esto!

 Intent intent = new Intent(Intent.ACTION_ATTACH_DATA).setDataAndType(contentUri, "image/jpeg") .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) .putExtra("mimeType", "image/jpeg"); startActivity(Intent.createChooser(intent, getString(R.string.set_as))); 

Que "image / jpeg" es la imagen mimeType, contentUri es la imagen uri

  • Diferencia entre getExtras (nombre) .getString y getIntent (). GetStringExtra (nombre)
  • Integrar MuPDF como un proyecto de biblioteca (Android)
  • ¿Cómo puedo obtener una aplicación Phonegap para recibir variables en Android?
  • Actividad devolver una imagen
  • Cómo enviar una URL en un correo electrónico mediante Android Intents
  • ¿Qué intenciones tiene la aplicación de Facebook para Android?
  • Actividad de inicio de Android en la selección del elemento de menú
  • La aplicación de Android navega para iniciar la actividad cuando viene de fondo
  • Intento pendiente de obtener servicio
  • PendingIntents mantiene el mismo objeto en caché
  • Android: No se ha encontrado actividad para manejar el error de intención? Cómo va a resolver
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.