2009-12-29 166 views
5

我想启动用户从我的应用程序中选择的应用程序。不过,我不确定我会如何去做这件事。我试过这个:从我的应用程序启动外部应用程序

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

但是,这似乎是抛出一个错误,并强制关闭我的应用程序。我也试过在AndroidManifest文件中加入:

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

但无济于事。

看看Logcat显示它是“IOexception - 没有这样的文件或目录”。由此产生了一些问题。我通读了Android文档,发现Contact.Intents类已被弃用。不过,它是继任者,ContactContracts旨在API级别5,而我的API级别为3级。这是否会成为问题?此外,我已将此应用程序硬编码到代码中。有没有办法检索用户选择的任何应用程序的意图,以便它们可以启动?

回答

7

你需要额外的信息传递到意图告诉安卓什么要显示或创建。否则,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权限添加到您的清单。

+0

谢谢,这工作!这是否意味着我必须为每个应用程序硬编码额外的参数? – keyboardP 2009-12-29 22:57:38

+0

那么你需要知道发生什么意图,所以在这个意义上你需要硬编码的一些值。但是,你不是硬编码的应用程序名称或任何东西,只是一个意图的行动。所以要查看图像(不关心哪个应用程序将处理它),你可以这样做:'新的Intent(Intent.ACTION_VIEW,Uri.parse(“content://foo/example/me.jpg”));'只要有一个应用程序可以处理通用'VIEW'动作和JPEG文件类型的组合,那么这就是你所需要的。 – 2009-12-29 23:08:44

+0

啊,我现在明白了。这使得它更容易大声笑:)。谢谢您的帮助。 – keyboardP 2009-12-29 23:19:25

0

您需要将有效参数传递给您开始的应用程序。很多应用程序都希望数据URI和/或某些附加内容是有效的。

0

请尝试以下代码:

意向意图=新意图(Contacts.Intents.SHOW_OR_CREATE_CONTACT);

this.startActivity(intent);

(抱歉,如果有什么不对的语法,我没有在这台电脑机器人)

并从清单中的作用。这是不需要的。 动作方法用于别的东西。 欲了解更多信息,请看看Android的网站:http://developer.android.com/reference/android/content/Intent.html

丹尼尔

+0

您在'Intent'构造函数*中传递的字符串是* action;原始的代码片段是正确的(如果你写了一个不必要的详细版本)。 – 2009-12-29 22:27:27

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

第一个启动默认的音乐应用程序,第二个联系人,以及第三个拨号器。 希望这有助于。

+0

请注意,您可以使用以下内容:new Intent(android.provider.Settings.ACTION_SETTINGS) – 2011-11-09 23:37:54

0

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

相关问题