从我的应用程序启动外部应用程序
我想启动用户从我的应用程序中选择的应用程序。不过,我不确定我会如何去做这件事。我试过这个:从我的应用程序启动外部应用程序
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级。这是否会成为问题?此外,我已将此应用程序硬编码到代码中。有没有办法检索用户选择的任何应用程序的意图,以便它们可以启动?
你需要额外的信息传递到意图告诉安卓什么要显示或创建。否则,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权限添加到您的清单。
您需要将有效参数传递给您开始的应用程序。很多应用程序都希望数据URI和/或某些附加内容是有效的。
请尝试以下代码:
意向意图=新意图(Contacts.Intents.SHOW_OR_CREATE_CONTACT);
this.startActivity(intent);
(抱歉,如果有什么不对的语法,我没有在这台电脑机器人)
并从清单中的作用。这是不需要的。 动作方法用于别的东西。 欲了解更多信息,请看看Android的网站:http://developer.android.com/reference/android/content/Intent.html
丹尼尔
您在'Intent'构造函数*中传递的字符串是* action;原始的代码片段是正确的(如果你写了一个不必要的详细版本)。 – 2009-12-29 22:27:27
我使用此代码用于这一目的:
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");
第一个启动默认的音乐应用程序,第二个联系人,以及第三个拨号器。 希望这有助于。
请注意,您可以使用以下内容:new Intent(android.provider.Settings.ACTION_SETTINGS) – 2011-11-09 23:37:54
您所调用的活动不仅会出现在Manifest中,而且还会出现在CALLING包的Manifest中。
谢谢,这工作!这是否意味着我必须为每个应用程序硬编码额外的参数? – keyboardP 2009-12-29 22:57:38
那么你需要知道发生什么意图,所以在这个意义上你需要硬编码的一些值。但是,你不是硬编码的应用程序名称或任何东西,只是一个意图的行动。所以要查看图像(不关心哪个应用程序将处理它),你可以这样做:'新的Intent(Intent.ACTION_VIEW,Uri.parse(“content://foo/example/me.jpg”));'只要有一个应用程序可以处理通用'VIEW'动作和JPEG文件类型的组合,那么这就是你所需要的。 – 2009-12-29 23:08:44
啊,我现在明白了。这使得它更容易大声笑:)。谢谢您的帮助。 – keyboardP 2009-12-29 23:19:25