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

5

我想在我的应用程序中启动用户选择的应用程序。但是,我不确定如何做到这一点。我尝试过以下方法:

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 - no such file or directory”错误。这引发了一些问题。我查阅了Android文档并注意到Contact.Intents类已经被弃用。但是,它的继承者ContactContracts面向API级别5,而我正在针对API级别3进行开发。这可能是问题所在吗?此外,我已经将此应用程序硬编码到代码中。是否有一种方法可以检索用户选择的任何应用程序的意图,以便启动它们?

5个回答

7
你需要向意图(Intent)中传递额外的信息,以告诉Android你想要展示或创建什么。否则,Android不知道启动哪个活动(activity),在你的情况下可能会抛出一个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权限。


谢谢,这个方法有效!这是不是意味着我必须为每个应用程序硬编码额外的参数? - keyboardP
你需要知道要触发哪个意图,因此在某种意义上,你需要硬编码一些值。但你并没有硬编码应用程序名称或任何其他东西,只是一个意图操作。因此,要查看图像(而不关心哪个应用程序将处理它),可以执行以下操作:new Intent(Intent.ACTION_VIEW, Uri.parse("content://foo/example/me.jpg")); 只要有一个应用程序可以处理通用的 VIEW 操作和 JPEG 文件类型的组合,那么这就是你所需要的。 - Christopher Orr
啊,我现在明白了。这样做会容易得多,哈哈 :)。感谢您的帮助。 - keyboardP

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

第一个启动默认的音乐应用程序,第二个启动联系人,第三个启动拨号器。 希望这可以帮到你。


请注意,您可以使用类似以下的内容:new Intent(android.provider.Settings.ACTION_SETTINGS)。 - Garret Wilson

0

您需要传递有效的参数给您启动的应用程序。许多应用程序期望数据URI和/或某些附加项是有效的。


0
请尝试以下代码:

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

this.startActivity(intent);

(抱歉,如果语法有误,我在这台电脑上没有安装Android)
从清单中删除操作。那不是必要的。 该操作方法用于其他用途。 有关更多信息,请查看Android网站:http://developer.android.com/reference/android/content/Intent.html 丹尼尔

你在Intent构造函数中传递的字符串就是操作;原始代码片段是正确的(如果是你写的冗长版本)。 - Christopher Orr

0

你所调用的活动应该不仅出现在其自己包的清单中,还应该出现在调用包的清单中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接