tags:

views:

150

answers:

1

Hi,

I'm working on an app and I want to integrate the Last.fm app into it. Basically, when someone is looking at an artist in my app, I would like to have a button that they can tap to open up Last.fm application with the artist's information.

This intent works, but it loads a menu asking which app I would like to use (Browser or Last.fm):

Intent i = new Intent();
i.setData(Uri.parse("http://last.fm/music/" + headliner));
i.setAction("android.intent.action.VIEW");
startActivity(i);

However, I just want to start the Last.fm app and skip the dialog asking which app to use, I thought maybe using the setPackage() method would work like this:

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

But it causes the app to crash:

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

Is it possible to just start the Last.fm app? Here's a copy of Last.fm's AndroidManifest.xml for reference.

Thanks for reading, Tony

+1  A: 

Yes, it's possible but you need to know the correct component name. Launch the last.fm app regularly and check the logfile for the cmp=... information that's been used when the app is started. Use this as well in your app then.

I start the Z-DeviceTest app from the market from within my app without a problem like this:

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

in my case the info I took from the logcat was:

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

// cmp=zausan.zdevicetest/.zdevicetest

in order to know how to start the app with the right component/class... do the same for the last.fm app

Edit: I've tested to launch Last.fm from my own app, and this works fine without any errors:

final Intent intentDeviceTest = new Intent("android.intent.action.MAIN");                
intentDeviceTest.setComponent(new ComponentName("fm.last.android","fm.last.android.LastFm"));
startActivity(intentDeviceTest);
Mathias Lin
This is a hack and not considered the proper way to call applications. Thiis a sure way to make sure all kinds of errors will show up
Falmarri
can you explain why this is a hack? you're using the regular Intent of the app that's been called by the App Launcher as well, i.e. when you click on the app icon on the home screen?Anyway, so what's the proper way then that you'd suggest instead?
Mathias Lin
Maybe I misunderstood. If you're calling the activity that the launcher calls, then I guess that should be fine. I understood the question as calling an INTERNAL activity of a different package. This is prone to breaking because that activity could require intent extras that could cause a crash, or something like that. Without seeing the code, it's not possible to tell if it's 100% safe
Falmarri
This worked just like I wanted it to. It is worth noting that Falmarri brings up a good point, this kind of functionality isn't really encouraged and you should really check if the application is installed to avoid a force close.
tonyc
Ok, I see your point. But such eventual force close should be possible to catch in your app I assume. I haven't tried it but wouldn't a try/catch do? Ok, agree, it's kind of hacky maybe, but I don't know of any other approach if the other app doesn't offer an official 'public' custom intent.
Mathias Lin