2009-12-29 16 views
5

Je souhaite lancer une application que l'utilisateur sélectionne dans mon application. Cependant, je ne suis pas sûr de la façon dont j'irais faire ça. J'ai essayé ceci:Lancement d'une application externe à partir de mon application

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

Mais cela semble jeter une erreur et forcer fermer mon application. J'ai également essayé d'ajouter:

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

dans le fichier AndroidManifest, mais en vain. Un examen de Logcat montre qu'il s'agit d'une "exception d'E/S - aucun fichier ou répertoire de ce type". Quelques questions en découlent. J'ai lu les documents Android et j'ai remarqué que la classe Contact.Intents est obsolète. Cependant, c'est successeur, ContactContracts est destiné à l'API niveau 5 alors que je vise le niveau 3 de l'API. Serait-ce le problème? En outre, j'ai codé en dur cette application dans le code. Existe-t-il un moyen de récupérer les intentions de n'importe quelle application que l'utilisateur sélectionne pour pouvoir être lancé?

Répondre

7

Vous devez transmettre des informations supplémentaires dans l'intention de dire Android ce que vous voulez afficher ou créer. Sinon Android ne sait pas quelle activité démarrer et (vraisemblablement dans votre cas) lance un ActivityNotFoundException.

Pour un contact, utilisez le Intent.ACTION_INSERT_OR_EDIT générique, puis utilisez le type MIME d'un contact individuel (Contacts.People.CONTENT_ITEM_TYPE).

Par exemple:

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

Cela met l'application de contacts, vous demandant de sélectionner un contact existant pour ajouter le numéro de téléphone ou pour créer un nouveau contact.

Vous n'avez pas besoin d'ajouter quelque chose de spécial à votre manifeste pour démarrer des activités externes. Ce n'est que si vous manipulez directement les contacts ContentProvider que vous devrez ajouter les autorisations de CONTACT appropriées à votre manifeste.

+0

Merci, ça a marché! Cela signifie-t-il que je devrais coder en dur les paramètres supplémentaires pour chaque application? – keyboardP

+0

Eh bien, vous devez savoir quelle est l'intention de tirer, donc dans ce sens, vous devez coder en dur dans certaines valeurs. Mais vous n'êtes pas en train de coder en dur un nom d'application ou quoi que ce soit, juste une action d'intention. Donc, pour voir une image (sans se préoccuper de savoir quelle application va la gérer), vous pouvez faire: 'new Intent (Intent.ACTION_VIEW, Uri.parse (" content: //foo/example/me.jpg "))' et tant qu'il y a une application qui peut gérer le combo de l'action générique 'VIEW' et un type de fichier JPEG, alors c'est tout ce dont vous avez besoin. –

+0

Ah, je comprends maintenant. Cela le rend beaucoup plus facile lol :). Merci pour l'aide. – keyboardP

0

Vous devez transmettre des arguments valides aux applications que vous démarrez. Beaucoup d'applications s'attendent à ce que l'URI de données et/ou certains extras soient valides.

0

S'il vous plaît essayez le code suivant:

intention Intention = new intention (Contacts.Intents.SHOW_OR_CREATE_CONTACT);

this.startActivity (intention);

(désolé s'il y a quelque chose de mal sur la syntaxe, je n'ai pas android dans cet ordinateur)

Et l'action de retirer le manifeste. ce n'est pas nécessaire. La méthode d'action est utilisée pour autre chose. Pour plus d'informations, s'il vous plaît consulter le site Android: http://developer.android.com/reference/android/content/Intent.html

Daniel

+0

La chaîne que vous transmettez dans le constructeur 'Intent' * est * l'action; l'extrait de code d'origine est correct (si une version inutilement verbeuse de ce que vous avez écrit). –

1

J'utilise ce code à cette fin:

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

Cela lancera l'application des paramètres, vous pouvez les utiliser aussi:

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 première commence l'application de musique par défaut, le second, le contacts, et le troisième le dialer. J'espère que cela aide.

+0

Notez que vous pouvez utiliser des choses comme: new Intent (android.provider.Settings.ACTION_SETTINGS) –

0

L'activité que vous appelez doit apparaître non seulement dans le manifeste pour son propre package, mais aussi dans le manifeste du package CALLING.