如何使用ResolveInfo / ComponentName在startActivity中将URL发送到不同的浏览器?

时间:2014-04-08 17:34:58

标签: android android-intent browser android-activity android-package-managers

我正在做一个像浏览器一样的应用程序,但我希望允许用户拨打他的第二个"首选浏览器,带有浏览器中的按钮。

因此,我的应用程序是一个浏览器,我无法调用常见的ACTION_VIEW Intent,如果我这样做,我自己的应用程序将出现在选择器上。

因此,我制作了一个首选项屏幕,允许您设置首选浏览器。要使用可用的浏览器填充ListPreference,我使用类似的东西:

    Uri uri = Uri.parse("http://google.com");
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    List<ResolveInfo> allActivities = ctx.getPackageManager().queryIntentActivities(intent, 0);

循环列表并构建首选项,我在SharedPreferences上存储包名称供以后使用:

    ((ActivityInfo) ri.activityInfo).packageName

当用户点击&#34;打开我首选的浏览器&#34;按钮我像这样调用浏览器活动(我再次通过ResolveInfo循环,因为我不存储像ActivityInfo这样的复杂类型:

Uri uri = Uri.parse("http://google.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
List<ResolveInfo> allActivities = mContext.getPackageManager().queryIntentActivities(intent, 0);
ActivityInfo activity = null;
for (ResolveInfo ri : allActivities) {
    String browserAction = ((ActivityInfo) ri.activityInfo).packageName;
    if (sharedPrefs.getString(Constants.KEY_PREFERRED_BROWSER,"").equals(browserAction)) {
        activity = ri.activityInfo;
        break;
    }

    }
    if (activity != null) {
    Log.e(TAG,finalUrl);
    ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
    Intent i=new Intent(Intent.ACTION_MAIN, Uri.parse(finalUrl)); // TRY 1, set URL on Intent constructor
    i.putExtra(Intent.EXTRA_TEXT,Uri.parse(finalUrl)); // Try 2, put an EXTRA with the URL :P
    i.addCategory(Intent.CATEGORY_LAUNCHER);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    i.setComponent(name);
    i.setData(Uri.parse(finalUrl)); // Try 3, set URL as Intent Data

    startActivity(i);
}

嗯......你可以看到我尝试了很多东西......我正在使用Android默认浏览器,Chrome和Firefox在Genymotion模拟器上进行测试,只有Chrome正在正确加载网址。

您知道如何为每种情况正确设置URL的意图吗?我可以推断出如何操作,例如,当用户在我的首选项屏幕中选择他喜欢的浏览器时?也许更简单的方法? 0: - )

非常感谢。

1 个答案:

答案 0 :(得分:0)

试试这段代码:

Intent intent = getPackageManager().getLaunchIntentForPackage(
            "org.mozilla.firefox");
intent.setData(Uri.parse("www.onliner.by"));
startActivity(intent);

我使用org.mozilla.firefoxcom.android.chrome

进行了检查

修改 看起来这有效:

    Uri uri = Uri.parse("http://www.onliner.by");
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    List<ResolveInfo> allActivities = getPackageManager()
            .queryIntentActivities(intent, 0);
    ActivityInfo activity = null;
    for (ResolveInfo ri : allActivities) {
        String browserAction = ((ActivityInfo) ri.activityInfo).packageName;
        if ("com.android.chrome".equals(browserAction)) {
            activity = ri.activityInfo;
            break;
        }

    }
    if (activity != null) {
        ComponentName name = new ComponentName(
                activity.applicationInfo.packageName, activity.name);
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setComponent(name);
        i.setData(uri);

        startActivity(i);
    }

但是,只有在“www.onliner.by”之前添加“http://”。