Как получить URL текущей страницы с помощью геккона? - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь заставить мой android веб-браузер открывать только указанные c URL-адреса. Из-за этого я хочу проверить, соответствует ли загруженный 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);
}

1 Ответ

0 голосов
/ 20 января 2020

GeckoView в значительной степени полагается на своих делегатов, чтобы обеспечить специфичную для приложения обработку c большинства соответствующих механизмов и событий.

Короче говоря, существуют делегаты времени выполнения и сеанса, установленные на GeckoRuntime и GeckoSession соответственно. Общая схема такова, что для каждого делегата есть метод set{DelegateName}Delegate() для присоединения делегатов к среде выполнения или сеансу с одним исключением, равным RuntimeTelemetry.Delegate, которое устанавливается вместо 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 и к примеру GeckoView .

...