Problem is opening application over link in android 12 or higher.
Everything works fine on lower versions of android.
When I look at my “App Info” -> “Open by default” screen. I see unapproved links.
When I turn on that link as approved inside supported web addresses, opening app via link works.
I have read about verifying intent filter inside android documentation and everything looks fine to me.
https://developer.android.com/training/app-links/verify-site-associations#add-intent-filters
Have aded .well-known/assetlinks.json to my domain https://my.domain.net/.well-known/assetlinks.json content of .well-known/assetlinks.json (generated and checked with https://developers.google.com/digital-asset-links/tools/generator)
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target" : { "namespace": "android_app", "package_name": "my.package.name",
"sha256_cert_fingerprints": ["SHA_256"] }
}]
Triple checked that I am using correct SHA_256.
Also tested if .json is okay with “Statement List Generator and Tester”, link mentioned above.
Intent filter inside AndroidManifest.xml
<intent-filter
android:autoVerify="true"
android:label="@string/login_to_app">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="my.domain.net"
android:pathPrefix="/${dynamicVar}/our/application/"
android:scheme="https" />
</intent-filter>
Also I uploaded application to play store just to make sure this is not problem with SHA certificates or play store related, but no difference there.
Also I checked my app package name and it is correct for both internal testing and debugging.
I have also gone the way of adding every combination of app package names just to make sure.
Shortly: Opening application via link on android 12 and higher does not work due to unsupported web addresses.
I am aware that links need to be verified with .well-known/assetlinks.json When I manually check supported web addresses it works perfectly but that is not the end solution.
I cannot figure out what am I missing out here.
Anyone have an idea what could I be doing wrong here?
What changed?
As from Android 12 they have introduced a new way of checking for supported web domains.
Lower versions of android remain unchanged.
How does verification in android 12 works?
On installing the application android sends async requests to domains inside intent links to check if .well-known/assetlinks.json exists and is valid.
Note
If you already installed the application before verification from digital asset tool it will not detect your updated file at your website (assetlinks.json). So you need to re-install the application in order to it work properly.
How to generate assetlinks.json?
I recommend using this tool google provides for generating that file.
It can also check if assetlinks.json is present and setup correctly.
Generator: https://developers.google.com/digital-asset-links/tools/generator
Where to get SHA-256 form?
After you have generated .json file, at put it inside root of domain (.well-known/assetlinks.json).
I recommend opening it manually just to make sure.
https://my.domain.com/.well-known/assetlinks.json
Setting up Intent links in application
To you AndroidManifest.xml add
<!-- Make sure you explicitly set android:autoVerify to "true". -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- If a user clicks on a shared link that uses the "http" scheme, your
app should be able to delegate that traffic to "https". -->
<data android:scheme="http" />
<data android:scheme="https" />
<!-- Include one or more domains that should be verified. -->
<data
android:scheme="https"
android:host="**my.domain.com**"
android:pathPrefix="/test" />
</intent-filter>
Manually test if intent link is working:
You can run this command with your emulator running and it should open the application:
adb shell am start -W -a android.intent.action.VIEW -d "https://my.domain.com/test?code=abcde"
Manually test intent link
adb shell am compat enable 175408749 PACKAGE_NAME
adb shell pm set-app-links --package PACKAGE_NAME 0 all
adb shell pm verify-app-links --re-verify PACKAGE_NAME
adb shell pm get-app-links PACKAGE_NAME
The output of this command is similar to the following:
com.example.pkg:
ID: 01234567-89ab-cdef-0123-456789abcdef
Signatures: [***]
Domain verification state:
my.domain.com: verified
sub.example.com: legacy_failure
example.net: verified
example.org: 1026
After that you're good to go, your intent links will work on android 12 and lower.
Final test to check if you have set up everything properly
Run:
adb shell am start -W -a android.intent.action.VIEW -d "https://my.domain.com/test?code=abcde"
Source: https://developer.android.com/training/app-links/verify-android-applinks