Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Launch app with URL

I've read about intents in android but here goes my question. I'd like to launch an app on my android phone with the click of a link in the web browser. Example: If the link is "mycam://http://camcorder.com", "mycam://" acts as some kind of "tag" to launch my app but I'd like to pass "http://camcorder.com" as a string to that app on start.

Help please!

Thanks!

like image 953
Carlos Portes Avatar asked Jun 14 '10 16:06

Carlos Portes


2 Answers

There is a method in the Browser app source code, :

public boolean shouldOverrideUrlLoading(WebView view, String url) { ... }

After a url clicked and it's not yet starting to load:

  1. converts the url to intent

    Intent intent;
    
    // perform generic parsing of the URI to turn it into an Intent.
    try {
        intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
    } catch (URISyntaxException ex) {
        Log.w("Browser", "Bad URI " + url + ": " + ex.getMessage());
        return false;
    }
    
  2. if it don't start with market:// (or some predefined schemes), try startActivityIfNeeded()

    intent.addCategory(Intent.CATEGORY_BROWSABLE);
    intent.setComponent(null);
    try {
        if (startActivityIfNeeded(intent, -1)) {
            return true;
        }
    } catch (ActivityNotFoundException ex) {
        // ignore the error. If no application can handle the URL,
        // eg about:blank, assume the browser can handle it.
    }
    

It's very useful information! I re-play the situation in some simple code:

Intent intent = Intent.parseUri("mycam://http://camcorder.com", Intent.URI_INTENT_SCHEME);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setComponent(null);
System.out.println(intent);

The result will provide clues for me to write an activity with the intent-filter:

        <activity android:name=".MyCamActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="mycam" />
            </intent-filter>
        </activity>

PS. don't forget the android.intent.category.DEFAULT.

Finally, your Activity can invoke by mycam://yourscheme.

like image 197
qrtt1 Avatar answered Sep 19 '22 12:09

qrtt1


mycam://http://camcorder.com isn't a valid URI, and making up schemes is kind of scary if two apps pick the same one. It would be better for you to register your activity as a handler for a particular URI (for example http://www.example.com/camcorder, substituting your own domain of course). You do that with the <data> tag in your <intent-filter> tag in the AndroidManifest.xml. When the user clicks the link, they'll be taken to your application. That way, you can also put a real page there on the web, instructing people to install your app or whatever.

like image 38
joeo Avatar answered Sep 20 '22 12:09

joeo