76

我目前正在测试一个使用大量 jQuery 动画开发的网络应用程序,我们注意到内置网络浏览器的性能非常差。在 Chrome 中进行测试时,Web 应用程序的性能快得令人难以置信。我只是想知道是否有任何类型的脚本会强制在 Chrome for Android 中打开链接,类似于它在 iOS 中的操作方式。

4

10 回答 10

85

实现这一点的更优雅的方法是照常使用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 设备:

以防万一您想打开亚马逊默认浏览器以防亚马逊 Kindle 中未安装 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 and open Kindle Browser
    intent.setPackage("com.amazon.cloud9");
    context.startActivity(intent);
}
于 2015-01-05T13:02:35.037 回答
53

有两种解决方案。

按包装

    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
    }
于 2012-08-17T22:01:57.823 回答
9

所有提出的解决方案都不再适合我了。感谢@pixelbandito,他为我指明了正确的方向。我在 chrome 源代码中找到了下一个常量

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);
    }
}
于 2015-12-28T10:29:00.953 回答
8

这适用于FirefoxOpera

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

于 2016-08-15T15:46:04.160 回答
4

上面的不同答案很好,但没有一个是完整的。这最适合我,它将:

尝试打开 chrome 网络浏览器,如果出现异常(chrome 不是默认或未安装),将要求用户选择浏览器:

String uriString = "your uri string";

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"));
}
于 2019-05-06T21:14:39.127 回答
3

这是我找到的最接近的:编写一个 url 并替换httpgooglechrome将打开 Chrome,但它似乎没有打开指定的 url。我正在使用三星 Galaxy S5,Android 5.0

这是我发现的最好的——我在 SO 上看到的所有其他解决方案都需要 Android 应用程序,而不是 web 应用程序。

于 2015-06-22T17:00:32.827 回答
2

跟进@philippe_b 的回答,我想补充一点,如果未安装 Chrome,此代码将不起作用。还有另一种情况它不起作用 - 即没有选择 Chrome 作为默认浏览器(但已安装)或者即使没有选择浏览器作为默认浏览器。

在这种情况下,还要添加以下代码的 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);
}

于 2014-11-17T07:34:53.280 回答
2

这是一种更通用的方法 - 它首先找出默认浏览器的包名称,它处理“http://” URL,然后使用其他答案中提到的方法在浏览器中显式打开 URL:

    public void openUrlInBrowser(Context context, String url) {
        // Find out package name of default browser
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://"));
        ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);
        String packageName = resolveInfo.activityInfo.packageName;

        // Use the explicit browser package name
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        i.setPackage(packageName);
        context.startActivity(i);
    }
于 2019-11-27T20:16:24.467 回答
2

Android 使用 Java 在 chrome 中打开一个链接:

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("your url link"));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setPackage("com.android.chrome");
try {
    context.startActivity(i);
} catch (ActivityNotFoundException e) {
 Toast.makeText(context, "unable to open chrome", Toast.LENGTH_SHORT).show();
 i.setPackage(null);
 context.startActivity(i);
}

Android 使用 Kotlin 在 chrome 中打开一个链接:

val i = Intent(Intent.ACTION_VIEW, Uri.parse("https://stackoverflow.com/"))
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
i.setPackage("com.android.chrome")
try {
  context!!.startActivity(i)
} catch (e: ActivityNotFoundException) {
  Toast.makeText(context, "unable to open chrome", Toast.LENGTH_SHORT).show()
  i.setPackage(null)
  context!!.startActivity(i)
}
于 2020-05-03T15:43:17.707 回答
0

在 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()
    }
}
于 2018-12-28T10:19:20.510 回答