androiddeep-linkingandroid-app-links

Android App link - Open a url from app in browser without triggering App Link


I have enabled App linking in my application. It works fine. But in my application there are some scenarios where i cannot handle the incoming url. In those cases i want to redirect that url to the default browser in the device.

Currently what i have tried doing is using intents to open browser with the url, but it again redirects to my app itself. The app link is of the format ->

https://<domain>/<prefix>/<params>

so depending on the params, i would like to either handle the app link in the app itself or redirect it to the default browser. Below is the code i tried to open the browser with the above url

val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(appLinkModel.url))
browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER)
browserIntent.resolveActivity(packageManager)?.let {
    startActivity(browserIntent)
}

I tried excluding the addCategory() line but the results are the same. Either the app crashes(hence the resolveActivity()), or app opens itself in a loop.

WHAT I WANT TO DO

So what i want to do is redirect the url to the default browser(or show a chooser WITHOUT my app in it), without triggering the app link again and again. So is this possible?


Solution

  • String data = "example.com/your_url?param=some_param";
    Intent defaultBrowser = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_BROWSER);
    defaultBrowser.setData(data);
    startActivity(defaultBrowser);
    

    this technique (using makeMainSelectorActivity) will force the link to open in the device's default browser

    Note - makeMainSelectorActivity only works for API level 15 and above.

    If you need to support API levels lower than 15, you could try this hack

    For Android 13 (API level 33) and above a MAIN Action selector may not work when sending a VIEW intent as Android enforces the intent matching the intent filter. The following approach should work for API level 33 (and also 15+):

    val emptyBrowserIntent = Intent()
        .setAction(Intent.ACTION_VIEW)
        .addCategory(Intent.CATEGORY_BROWSABLE)
        .setData(Uri.fromParts("http", "", null))
    val targetIntent = Intent()
        .setAction(Intent.ACTION_VIEW)
        .addCategory(Intent.CATEGORY_BROWSABLE)
        .setData(targetUri)
        .setSelector(emptyBrowserIntent)
    startActivity(targetIntent)