从我的应用程序启动外部应用程序

时间:2009-12-29 22:09:57

标签: android android-intent launching-application

我想启动用户在我的应用程序中选择的应用程序。但是,我不确定我该怎么做。我试过这个:

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

但这似乎引发了错误并强行关闭了我的应用程序。我也尝试添加:

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

在AndroidManifest文件中,但无济于事。

看看Logcat表明它是“IOexception - 没有这样的文件或目录”。由此产生了几个问题。我阅读了Android文档并注意到不推荐使用Contact.Intents类。然而,它是继承者,ContactContracts针对API级别5,而我的目标是API级别3.这可能是问题吗?此外,我已将此应用程序硬编码到代码中。有没有办法检索用户选择的任何应用程序的意图,以便可以启动它们?

5 个答案:

答案 0 :(得分:7)

您需要将额外信息传递给意图告诉Android 您想要展示或创建的。否则,Android不知道要启动哪个活动(可能在您的情况下)会抛出ActivityNotFoundException

对于联系人,您使用通用Intent.ACTION_INSERT_OR_EDIT,然后使用单个联系人的MIME类型(Contacts.People.CONTENT_ITEM_TYPE)。

例如:

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

这将显示联系人应用,提示您选择现有联系人以添加电话号码,或创建新联系人。

您无需在清单中添加任何特殊内容即可启动外部活动。只有当您直接操纵联系人ContentProvider时,才需要为清单添加适当的CONTACT权限。

答案 1 :(得分:1)

我为此目的使用此代码:

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

这将启动“设置”应用,您也可以使用这些:

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

第一个启动默认音乐应用,第二个启动联系人,第三个启动拨号器。 希望这会有所帮助。

答案 2 :(得分:0)

您需要将有效参数传递给您启动的应用。很多应用程序都希望数据URI和/或某些附加功能有效。

答案 3 :(得分:0)

请尝试以下代码:

  
    

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

         

this.startActivity(意向);

  

(抱歉,如果语法有问题,我在这台计算机上没有安装android)

从清单中删除操作。这是不需要的。 动作方法用于其他方面。 有关详细信息,请查看android站点:http://developer.android.com/reference/android/content/Intent.html

丹尼尔

答案 4 :(得分:0)

您正在调用的活动不仅应出现在Manifest中,而且还应出现在CALLING包的Manifest中。