Заблокировать мобильный веб-сайт, чтобы открыть ссылку на Android в моем приложении – 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, приложение для Android просит открыть его как приложение или веб-сайт, что нормально, но я не хочу, чтобы мои пользователи находились на мобильном сайте, и их нужно было попросить открыть в приложении. Я просмотрел много сообщений stackoverflow, но все говорят, что это невозможно, но все же многие веб-сайты обрабатывают этот сценарий.

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


person Tas    schedule 17.02.2017    source источник
comment
Возможно, что мобильные сайты используют другой URL?   -  person Divers    schedule 17.02.2017
comment
Ни один мобильный сайт и приложение не имеют одинаковых URL-адресов.   -  person Tas    schedule 17.02.2017
comment
Можете ли вы показать этот сайт и приложение?   -  person Divers    schedule 17.02.2017
comment
www.desidime.com, схема https еще не работает, поэтому она вам не подойдет.   -  person Tas    schedule 17.02.2017
comment
Хорошее доказательство ваших слов, если даже вы сказали, что это не сработает для меня.   -  person Divers    schedule 17.02.2017
comment
Я не хочу создавать разные домены или URL-адреса для Интернета и приложений, как это делают многие другие приложения.   -  person Tas    schedule 17.02.2017
comment
@Divers, так что сейчас мы поддерживаем только пользовательские схемы, а не http и https , тогда он не перенаправляется ниоткуда только внутри приложения. Но после поддержки http и https эта проблема возникает.   -  person Tas    schedule 17.02.2017
comment
Вы сказали still many websites are handling this scenario., и я прошу показать мне хотя бы один, который я могу проверить.   -  person Divers    schedule 17.02.2017
comment
Пожалуйста, проверьте nl.pepper.com, myntra.com, hotUKdeals.   -  person Tas    schedule 22.02.2017
comment
Нет, их мобильный сайт также использует тот же домен и URL.   -  person Tas    schedule 22.02.2017


Ответы (1)


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

Обработка мобильного веб-сайта. Поэтому, если вы хотите, чтобы ваш пользователь отображался в Chrome всегда, когда он находится на вашем msite, вы можете добиться этого, перенаправив все свои URL-адреса на

Обработка в приложении

  • Создайте единую прозрачную активность для обработки всех ваших глубоких ссылок.

  • Обработайте все ссылки, используя pathpattern = '.*'

  • Перенаправьте пользователя обратно в 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>

Активность DeepLink

@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();
    }
}
person Tas    schedule 22.02.2017
comment
Эти решения выглядят для меня огромным взломом. Что, если Google когда-нибудь решит сменить свой браузер по умолчанию на что-то другое (как они сделали когда-то)? Что делать, если у пользователя есть какой-то другой (пользовательский) мобильный браузер? Что, если производитель устройства установит другой браузер в качестве браузера по умолчанию? - person SergGr; 27.02.2017
comment
Да, это хак, но он работает нормально. Проблема намерения только с Chrome. - person Tas; 28.02.2017
comment
Вы нашли для него правильное решение? - person codepeaker; 17.06.2019