2009-12-29 17 views
5

Me gustaría lanzar una aplicación que el usuario selecciona desde mi aplicación. Sin embargo, no estoy seguro de cómo voy a hacer esto. He intentado esto:Lanzamiento de la aplicación externa desde mi aplicación

Intent intent = new Intent(); 
intent.setAction(Contacts.Intents.SHOW_OR_CREATE_CONTACT); 
startActivity(intent); 

Pero esto parece arrojar un error y forzar el cierre de mi aplicación. También intenté agregar:

<action android:name="Contacts.Intents.SHOW_OR_CREATE_CONTACT"/> 

en el archivo AndroidManifest, pero fue en vano.

Un vistazo a Logcat muestra que se trata de una "IOexception - no existe ningún archivo o directorio". Un par de preguntas surgen de esto. Leí los documentos de Android y noté que la clase Contact.Intents está en desuso. Sin embargo, es su sucesor, ContactContracts está dirigido al nivel 5 de API, mientras que mi objetivo es el nivel 3 de API. ¿Podría ser este el problema? Además, he codificado esta aplicación en el código. ¿Hay alguna forma de recuperar los intentos de cualquier aplicación que el usuario seleccione para poder lanzarlos?

Respuesta

7

Es necesario para pasar información adicional en la intención de decirle Android lo que desea mostrar o crear. De lo contrario, Android no sabe qué actividad iniciar y (presumiblemente en su caso) arroja un ActivityNotFoundException.

Para un contacto, utiliza el Intent.ACTION_INSERT_OR_EDIT genérico y luego utiliza el tipo MIME de un contacto individual (Contacts.People.CONTENT_ITEM_TYPE).

Por ejemplo:

Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 
intent.setType(People.CONTENT_ITEM_TYPE); 
intent.putExtra(Contacts.Intents.Insert.PHONE, "+1234567890"); 
intent.putExtra(Contacts.Intents.Insert.PHONE_TYPE, Contacts.PhonesColumns.TYPE_MOBILE); 

Esto abrirá la aplicación de contactos, que le pide que seleccione un contacto existente para agregar el número de teléfono, o para crear un nuevo contacto.

No necesita agregar nada especial a su manifiesto para iniciar actividades externas. Solo si tuviera que manipular directamente los contactos ContentProvider, tendría que agregar los permisos de CONTACTO correspondientes a su manifiesto.

+0

¡Gracias, eso funcionó! ¿Esto significa que tendré que codificar parámetros adicionales para cada aplicación? – keyboardP

+0

Bueno, necesitas saber qué intento disparar, así que en ese sentido necesitas codificar algunos valores. Pero no está codificando un nombre de aplicación ni nada, solo una acción intencionada. Para ver una imagen (sin importar qué aplicación manejará), puede hacer: 'nueva intención (Intent.ACTION_VIEW, Uri.parse (" content: //foo/example/me.jpg "));' y siempre que haya una aplicación que pueda manejar el combo de la acción genérica 'VIEW' y un tipo de archivo JPEG, eso es todo lo que necesita. –

+0

Ah, lo entiendo ahora. Eso hace que sea mucho más fácil lol :). Gracias por la ayuda. – keyboardP

0

Debe pasar argumentos válidos a las aplicaciones que inicia. Muchas aplicaciones esperan que el URI de datos y/o ciertos extras sean válidos.

0

Por favor, intente el siguiente código:

Intención intención = new Intent (Contacts.Intents.SHOW_OR_CREATE_CONTACT);

this.startActivity (intent);

(lo siento si hay algo mal en la sintaxis, no tengo android en este equipo)

Y eliminar la acción desde el manifiesto. eso no es necesario El método de acción se usa para otra cosa. Para más información, por favor vea el sitio androide: http://developer.android.com/reference/android/content/Intent.html

Daniel

+0

La cadena que pasa en el constructor 'Intent' * es * la acción; el fragmento de código original es correcto (si es una versión innecesariamente detallada de lo que escribió). –

1

Puedo usar este código para ese propósito:

Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.setClassName("com.android.settings", "com.android.settings.Settings"); 
startActivity(intent); 

Esto iniciará la aplicación Ajustes, puede utilizar estos también:

intent.setClassName("com.android.music", "com.android.music.MediaPlaybackActivityStarter"); 
intent.setClassName("com.android.contacts", "com.android.contacts.DialtactsContactsEntryActivity"); 
intent.setClassName("com.android.contacts", "com.android.contacts.DialtactsActivity"); 

La primera comienza la aplicación de música por defecto, el segundo el contactos, y el tercero el marcador. Espero que esto ayude.

+0

Tenga en cuenta que puede usar cosas como: nueva intención (android.provider.Settings.ACTION_SETTINGS) –

0

La actividad que está llamando debe aparecer no solo en el Manifiesto para su propio paquete, sino también en el Manifiesto para el paquete CALLING.

Cuestiones relacionadas