Я хочу, чтобы все ссылки в моем приложении открывались с определенным намерением - PullRequest
0 голосов
/ 27 июня 2018

поэтому в своем приложении я создал действие, которое содержит только веб-просмотр, и эта задача-действия запрещает пользователю открывать любые другие ссылки в веб-просмотре, кроме открытой ссылки.

приложение должно использовать только это веб-представление, чтобы открыть все ссылки в приложении.

в настоящее время, когда я открываю любую ссылку в приложении, появляется средство выбора намерений для выбора между другими веб-браузерами и моей деятельностью

как я могу сделать так, чтобы любая ссылка в моем приложении автоматически открывалась в активности веб-просмотра, не предлагая пользователю выбирать между браузерами, так же, как мессенджер Facebook открывает ссылки в нем, он открывает ссылки в операции под названием BrowserLiteActivity под com. facebook.browser.lite.

Мой фильтр намерений

<activity
        android:name=".InternalWebView.InternalWebviewActivity"
        android:label="@string/title_activity_internal_webview"
        android:theme="@style/AppTheme">
        <intent-filter
            android:autoVerify="true"
            android:label="someLabel">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https"/>
            <data android:scheme="http"/>
            <data android:scheme=" "/>
        </intent-filter>
</activity>

Редактировать: чтобы быть более понятным, здесь все, что связано с проблемой

InternalWebViewActivity.java

package com.example.example.InternalWebView;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;

import com.example.example.R;

import java.util.concurrent.TimeUnit;

import butterknife.BindView;
import butterknife.ButterKnife;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

public class InternalWebviewActivity extends AppCompatActivity {

    @BindView(R.id.webview)
    WebView wv;
    private io.reactivex.Observable timer = io.reactivex.Observable.interval(500, TimeUnit.MILLISECONDS);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview_activity);
        ButterKnife.bind(this);
        Intent intent = getIntent();
        final String data = intent.getData().toString();
        InternalWebViewClient internalWebViewClient = new InternalWebViewClient(data);

        wv.getSettings().setJavaScriptEnabled(true);
        wv.setWebViewClient(internalWebViewClient);
        this.timer
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe((mSec) -> {
                        String wvURL = wv.getUrl();
                        if (!wvURL.contains(internalWebViewClient.url))
                            wv.loadUrl(data);
                });


        wv.loadUrl(data);
    }
}

InternalWebClient.java

package com.example.example.InternalWebView;

import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.net.MalformedURLException;
import java.net.URL;

public class InternalWebViewClient extends WebViewClient {
    public String url;
    public InternalWebViewClient(String url){
        URL u = null;
        try {
            u = new URL(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        this.url = url.substring(url.indexOf(u.getHost()));
        this.url = this.url.substring(this.url.indexOf(".")+1);

    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if(url.contains(this.url)){
            view.loadUrl(url);
        }
        return true;
    }
}

просто чтобы понять, как выглядит Активность

webview_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/webview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

Примечание: Facebook Messenger не требует изменения схемы для открытия ссылок в своей активности.

1 Ответ

0 голосов
/ 29 июня 2018

ОБНОВЛЕНИЕ: Этот ответ недостаточно удовлетворителен, если вы не хотите менять схему, как в моем случае сейчас.

Так как @NSimon упоминал в комментариях к вопросу, его решение работало нормально

Вот примерная ссылка, которая отправляется в приложение через API: "пример: //www.stackoverflow.com"

Вот код:

часть активности в AndroidManifist.xml

<activity
    android:name=".InternalWebView.InternalWebviewActivity"
    android:label="@string/title_activity_internal_webview"
    android:theme="@style/AppTheme">
    <intent-filter
        android:autoVerify="true"
        android:label="somelable">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="example"/>
     </intent-filter>
</activity>

InternalWebViewActivity.java

package com.example.example.InternalWebView;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;

import com.example.example.R;

import java.util.concurrent.TimeUnit;

import butterknife.BindView;
import butterknife.ButterKnife;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

public class InternalWebviewActivity extends AppCompatActivity {

    @BindView(R.id.webview)
    WebView wv;
    private io.reactivex.Observable timer = io.reactivex.Observable.interval(500, TimeUnit.MILLISECONDS);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview_activity);
        ButterKnife.bind(this);
        Intent intent = getIntent();
        final String data = intent.getData().toString().replace("example://","http://");
        InternalWebViewClient internalWebViewClient = new InternalWebViewClient(data);

        wv.getSettings().setJavaScriptEnabled(true);
        wv.setWebViewClient(internalWebViewClient);

        //lazy and efficient method to handle url changed using javascript only
        this.timer
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe((mSec) -> {
                        String wvURL = wv.getUrl();
                        if (!wvURL.contains(internalWebViewClient.url))
                            wv.loadUrl(data);
                });


        wv.loadUrl(data);
    }
}

InternalWebViewClient.java

package com.example.example.InternalWebView;

import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.net.MalformedURLException;
import java.net.URL;

public class InternalWebViewClient extends WebViewClient {
    public String url;
    public InternalWebViewClient(String url){
        URL u = null;
        try {
            u = new URL(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        //just to ignore stuff like www. being redirected to m. for mobile
        this.url = url.substring(url.indexOf(u.getHost()));
        this.url = this.url.substring(this.url.indexOf(".")+1);

    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if(url.contains(this.url)){
            view.loadUrl(url);
        }
        return true;
    }
}

надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...