在Android中有没有一种方法可以强制打开链接并在Chrome中打开?

83

我目前正在测试一个带有大量jQuery动画的Web应用程序,我们已经注意到内置Web浏览器的性能非常差。 在Chrome中进行测试时,Web应用程序的性能惊人地更快。 我只是想知道是否有任何类型的脚本可以强制在Android Chrome中打开链接,类似于在iOS中执行的方式。


11
如果设备上没有安装Chrome怎么办? - Cat
@Eric 你可能想要查看这个 - Maveňツ
12个回答

90

更为优雅的方法是使用 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);
}

顺便提一下,要在 Kindle 上执行此操作并强制 Silk 打开(而不是让用户选择“商店亚马逊”选项),请使用以下代码:intent.setPackage("com.amazon.cloud9"); - markdwhite
@markdwhite 在我的kindle设备中,我都有这两个应用程序,而这段代码可以完美地打开Chrome浏览器。 - Maveňツ
@markdwhite SO适用于提问者和像我这样的未来读者 :-) #soReadyToHelp - Maveňツ
如果URL字符串中没有提供http,该怎么办? - IgorGanapolsky
2
@ddor254 这不是 JavaScript。从你的描述听起来,你在一个网页中有一个链接,想要强制它在 Chrome 中打开,即使用户正在使用其他浏览器查看网页。这是不可能的。 - Martin
显示剩余5条评论

58

有两个解决方案。

通过包

    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
    }

嗨,感谢您提供这段代码。是否可以使用特定选项启动Chrome?例如,我想以全屏模式启动它? - user826955
2
请务必将其包装在 try{} 中 - 我刚在一部没有安装 Chrome 的手机上进行了测试,显式意图导致应用程序崩溃。 - Someone Somewhere
1
即使已安装Chrome,此程序仍不会打开它。它总是进入catch。 - Alireza Ahmadi
@httpdispatch 感谢您的反馈。没错,对我来说也不再起作用了。我刚刚更新了答案。 - philippe_b
@philippe_b 包解决方案在 Android 5.1 上无法工作。 - Eugene Popovich
显示剩余8条评论

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);
    }
}

从Android 11开始不再工作。 - Daniel Vygolov

9

这个方法可以在FirefoxOpera浏览器中使用。

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

(直接复制)


从Android 11开始不再工作。 - Daniel Vygolov

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"));
}

1
如果您遇到有关TAG常量的错误,请将以下代码添加到活动中。private static final String TAG = "MainActivity"; - Favourite Videos

3
这是我找到的最接近的方法:在输入网址时,将http替换为googlechrome可以打开Chrome浏览器,但似乎无法打开指定的网址。我使用三星Galaxy S5,Android 5.0系统。这是我找到的最佳解决方案 - 我在SO上看到的其他解决方案都需要一个安卓应用程序,而不是一个Web应用程序。

1
感谢您提供正确的方向。请查看我的回答,其基于您在 https://dev59.com/kmct5IYBdhLWcg3wjd-H#34491791 上发现的内容。 - Eugene Popovich

3
使用Java在Android中打开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);
}

使用Kotlin在Android中打开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)
}

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);
}


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);
    }

0

以下是我使用的方法,灵感来自CATEGORY_APP_BROWSER的文档:

Uri uri = Uri.parse("https://www.wonderpush.com");
Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_BROWSER);
intent.setData(uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
    context.startActivity(intent);
} catch (ActivityNotFoundException e) {
    Logging.loge("No activity for intent " + intent, e);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接