5

я поддержал deeplinks в мое приложениеБлок мобильный веб-сайт, чтобы открыть мое приложение андроид Deeplink - Google Chrome

<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> 

Поэтому, когда пользователь нажимает на www.example.com андроид приложение просит, чтобы открыть, как приложение или веб, что это хорошо, но я не хочу, когда мои пользователи находятся на мобильном сайте, их следует попросить открыть в приложении. Я прошел через множество сообщений stackoverflow, но все говорят, что это невозможно, но все еще многие веб-сайты обрабатывают этот сценарий.

В зависимости от этого Article поведение зависит от жестов пользователя, если пользователь нажимает на любую ссылку, тогда Chrome отображает выбор, а если пользователь вводит URL-адрес в браузере, то это не так.

+2

Возможно, что мобильные сайты используют разные URL? – Divers

+0

У мобильного сайта и приложения нет одинаковых URL-адресов. – Tasneem

+0

Можете ли вы показать этот сайт и приложение? – Divers

ответ

6

После много исследований я решил это. Вы можете использовать любой способ.

Ручка на мобильном сайте: Так что, если вы хотите сделать ваш пользователь Chrome всегда, когда они находятся на вашем msite вы можете добиться этого, перенаправив все URLs в

Ручка в приложении

  • Создать единую прозрачную деятельность, чтобы обрабатывать все ваши deeplinks

  • обрабатывать все ссылки с помощью pathpattern = '*' пользователь

  • Redirect вернитесь в Chrome для URL-адресов, которые вы не хотите обрабатывать в приложении.

Я не знаю точной логики, но это сработало.

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(); 
    } 
} 
+1

Эти решения выглядят как огромный хак для меня. Что делать, если Google решает переключить браузер по умолчанию на что-то еще (как это было однажды)? Что делать, если у пользователя есть другой (пользовательский) мобильный браузер? Что делать, если устройство manufacurer устанавливает что-то еще в качестве браузера по умолчанию? – SergGr

+0

Да, это взлом, но он отлично работает. Проблема касается только Chrome. – Tasneem