{"id":1286,"date":"2026-06-01T13:00:00","date_gmt":"2026-06-01T18:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=1286"},"modified":"2026-03-07T03:49:04","modified_gmt":"2026-03-07T08:49:04","slug":"android-link-handling-preferences","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/android-link-handling-preferences\/","title":{"rendered":"Android Link Handling Preferences: User Control"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Users have the final say in which app opens a link on Android. Even if your App Links are perfectly verified, a user can override the default behavior through Android&#39;s link handling settings. They can disable your app&#39;s link handling entirely, choose a different app, or reset their preferences.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Understanding how these preferences work is important for two reasons: first, to diagnose issues where &quot;links don&#39;t open my app for this user,&quot; and second, to guide users who want to change their default link handler. This guide covers the settings UI across Android versions, how preferences interact with App Links verification, and what your app can do when the user has changed the defaults.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the App Links verification process, see the <a href=\"https:\/\/tolinku.com\/blog\/android-app-links-complete-guide\/\">Android App Links complete guide<\/a>. For the Android 12+ changes, see <a href=\"https:\/\/tolinku.com\/blog\/android-12-app-links-changes\/\">Android 12+ App Links changes<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The &quot;Open by Default&quot; Settings<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Android 12+ (API 31+)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Android 12 redesigned the link handling settings. Each app has an &quot;Open by default&quot; page in system settings:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Settings &gt; Apps &gt; [Your App] &gt; Open by default<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This page shows:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Open supported links<\/strong>: A toggle (on\/off). When on, verified App Links open in the app. When off, links open in the browser.<\/li>\n<li><strong>Supported web addresses<\/strong>: A list of domains your app has declared in its intent filters, with verification status for each.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Users can:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Turn off &quot;Open supported links&quot; entirely (all links go to the browser).<\/li>\n<li>Add or remove individual domains (selectively enable\/disable link handling per domain).<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Android 6-11 (API 23-30)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Older versions have a simpler interface:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Settings &gt; Apps &gt; [Your App] &gt; Open by default<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This page shows:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Open supported links<\/strong>: Options are &quot;Open in this app&quot;, &quot;Ask every time&quot;, or &quot;Don&#39;t open in this app&quot;.<\/li>\n<li><strong>Supported links<\/strong>: A list of domains the app claims.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The user can also clear defaults by tapping &quot;Clear defaults&quot; on the app info page, which resets any previously selected &quot;Open with&quot; choices.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The &quot;Always&quot; and &quot;Just Once&quot; Legacy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before Android 12, when a user tapped a link and saw the disambiguation dialog, they could choose &quot;Always&quot; or &quot;Just Once.&quot; Choosing &quot;Always&quot; set a persistent preference that bypassed the dialog for future links. This preference can be cleared via &quot;Clear defaults.&quot;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On Android 12+, this dialog is mostly gone for verified App Links (they open directly), but it still appears for unverified links.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How Preferences Interact with Verification<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The relationship between verification and user preferences:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Verification<\/th>\n<th>User Setting<\/th>\n<th>Result<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Verified<\/td>\n<td>&quot;Open supported links&quot; ON<\/td>\n<td>App opens directly<\/td>\n<\/tr>\n<tr>\n<td>Verified<\/td>\n<td>&quot;Open supported links&quot; OFF<\/td>\n<td>Browser opens<\/td>\n<\/tr>\n<tr>\n<td>Not verified<\/td>\n<td>&quot;Open supported links&quot; ON<\/td>\n<td>Disambiguation dialog (Android 11-) or browser (Android 12+)<\/td>\n<\/tr>\n<tr>\n<td>Not verified<\/td>\n<td>&quot;Open supported links&quot; OFF<\/td>\n<td>Browser opens<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Key insight: <strong>verification is necessary but not sufficient.<\/strong> Even with perfect verification, the user can override it. And without verification, user preferences can&#39;t elevate your app to default handler status (on Android 12+).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common User Scenarios<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Scenario 1: &quot;Links used to open my app but now they don&#39;t&quot;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The user (or a system update) changed the &quot;Open supported links&quot; setting. This happens when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The user accidentally toggles the setting while exploring app settings.<\/li>\n<li>A system update resets link handling preferences.<\/li>\n<li>The user installed a competing app that claims the same domain.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Diagnosis:<\/strong> Ask the user to check Settings &gt; Apps &gt; [Your App] &gt; Open by default, and ensure &quot;Open supported links&quot; is enabled.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Scenario 2: &quot;Links always ask me which app to use&quot;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The app&#39;s App Links aren&#39;t verified. The system can&#39;t determine a default handler, so it shows the disambiguation dialog.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Diagnosis:<\/strong> Check verification status with <code>adb shell pm get-app-links --user cur &lt;package&gt;<\/code>. See the <a href=\"https:\/\/tolinku.com\/blog\/debugging-android-intent-resolution\/\">debugging guide<\/a> for detailed steps.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Scenario 3: &quot;Links open in the wrong app&quot;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Another app has verified App Links for the same domain (unlikely but possible), or the user previously selected &quot;Always&quot; for a different app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Diagnosis:<\/strong> Check which apps claim the domain:<\/p>\n\n\n\n<pre><code class=\"language-bash\">adb shell pm query-activities -a android.intent.action.VIEW \\\n  -d &quot;https:\/\/yourdomain.com\/path&quot; -c android.intent.category.BROWSABLE\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Guiding Users to the Right Settings<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Opening the Settings Directly<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On Android 12+, you can open your app&#39;s &quot;Open by default&quot; settings page directly:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">fun openLinkHandlingSettings(context: Context) {\n    if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.S) {\n        val intent = Intent(\n            Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,\n            Uri.parse(&quot;package:${context.packageName}&quot;)\n        )\n        context.startActivity(intent)\n    } else {\n        \/\/ Fallback for older versions: open app details\n        val intent = Intent(\n            Settings.ACTION_APPLICATION_DETAILS_SETTINGS,\n            Uri.parse(&quot;package:${context.packageName}&quot;)\n        )\n        context.startActivity(intent)\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">When to Prompt<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#39;t aggressively prompt users to change their link settings. Good times to offer guidance:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>After a failed deep link:<\/strong> If the user opened your app manually after tapping a link that should have opened it directly, offer a one-time prompt: &quot;Want links to open directly in [App]?&quot; with a button to the settings page.<\/li>\n<li><strong>During onboarding:<\/strong> For apps where deep linking is a core feature (messaging, social, content sharing), include a step in onboarding.<\/li>\n<li><strong>In a help\/FAQ section:<\/strong> Provide instructions for users who seek them out.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Checking Current Status<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On Android 12+, you can check your app&#39;s link handling status programmatically:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">fun checkLinkHandlingStatus(context: Context): Map&lt;String, Int&gt; {\n    if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.S) {\n        val manager = context.getSystemService(DomainVerificationManager::class.java)\n        val userState = manager.getDomainVerificationUserState(context.packageName)\n        return userState?.hostToStateMap ?: emptyMap()\n    }\n    return emptyMap()\n}\n\n\/\/ Usage\nval status = checkLinkHandlingStatus(this)\nstatus.forEach { (domain, state) -&gt;\n    val stateName = when (state) {\n        DomainVerificationUserState.DOMAIN_STATE_VERIFIED -&gt; &quot;verified&quot;\n        DomainVerificationUserState.DOMAIN_STATE_SELECTED -&gt; &quot;selected by user&quot;\n        DomainVerificationUserState.DOMAIN_STATE_NONE -&gt; &quot;not handled&quot;\n        else -&gt; &quot;unknown&quot;\n    }\n    Log.d(&quot;LinkStatus&quot;, &quot;$domain: $stateName&quot;)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The three states:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>VERIFIED (1):<\/strong> Automatically verified via Digital Asset Links. Best state.<\/li>\n<li><strong>SELECTED (2):<\/strong> User manually selected your app in settings. Also good, but may be reset.<\/li>\n<li><strong>NONE (0):<\/strong> Your app doesn&#39;t handle this domain (or the user disabled it).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Manufacturer Variations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Android link handling settings vary across manufacturers:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Samsung (One UI):<\/strong> Settings &gt; Apps &gt; [App] &gt; Set as default &gt; Open supported links. Samsung adds its own link handling for Samsung Internet browser, which can override Chrome&#39;s behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Xiaomi (MIUI):<\/strong> Settings &gt; Apps &gt; Manage apps &gt; [App] &gt; Open by default. MIUI has additional &quot;App link verification&quot; settings that can affect App Links independently.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Huawei (EMUI):<\/strong> Settings &gt; Apps &gt; Apps &gt; [App] &gt; Open by default. Huawei devices may have additional link interception from Huawei Browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Stock Android \/ Pixel:<\/strong> Settings &gt; Apps &gt; [App] &gt; Open by default. The standard experience described in this guide.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Always test on the devices your users actually use. The link handling UI and behavior can differ significantly across manufacturers.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best Practices<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><p><strong>Verify your App Links correctly.<\/strong> Verified links open automatically without any user action needed. This is the best experience.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Don&#39;t nag users about settings.<\/strong> A single, contextual prompt is acceptable. Repeated prompts are not. Users who chose to disable your link handling did so intentionally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Handle the &quot;links open in browser&quot; case gracefully.<\/strong> Your web fallback should work well. If a user&#39;s link handling is disabled, the URL loads in the browser. Make sure your website provides a good experience and offers a path back to the app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Use <a href=\"https:\/\/tolinku.com\/features\/deep-linking\">Tolinku deep links<\/a> for reliable routing.<\/strong> Tolinku handles the fallback chain (App Links &gt; intent URL &gt; web redirect) automatically, so even when user preferences prevent App Links from working, the link still resolves.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Test with link handling disabled.<\/strong> Disable &quot;Open supported links&quot; on your test device and verify your link flow works through the fallback path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Respect user choice.<\/strong> If a user prefers links to open in the browser, that&#39;s their decision. Your web experience should be good enough to serve them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For setting up verified App Links, see the <a href=\"https:\/\/tolinku.com\/blog\/android-app-links-complete-guide\/\">Android App Links guide<\/a>. For understanding verification states, see <a href=\"https:\/\/tolinku.com\/blog\/verified-vs-unverified-app-links\/\">verified vs. unverified App Links<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Understand Android&#8217;s link handling preferences UI. Learn how users control which apps open links, how it affects your deep linking, and how to guide users to the right settings.<\/p>\n","protected":false},"author":2,"featured_media":1285,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Android Link Handling Preferences: User Control on Android","rank_math_description":"Understand Android's link handling preferences UI. Learn how users control which apps open links and how it affects your deep linking.","rank_math_focus_keyword":"android link handling preferences","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-android-link-handling-preferences.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-android-link-handling-preferences.png","footnotes":""},"categories":[10],"tags":[25,23,20,69,328,33,91],"class_list":["post-1286","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","tag-android","tag-app-links","tag-deep-linking","tag-mobile-development","tag-settings","tag-user-experience","tag-verification"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=1286"}],"version-history":[{"count":5,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1286\/revisions"}],"predecessor-version":[{"id":2578,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1286\/revisions\/2578"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/1285"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=1286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=1286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=1286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}