Android在不指定URL的情况下启动浏览器

Android在不指定URL的情况下启动浏览器,android,android-intent,Android,Android Intent,在不指定url的情况下,如何从活动启动浏览器。我想打开浏览器,以便用户可以继续浏览而不更改他们所在的页面 解决方案: 下面的答案是正确的和有效的,但为了让未来的读者更具体地了解,以下是工作代码: Intent i = new Intent(); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_LAUNCHER); i.setAction("com.android.browser"); ComponentName com

在不指定url的情况下,如何从活动启动浏览器。我想打开浏览器,以便用户可以继续浏览而不更改他们所在的页面

解决方案: 下面的答案是正确的和有效的,但为了让未来的读者更具体地了解,以下是工作代码:

Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setAction("com.android.browser");
ComponentName comp = new ComponentName("com.android.browser", "com.android.browser.BrowserActivity");
i.setComponent(comp);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
谢谢

用于设置浏览器的包和类名。然后启动该活动。

如果该活动(组件名称(“com.android.browser”、“com.android.browser.browser.BrowserActivity”)在将来发生更改,您可以尝试以下代码:

public static ComponentName getDefaultBrowserComponent(Context context) {
    Intent i = new Intent()
        .setAction(Intent.ACTION_VIEW)
        .setData(new Uri.Builder()
                .scheme("http")
                .authority("x.y.z")
                .appendQueryParameter("q", "x")
                .build()
                );
    PackageManager pm = context.getPackageManager();
    ResolveInfo default_ri = pm.resolveActivity(i, 0); // may be a chooser
    ResolveInfo browser_ri = null;
    List<ResolveInfo> rList = pm.queryIntentActivities(i, 0);
    for (ResolveInfo ri : rList) {
        if (ri.activityInfo.packageName.equals(default_ri.activityInfo.packageName)
         && ri.activityInfo.name.equals(default_ri.activityInfo.name)
        ) {
            return ri2cn(default_ri);
        } else if ("com.android.browser".equals(ri.activityInfo.packageName)) {
            browser_ri = ri;
        }
    }
    if (browser_ri != null) {
        return ri2cn(browser_ri);
    } else if (rList.size() > 0) {
        return ri2cn(rList.get(0));
    } else if (default_ri == null) {
        return null;
    } else {
        return ri2cn(default_ri);
    }
}
private static ComponentName ri2cn(ResolveInfo ri) {
    return new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name);
}
公共静态组件名getDefaultBrowserComponent(上下文){
意向i=新意向()
.setAction(Intent.ACTION\u视图)
.setData(新的Uri.Builder()
.scheme(“http”)
.当局(“x.y.z”)
附录q参数(“q”、“x”)
.build()
);
PackageManager pm=context.getPackageManager();
ResolveInfo default_ri=pm.resolveActivity(i,0);//可能是选择器
ResolveInfo浏览器_ri=null;
列表rList=pm.querytentActivities(i,0);
用于(ResolveInfo ri:rList){
if(ri.activityInfo.packageName.equals)(默认值为i.activityInfo.packageName)
&&ri.activityInfo.name.equals(默认值_ri.activityInfo.name)
) {
返回ri2cn(默认值);
}else if(“com.android.browser”.equals(ri.activityInfo.packageName)){
浏览器_ri=ri;
}
}
如果(浏览器_ri!=null){
返回ri2cn(浏览器\ ri);
}else if(rList.size()>0){
返回ri2cn(rList.get(0));
}else if(默认值_ri==null){
返回null;
}否则{
返回ri2cn(默认值);
}
}
私有静态组件名ri2cn(ResolveInfo ri){
返回新组件名称(ri.activityInfo.packageName,ri.activityInfo.name);
}

基本上,这里我构造了一个意图来查看一个虚拟http页面,获取可能处理该意图的活动列表,将其与resolveActivity()返回的默认处理程序进行比较,然后返回一些内容。我不需要检查是否有launcher主操作(我的代码使用VIEW操作),但您可能应该这样做。

这个答案可能会有所帮助。从


浏览器的软件包为com.android.browser,其活动为BrowserActivity。然而,我不确定这是否会在您的应用程序中起作用。如果您这样设置组件,那么我认为运行时将只搜索您的活动(清单、类路径)中的BrowserActivity,当然不会找到它。如果url字符串中没有提供http,该怎么办?
PackageManager pm = getPackageManager();
Intent queryIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
ActivityInfo af = queryIntent.resolveActivityInfo(pm, 0);
Intent launchIntent = new Intent(Intent.ACTION_MAIN);
launchIntent.setClassName(af.packageName, af.name);
startActivity(launchIntent);