Block your mobile site to open my deeplink Android app - Google Chrome

I support deeplinks in my application

<activity android:name=".DeepLinkActivity" android:noHistory="true"></activity> <activity-alias android:name="com.example.Launcher" android:targetActivity=".DeepLinkActivity"> <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" /> <data android:scheme="https" /> <data android:scheme="http" /> <data android:scheme="@string/SCHEMA" /> <data android:host="@string/WEB_DOMAIN" /> <data android:host="@string/WWW_WEB_DOMAIN" /> <data android:path="/" /> <data android:path="/x" android:pathPattern="/x/.*" /> </intent-filter> </activity-alias> 

Therefore, whenever a user clicks on www.example.com, an Android application asks to open an application or a web application, but I do not want when my users are on a mobile site, they should be asked to open in the application. I went through a lot of stackoverflow posts, but everyone says this is not possible, but still many websites are processing this script.

According to this Article, the behavior depends on the user's gestures, if the user clicks on any link, then Chrome displays the choice, and if the user types the URL in the browser, then this is not so.

+5
source share
1 answer

After many studies, I decided this. You can use any method.

Refer to the mobile site:. If you want to constantly show your user in Chrome when he is on your msite, you can achieve this by redirecting all your URLs to

Contact in the application

  • Create a single transparent activity to handle all your deeplinks

  • Process all links using pathpattern = '. * '

  • Redirect the user back to Chrome for URLs that you don’t want to handle in the app.

I don't know the exact logic, but it worked.

AndroidManifest.xml

  <activity android:name=".DeepLinkActivity" android:noHistory="true" android:theme="@style/Theme.Transparent"> <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" /> <data android:scheme="https" /> <data android:scheme="http" /> <data android:scheme="@string/SCHEMA" /> <data android:host="@string/WEB_DOMAIN" /> <data android:host="@string/WWW_WEB_DOMAIN" /> <data android:pathPattern="/.*" /> </intent-filter> </activity> 

Deeplink activity

 @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); try { if (Intent.ACTION_VIEW.equals(getIntent().getAction())) { Uri uri = getIntent().getData(); if (uri == null) throw new IllegalArgumentException("Uri can not be null"); Intent intent = null; if (getString(R.string.SCHEMA).equals(uri.getScheme()) || uri.toString().matches(Links.REGEX)) { intent = linkIntent(uri); } if (intent == null) SystemUtil.launchUrlInDefaultBrowser(uri, this); else startActivity(intent); } } catch (IllegalArgumentException e) { Toast.makeText(this, R.string.can_not_open_url, Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(this, R.string.can_not_open_url, Toast.LENGTH_SHORT).show(); } finally { finish(); } } /** * This will open the provided url in browser except the current app. * @param url Uri * @param context Activity Context */ public static void launchUrlInDefaultBrowser(Uri url, Context context) { try { ResolveInfo packageInfo = null; final Intent browserIntent = new Intent(Intent.ACTION_VIEW); browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); browserIntent.setData(url); // Try to find anything that we can launch the URL with. Pick up the first one that can. final List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentActivities(browserIntent, PackageManager.MATCH_DEFAULT_ONLY); if (!resolveInfoList.isEmpty()) { for (ResolveInfo list : resolveInfoList) { if (!BuildConfig.APP_PACKAGE_NAME.equals(list.activityInfo.packageName)) { packageInfo = list; break; } } } if (packageInfo != null) { browserIntent.setClassName(packageInfo.activityInfo.packageName, packageInfo.activityInfo.name); context.startActivity(browserIntent); } else { Toast.makeText(context, R.string.can_not_open_url, Toast.LENGTH_SHORT).show(); } } catch (Exception e) { Toast.makeText(context, R.string.can_not_open_url, Toast.LENGTH_SHORT).show(); } } 
+6
source

Source: https://habr.com/ru/post/1264350/


All Articles