在安卓系统中有没有什么方法可以强制在 Chrome 中打开一个链接?

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

121122 次浏览

有两种解决方案。

打包的

    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
}

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

实现这一点的一种更优雅的方法是像往常一样使用 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

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

这是我发现的最接近的一个: 编写一个 url 并用 googlechrome替换 http将打开 Chrome,但似乎不会打开指定的 url。我用的是三星Galaxy S5安卓5.0

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

所有提出的解决方案都不再适合我了。多亏了@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);
}
}

这在 火狐歌剧中起作用

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

在谷歌游戏中,有很多不同功能的 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()
}
}

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

尝试打开 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"));
}

这里有一个更通用的方法——它首先找出默认浏览器的包名,处理“ 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);
}

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

分类 _ 应用程序 _ 浏览器的文档中受到启发,以下内容对我很有用:

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