Bloquear sitio web para móviles para abrir mi aplicación Android deeplink – Google Chrome
He apoyado deeplinks en mi aplicación
<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>
Por lo tanto, cuando el usuario hace clic en www.example.com, la aplicación android pide que se abra como una aplicación o una web que está bien, pero no quiero que cuando mis usuarios se encuentren en sitios móviles se les debe pedir que se abran en la aplicación. He pasado por muchos posts stackoverflow, pero todo el mundo dice que no es posible, pero todavía muchos sitios web están manejando este escenario.
- Facebook Deep Linking no funciona en Android
- Andorid Deeplinking no funciona con múltiples esquemas
- ¿Cómo promocionar / abrir la aplicación de los resultados del sitio web de búsqueda de Google?
- Deep vinculación no capaz de fallback a google mercado?
- Relacionar URI con <data> como http://example.com/algo en AndroidManifest
Según este artículo el comportamiento depende de los gestos del usuario, si el usuario está haciendo clic en cualquier enlace, entonces Chrome muestra un selector, mientras que si el usuario está escribiendo url en el navegador, entonces no.
- Cómo agregar texto personalizado en lugar de URL en mensaje Deeplink
- IOS y Android Shared HTTP Deep Linking?
- Enlace profundo de Android con URI personalizado
- URI personalizado esquemas para el Facebook Messenger
- Indexación de aplicaciones para Android y enlaces profundos: ¿me equivoqué todo el tiempo?
- ¿Cómo vincular profundamente una aplicación del navegador de Builtin de la aplicación de Facebook?
- Esquema de vinculación profunda de Android: coincide tanto con http como con https
- Deep linking en Android no inicia la aplicación y redirige a Android market market
Después de mucha investigación lo he resuelto. Se puede utilizar de cualquier manera.
Manejar en el sitio web para móviles: Por lo tanto, si desea convertir a su usuario en Chrome siempre cuando están en su msite, puede lograrlo redirigiendo todas sus URL a
- Googlechrome: // navegar? Url = https://www.example.com
- Intento: //www.example.com/x#Intent; esquema = https; package = com.android.chrome; S.browser_fallback_url = https: //www/example.com/x; action = android.intent.action. VIEW ;
Administrar en la aplicación
-
Crea una sola actividad transparente para manejar todos tus deeplinks
-
Manejar todos los enlaces usando pathpattern = '. *'
-
Redirigir usuario de nuevo a Chrome para urls que no quieres manejar en la aplicación.
No sé la lógica exacta detrás de esto, pero funcionó.
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>
DeepLinkActivity
@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(); } }