Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当使用ResolveInfo/ComponentName启动Tactivity时,如何将URL发送到不同的浏览器?_Android_Android Intent_Browser_Android Activity_Android Package Managers - Fatal编程技术网

Android 当使用ResolveInfo/ComponentName启动Tactivity时,如何将URL发送到不同的浏览器?

Android 当使用ResolveInfo/ComponentName启动Tactivity时,如何将URL发送到不同的浏览器?,android,android-intent,browser,android-activity,android-package-managers,Android,Android Intent,Browser,Android Activity,Android Package Managers,我正在开发一款类似于浏览器的应用程序,但我想允许用户通过我的浏览器中的按钮调用第二个首选浏览器 正因为如此,我的应用程序是一个浏览器,我不能调用通用操作视图意图,如果我这样做了,我自己的应用程序将显示在选择器上 因此,我制作了一个“首选项”屏幕,允许您设置首选浏览器。要使用可用的浏览器填充ListPreference,我会使用以下内容: Uri uri = Uri.parse("http://google.com"); Intent intent = new Intent(Int

我正在开发一款类似于浏览器的应用程序,但我想允许用户通过我的浏览器中的按钮调用第二个首选浏览器

正因为如此,我的应用程序是一个浏览器,我不能调用通用操作视图意图,如果我这样做了,我自己的应用程序将显示在选择器上

因此,我制作了一个“首选项”屏幕,允许您设置首选浏览器。要使用可用的浏览器填充ListPreference,我会使用以下内容:

    Uri uri = Uri.parse("http://google.com");
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    List<ResolveInfo> allActivities = ctx.getPackageManager().queryIntentActivities(intent, 0);
当用户点击open my preferred browser(打开我的首选浏览器)按钮时,我会像这样调用浏览器活动,我会通过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

您知道如何为每种情况将URL设置为正确的意图吗?例如,当用户在“我的首选项”屏幕中选择其首选浏览器时,我能否推断出该如何操作?也许是更简单的方法?0:-

非常感谢。

请尝试以下代码:

Intent intent = getPackageManager().getLaunchIntentForPackage(
            "org.mozilla.firefox");
intent.setData(Uri.parse("www.onliner.by"));
startActivity(intent);
我用org.mozilla.firefox和com.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://。。。我注意到,如果我从多任务中删除Firefox,URL就会被加载。但是,如果我从Firefox返回浏览器并再次点击该按钮,则即使我之前关闭了相应的选项卡,URL也不会重新加载。此外,如果我在浏览器上加载另一个URL并点击首选浏览器按钮,则不会加载该URL。这次尝试在设备上使用Firefox,有什么想法吗看起来问题在于我使用的是启动意图。如果它已经启动,那么它就不能工作。我认为您可以尝试使用TaskStackBuilder将浏览器活动添加到当前任务后堆栈中。我没有试过,也不知道这是否可行。@rubdottocom我已经更新了答案。使用Chrome和Firefox在Genymotion emulator上进行了测试。它工作得很好,我发现我的实现的主要问题是将URL设置为数据或作为一个额外参数,而在Intent构造函数上将其设置为第二个参数就足以使其工作。非常感谢你。
    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);
    }