Android:启动第三方应用的活动(Activity)

7
我正在开发一个应用程序,希望将Last.fm应用程序集成到其中。基本上,当有人在我的应用程序中查看艺术家时,我希望有一个按钮,他们可以点击以打开带有艺术家信息的Last.fm应用程序。
这个意图可以工作,但它会加载一个菜单,询问我想使用哪个应用程序(浏览器或Last.fm):
Intent i = new Intent();
i.setData(Uri.parse("http://last.fm/music/" + headliner));
i.setAction("android.intent.action.VIEW");
startActivity(i);

然而,我只想启动Last.fm应用程序并跳过询问要使用哪个应用程序的对话框,我认为可以使用setPackage()方法来实现这一点:

i.setPackage("fm.last.android");

但这会导致应用程序崩溃:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://last.fm/music/Rihanna pkg=fm.last.android }

能否仅启动Last.fm应用程序?这里提供了Last.fm的AndroidManifest.xml参考副本。

感谢阅读, 托尼

1个回答

14

是的,这是可能的,但你需要知道正确的组件名称。正常启动last.fm应用程序并检查日志文件以获取启动应用程序时使用的cmp=...信息。在你的应用程序中也要使用这个。

我可以像这样从市场内启动Z-DeviceTest应用程序而不会出现问题:

final Intent intentDeviceTest = new Intent("android.intent.action.MAIN");                
intentDeviceTest.setComponent(new  ComponentName("zausan.zdevicetest","zausan.zdevicetest.zdevicetest"));
startActivity(intentDeviceTest);

在我的情况中,我从logcat中获取的信息是:

// dat=content://applications/applications/zausan.zdevicetest/zausan.zdevicetest.zdevicetest

// cmp=zausan.zdevicetest/.zdevicetest

为了知道如何使用正确的组件/类启动应用程序...可以对last.fm应用程序执行相同的操作

编辑: 我已经测试了从我的应用程序启动Last.fm,并且这样做没有任何错误:

final Intent intentDeviceTest = new Intent("android.intent.action.MAIN");                
intentDeviceTest.setComponent(new ComponentName("fm.last.android","fm.last.android.LastFm"));
startActivity(intentDeviceTest);

@tonyc 将 startActivity 包装在 try 块中,并捕获 android.content.ActivityNotFoundException,如果包不存在,则会抛出该异常。这样,您的应用程序将不会被终止。 - Brent Faust
1
@Brent Foust,文档实际上建议使用if (intent.resolveActivity(getPackageManager()) != null) {startActivity(intent);}来避免ActivityNotFound异常。 - The_Martian
1
@The_Martian 听起来不错。就“推荐”的安卓方式而言,为了启动一个活动,阅读所有的错误处理可能会相当混乱。如果通常情况下它会成功,那么使用try/catch语句会更加简洁明了。对于提到这种替代方法,我给予+1的支持。 - Brent Faust
我已经按照这个解决方案调用第三方应用程序活动,但是我得到了以下错误:android.content.ActivityNotFoundException: Unable to find explicit activity class {fm.last.android/fm.last.android.LastFm}; have you declared this activity in your AndroidManifest.xml? 如果我使用try-catch块或if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); }来避免ANF异常,那么它不会显示异常,但仍然无法调用活动。 - Sonali
这是我的更新代码和帖子链接:http://stackoverflow.com/questions/36026860/call-third-party-app-activity-from-own-app - Sonali
显示剩余6条评论

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