it-roy-ru.com

Есть ли в Android способ заставить открыть ссылку в Chrome?

В настоящее время я тестирую веб-приложение, разработанное с использованием множества jQuery-анимаций, и мы заметили очень низкую производительность встроенного веб-браузера. Во время тестирования в Chrome производительность веб-приложения невероятно выше. Мне просто интересно, существует ли какой-либо тип сценария, который бы принудительно открывал ссылку в Chrome для Android, аналогично тому, как это делается в iOS.

52
user1607943

Более элегантный способ добиться этого - использовать намерение Intent.ACTION_VIEW как обычно, но добавить пакет com.Android.chrome в намерение. Это работает независимо от того, является ли Chrome браузером по умолчанию и обеспечивает точно такое же поведение, как если бы пользователь выбрал Chrome из списка выбора.

String urlString = "http://mysuperwebsite";
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(urlString));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setPackage("com.Android.chrome");
try {
    context.startActivity(intent);
} catch (ActivityNotFoundException ex) {
    // Chrome browser presumably not installed so allow user to choose instead
    intent.setPackage(null);
    context.startActivity(intent);
}

Обновление

Для устройств Kindle:

На всякий случай, если вы хотите открыть браузер Amazon Default, если приложение chrome не установлено в Amazon Kindle

String urlString = "http://mysuperwebsite";
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(urlString));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setPackage("com.Android.chrome");
try {
    context.startActivity(intent);
} catch (ActivityNotFoundException ex) {
    // Chrome browser presumably not installed and open Kindle Browser
    intent.setPackage("com.Amazon.cloud9");
    context.startActivity(intent);
}
58
Martin

Есть два решения.

По пакету

    String url = "http://www.example.com";
    Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.setPackage("com.Android.chrome");
    try {
        startActivity(i);
    } catch (ActivityNotFoundException e) {
        // Chrome is probably not installed
        // Try with the default browser
        i.setPackage(null);
        startActivity(i);
    }

По схеме

    String url = "http://www.example.com";
    try {
        Uri uri = Uri.parse("googlechrome://navigate?url=" + url);
        Intent i = new Intent(Intent.ACTION_VIEW, uri);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);
    } catch (ActivityNotFoundException e) {
        // Chrome is probably not installed
    }

ВНИМАНИЕ! Следующая техника не работает на самых последних версиях Android. Это здесь для справки, потому что это решение существует уже некоторое время:

    String url = "http://www.example.com";
    try {
        Intent i = new Intent("Android.intent.action.MAIN");
        i.setComponent(ComponentName.unflattenFromString("com.Android.chrome/com.Android.chrome.Main"));
        i.addCategory("Android.intent.category.LAUNCHER");
        i.setData(Uri.parse(url));
        startActivity(i);
    }
    catch(ActivityNotFoundException e) {
        // Chrome is probably not installed
    }
41
philippe_b

Все предложенные решения больше не работают для меня. Благодаря @pixelbandito он указал мне правильное направление. Я нашел следующую константу в источниках хрома

public static final String GOOGLECHROME_NAVIGATE_PREFIX = "googlechrome://navigate?url=";

И следующее использование:

 Intent intent = new Intent("Android.intent.action.VIEW", Uri.parse("googlechrome://navigate?url=chrome-native://newtab/"));

Таким образом, решение (обратите внимание, что URL не должен быть закодирован)

void openUrlInChrome(String url) {
    try {
        try {
            Uri uri = Uri.parse("googlechrome://navigate?url="+ url);
            Intent i = new Intent(Intent.ACTION_VIEW, uri);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        } catch (ActivityNotFoundException e) {
            Uri uri = Uri.parse(url);
            // Chrome is probably not installed
            // OR not selected as default browser OR if no Browser is selected as default browser
            Intent i = new Intent(Intent.ACTION_VIEW, uri);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        }
    } catch (Exception ex) {
        Timber.e(ex, null);
    }
}
8
httpdispatch

Это работает в Firefox и Опера

document.location = 'googlechrome://navigate?url=www.example.com/';

6
Tim Smith

Следуя ответу @ philippe_b, я хотел бы добавить, что этот код не будет работать, если Chrome не установлен. Есть еще один случай, когда он не будет работать - это случай, когда Chrome НЕ выбран в качестве браузера по умолчанию (но установлен) OR, даже если в качестве браузера по умолчанию не выбран ни один браузер.

В таких случаях добавьте также следующую часть кода catch.

try {
    Intent i = new Intent("Android.intent.action.MAIN");
    i.setComponent(ComponentName.unflattenFromString("com.Android.chrome/com.Android.chrome.Main"));
   i.addCategory("Android.intent.category.LAUNCHER");
    i.setData(Uri.parse("http://mysuperwebsite"));
    startActivity(i);
}
catch(ActivityNotFoundException e) {
// Chrome is probably not installed 
// OR not selected as default browser OR if no Browser is selected as default browser
    Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("somesite.com"));
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);
}

2
user1406716

Вот самое близкое, что я нашел: Написание URL-адреса и замена http на googlechrome откроет Chrome, но, похоже, не откроет указанный URL-адрес. Я работаю с Samsung Galaxy S5, Android 5.0

Это лучшее, что я нашел - для любого другого решения, которое я видел в SO, требовалось приложение для Android, а не веб-приложение.

2
pixelbandito

В Google Play есть большое разнообразие браузерных приложений Chrome с различными функциями.

Так что правильно проверить их все

fun Context.openChrome(url: String, onError: (() -> Unit)? = null) {
    openBrowser("com.Android.chrome", url) {
        openBrowser("com.Android.beta", url) {
            openBrowser("com.Android.dev", url) {
                openBrowser("com.Android.canary", url) {
                    onError?.invoke() ?: openBrowser(null, url)
                }
            }
        }
    }
}

fun Context.openBrowser(packageName: String?, url: String, onError: (() -> Unit)? = null) {
    try {
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
            setPackage(packageName)
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        })
    } catch (e: ActivityNotFoundException) {
        onError?.invoke()
    }
}
0
V. Kalyuzhnyu

Разные ответы выше хороши, но ни один не полон. Все это подходит мне лучше всего, что будет:

попробуйте открыть веб-браузер Chrome, и в случае возникновения исключительной ситуации (Chrome не установлен по умолчанию или не установлен), запросит выбор браузера у пользователя

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uriString));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                intent.setPackage("com.Android.chrome");
                try {
                    Log.d(TAG, "onClick: inTryBrowser");
                    startActivity(intent);
                } catch (ActivityNotFoundException ex) {
                    Log.e(TAG, "onClick: in inCatchBrowser", ex );
                    intent.setPackage(null);
                    startActivity(intent.createChooser(intent, "Select Browser"));
                }
0
Tushar Seth