Android中有什么方法可以强制打开要在Chrome中打开的链接?


69

我目前正在测试使用许多jQuery动画开发的Web应用程序,我们注意到内置Web浏览器的性能确实很差。在Chrome中进行测试时,webapp的性能令人难以置信地更快。我只是想知道是否有任何类型的脚本会强制在Android版Chrome浏览器中打开链接,就像在iOS中那样。


10
如果设备上未安装Chrome怎么办?
埃里克(Eric)

@Eric你可能想检查
行家ツ

Answers:


76

实现此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 Kindle中安装chrome应用程序的情况下打开Amazon Default Browser,以防万一

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

FWIW,要在Kindle上执行此操作并强制Silk打开(而不是让用户选择Shop Amazon),请使用:intent.setPackage(“ com.amazon.cloud9”);
markdwhite

@markdwhite在我的kindle设备中,我同时拥有了这两个代码,这段代码完美地打开了chrome 。
行家ツ

@MaňishYadav-您错过了重点。如果未安装Chrome,并且如果希望采取的措施是强制打开Silk浏览器,请使用我的建议(如果有人最终需要在没有Chrome的情况下打开Silk,则添加了我的建议)
markdwhite'1

@markdwhite如果任何类型的设备中都有一个浏览器(无论是android还是kindle),则此代码将打开该浏览器。这是什么问题?显然,intent应完成的任务。
行家ツ

1
@ ddor254这不是javascript。听起来,您在网页中有一个链接,并且即使用户正在使用其他浏览器查看网页,也要强制其在Chrome中打开。这是不可能的。
马丁

49

有两种解决方案。

按包装

    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
    }

phillippe_b,感谢您的代码。有什么建议在哪里放置此代码?我对某些语法不熟悉。这是要放在日食中吗?
user1607943 2012年

这是一些Java代码,应该会出现在Android本机应用程序中。此应用程序只能启动Chrome。虽然这很简单,但我承认如果您对Android应用程序一无所知,那将有些乏味:如何编写代码,如何部署它们……
philippe_b 2012年

嗨,谢谢你的这段代码。是否可以使用特定选项启动chrome?例如,我要以全屏模式启动它吗?
user826955 2013年

2
请务必使用try{}-我刚在没有安装Chrome的手机上进行了测试,并且明确意图使该应用程序崩溃了
Somewhere Somewhere 2014年

1
即使安装了chrome,它也不会打开chrome。它总是会抓住的
Alireza A. Ahmadi 2015年

8

所有提出的解决方案对我来说都不再有效。感谢@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/"));

所以解决方法是(请注意,网址不应编码)

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

这适用于FirefoxOpera

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


3

这是我找到的最接近的内容:编写一个URL并替换httpgooglechrome会打开Chrome,但似乎没有打开指定的URL。我正在使用Android 5.0的Samsung Galaxy S5

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


1
谢谢您的正确指导。请根据您找到的stackoverflow.com/a/34491791/527759
尤金·波波维奇

3

上面的不同答案是好的,但没有一个是完整的。总而言之,这最适合我:

尝试打开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";
最喜欢的视频

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

1

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

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()
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.