varias quitar puedo problema porque poner pantalla fotos fondos fondo como celular cambiar automaticamente agranda android android-intent android-gallery

android - quitar - porque no puedo cambiar mi fondo de pantalla en mi celular



Intención de seleccionar un fondo de pantalla con una región resaltada (5)

Me gustaría saber si es posible crear un Intent que haga que el recortador de la galería muestre el resaltado del fondo de pantalla. Esta característica ha sido introducida en Honeycomb. Para tener una idea de lo que estoy buscando, eche un vistazo a la tableta en la imagen (los tres rectángulos azules).

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


Me gustaría saber si es posible crear un Intent que haga que el recortador de la galería muestre el resaltado del fondo de pantalla.

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

Dicho esto, para garantizar que su aplicación funcione en todos los dispositivos, deberá incorporar el código de recorte directamente en su proyecto. Y si, por algún motivo, encuentra la forma de iniciar la actividad de recorte con un Intent, debería probar si el paquete com.android.gallery3d existe como mínimo y manejarlo de alguna manera.

He incluido a continuación una solución alternativa que podría ayudarlo 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ífica con respecto a cómo funciona en las nuevas versiones de Android, pero imagino que implica un análisis similar y un poco de copiar y pegar del paquete com.android.gallery3d .

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

Probé esto en mi Nexus One y justo antes de que apareciera el suave "recortar-rectángulo", obtuve 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

Entonces, por lo que puedo decir, la secuencia de eventos que ocurre cuando realiza esta acción es la siguiente:

  1. Navegas a una imagen en la galería y seleccionas "establecer como ...". ActivityChooser un ActivityChooser y selecciona "Fondo de pantalla".
  2. Esta selección activa un Intent con la acción ATTACH_DATA y el componente com.cooliris.media.Photographs , que es una clase en el marco de Android que sirve como "selector de fondo de pantalla" para la aplicación de la cámara; simplemente redirige a la acción de selección estándar. Dado que le hemos dado a la Intent URI un URI que especifica la imagen que se establecerá como fondo de pantalla, esta clase ejecutará inevitablemente el siguiente código (consulte 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 dispara otra Intent que inicia la Actividad CropImage ... aquí es donde se especifica el área recortada usando el rectángulo blando. Cuando especifica el recorte, el resultado se establece en RESULT_OK con requestCode = CROP_DONE . La actividad de Photographs cambia los casos sobre estas dos constantes y luego establece el fondo de pantalla en consecuencia (consulte el método onActivityResult la clase de onActivityResult )

Desafortunadamente, por el motivo que sea, el equipo de Android decidió eliminar estas funcionalidades del SDK a partir de la API 4 (Android v1.6) ... así que si desea disparar un Intent para realizar esta secuencia exacta de eventos, deberá hacerlo. Examine el paquete com.cooliris.media y copie y pegue las clases relevantes en su proyecto. En mi experiencia pasada, hacer esto a menudo es más problemático de lo que vale (a menos que sea para realizar una acción relativamente simple) pero definitivamente es posible.

Aquí hay un buen tutorial sobre cómo podría simplificar el proceso ... requiere que copie y pegue 12 clases Java en su proyecto en lugar de todo el paquete com.cooliris.media . Estas clases juntas deberían ser suficientes para iniciar correctamente la Actividad CropImage , pero tendrá que establecer el fondo de pantalla manualmente sobre el CropImage Actividad CropImage .

También tenga en cuenta que el código de muestra proporcionado asume que desea recortar inmediatamente después de que la cámara tome una imagen. Para, por ejemplo, iniciar la Actividad CropImage con una imagen preseleccionada 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 CropImage Activity con los datos de Uri que figuran en el tercer argumento de onActivityResult (vea el código de ejemplo para ver un ejemplo de cómo lanzar la Actividad).

En todo caso, espero que esto te ayude a orientarte en la dirección correcta. Déjame saber cómo va y deja un comentario si quieres que aclare algo.


Aquí hay una biblioteca agradable que se basa en la pantalla de recorte de ICS (de la aplicación de la galería).

Podría modificarlo según sus necesidades, para seleccionar la parte a recortar.

El código se basa en la aplicación de la Galería de Android (enlace here ), debajo de "/ 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 puede fallar 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 hacia otra aplicación.
  • otras soluciones son altamente no recomendables, solo por el uso de intenciones no oficiales, como se escribe here . Esto lo escribió un muy conocido usuario de llamado " CommonsWare ", que es un usuario muy respetable con el que puede contar en muchos temas relacionados con Android.

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


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 echa un vistazo here

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 ti.

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);


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)));

el cual "image / jpeg" es el tipo mime de la imagen, contentUri es el uri de la imagen