Android 在 Mozilla Firefox 应用程序中打开 link 当前打开的选项卡

Android open link in Mozilla Firefox app in the current open tab

我有一个非常具体的要求:我需要在浏览器中打开一个 URL link(而不是在 WebView 中),我需要它在当前打开打开选项卡,即打开的页面应该是“redirect”(意思是在同一个选项卡中)。

根据多个SO帖子的共识(见下文),实现方式如下:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, packageName);
startActivity(intent);

具体来说是 Browser.EXTRA_APPLICATION_ID 指示浏览器在同一个选项卡中打开 link:

理论上,这应该适用于所有浏览器。

Here it is important to note that packageName above needs to be the package name of the BROWSER that one wishes to open (e.g. com.android.chrome or org.mozilla.firefox), not the package name of your app.

Even though the documentation asks that you use the package name of your own app, it doesn't open the link in the currently open tab if you use the package name of your own app. Both Chrome & Firefox will open the link in a new tab.

所以让这个工作的技巧是将 packageName 设置为 com.android.chrome,瞧,Chrome 在当前打开的选项卡中打开 link。 耶!

同样的技巧不适用于 Firefox。

我怎样才能使它在 any/all 浏览器上正常工作?

显然这是 Firefox 的一个已知问题:

AFirefox doesn't handle the flag Browser.EXTRA_APPLICATION_ID from an Intent.

BAndroid Mozilla FireFox not opening page in a new tab.

这个错误已经修复了吗?有没有一种已知的方法可以让 Firefox 在同一选项卡中打开 link?

我怎样才能让 any/all 浏览器工作?

参考文献:

1Is there any way in Android to force open a link to open in Chrome?.

2Android open browser from service avoiding multiple tabs.

3Open an url in android browser, avoid multiple tabs.

4Opening url in the last open tab in chrome.

5Open url in same tab in browser using android code(not using webview).

6Android app opening browser in the same tab?.

7Browser.EXTRA_APPLICATION_ID not working in ICS.

8How to Stop Multiple Tabs Opened in Browser.

9How to Avoid Loading Local Page in New Tab on Default Android Browser.

10Handle tab queues with Browser.EXTRA_APPLICATION_ID.

11Allow loading URI Intents.

好像不支持; AndroidManifest.xml 显示 intent-filter ... 并且 newTab = session == nullnewTab = true 是硬编码的。除非将其作为功能请求提交 - 或最终的 PR,从而使它能够被合并,否则这不会发生(即使那样,它也只会在更高版本中得到支持)。

对于 firefox,通过将组件设置为 intent 来尝试以下解决方法。

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
 intent.setComponent(new ComponentName("org.mozilla.firefox","org.mozilla.firefox.App"));
 this.startActivity(intent);

Firefox 似乎已经很好地解决了这个问题。

Intent intent = new Intent();
intent.setPackage("org.mozilla.firefox");
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(link));
intent.putExtra(Browser.EXTRA_APPLICATION_ID, "MySpecialTab");

请注意,使用 setPackagesetComponent 更好,因为 Mozilla 已经随着时间的推移更改了实际的 activity 名称。 EXTRA_APPLICATION_ID 不是这样的东西。如果您想为许多链接重复使用两个选项卡,请将一个标签称为“有趣”,将另一个标签称为“无聊”。