如何使用 gecko 获取当前页面 URL?

How to get current page URL with gecko?

我试图让我的 android 网络浏览器只打开特定的 url。因此,我想检查 loaded url 是否满足要求,并根据它做一些事情。我看到了很多关于 WebView 的答案,但由于我必须使用开源浏览器 (Mozilla Firefox),所以我使用的是 gecko。这是我的代码,我试图用 onLoadRequest 做一些事情,但我不知道如何让它工作。谢谢

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    GeckoView view = findViewById(R.id.geckoView);
    GeckoSession session = new GeckoSession();
    GeckoRuntime runtime = GeckoRuntime.create(this);

    session.open(runtime);
    view.setSession(session);
    session.loadUri("https://www.google.com");

    GeckoSession.NavigationDelegate.LoadRequest loadRequest=new GeckoSession.NavigationDelegate.LoadRequest();

   session.getNavigationDelegate().onLoadRequest(session,loadRequest);


}

@Override
public void onLoadRequest(GeckoSession session, GeckoSession.NavigationDelegate.LoadRequest request)
{
    if(request.uri.contains("mail"))
        GeckoResult.fromValue(AllowOrDeny.ALLOW);
    else
        GeckoResult.fromValue(AllowOrDeny.DENY);
}

GeckoView 严重依赖其委托来允许对大多数相关机制和事件进行特定于应用程序的处理。

简而言之,有运行时和会话委托,分别在GeckoRuntime and GeckoSession设置。 一般模式是,对于每个委托,都有一个 set{DelegateName}Delegate() 方法将委托附加到运行时或会话,但有一个例外是 RuntimeTelemetry.Delegate which is set in GeckoRuntimeSettings

委托方法由 GeckoView 调用,不应由应用程序调用。

在您的情况下,您想实施 NavigationDelegate 并在 GeckoSession 上设置您的实施以覆盖默认的顶级页面加载行为。

class MyNavigationDelegate implements GeckoSession.NavigationDelegate {
    @Override
    public GeckoResult<AllowOrDeny> onLoadRequest(
            final GeckoSession session,
            final LoadRequest request) {
        // TODO: deny/allow based on your constrains.
    }

    // TODO: You should implement the rest of the delegate to handle page load
    // errors and new session requests triggered by new-tab/window requests.
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    GeckoView view = findViewById(R.id.geckoView);
    GeckoSession session = new GeckoSession();
    GeckoRuntime runtime = GeckoRuntime.create(this);

    session.setNavigationDelegate(new MyNavigationDelegate());

    session.open(runtime);
    view.setSession(session);
    session.loadUri("https://www.google.com");
}

有关详细信息,请参阅 API reference and the GeckoView Example 实施。