[JAVA] [Android] Implementieren Sie Adblock in WebView

Ich möchte WebView-Anzeigen entfernen

Wenn Sie Javascript deaktivieren, verschwinden die meisten Anzeigen. Wenn Sie jedoch kein Javascript verwenden können, ist dies unpraktisch. Dies ist also ein Memo bei der Implementierung von Adblock. Auf Englisch waren die Materialien geeignet, aber ich konnte die japanische Seite nicht finden.

Referenz

Sie können es implementieren, indem Sie dieser Seite folgen https://www.hidroh.com/2016/05/19/hacking-up-ad-blocker-android/

Liste der Werbehost https://sites.google.com/site/hosts2ch/

Allgemeiner Ablauf

Überschreiben Sie WebViewClient.shouldInterceptRequest (), um festzustellen, ob die Anforderungs-URL auf der Seite der Adserving-Host ist. Wenn es sich um eine Werbung handelt, wird eine leere Antwort zurückgegeben. das ist alles.

Implementierung

Gestalten Sie die Anzeigenhostliste, um die Handhabung zu vereinfachen

Sie können eine Liste der Hosts, die Anzeigen schalten, unter https://sites.google.com/site/hosts2ch/ herunterladen. (Sehr angenehm .. !!) Ich denke, es wird beim Herunterladen so aussehen, also werde ich es so formen, dass es einfach zu handhaben ist.

ja.txt


# hosts2ch - Japanese mobile ad servers hosts file.
# This file is public domain, of course.
#
# file size: 34 kB
# entries: 1279
#
# ---------- last updated: 2019-01-16  ---------- 


127.0.0.1 100234.advision-adnw.jp
127.0.0.1 100291.adnico.jp
127.0.0.1 100602.advision-adnw.jp
127.0.0.1 100651.advision-adnw.jp
127.0.0.1 100800.advision-adnw.jp
127.0.0.1 101623.sprout-ad.com
127.0.0.1 107008.speead.jp
127.0.0.1 150601.fc2rs.com
127.0.0.1 1tmg.info
127.0.0.1 2.chmato.me
・
・
・

Entfernen Sie die Kommentarzeile und die IP-Adressspalte, um sie nur als Host zu verwenden, und benennen Sie die Datei hosts.txt. So ↓

hosts.txt


100234.advision-adnw.jp
100291.adnico.jp
100602.advision-adnw.jp
100651.advision-adnw.jp
100800.advision-adnw.jp
101623.sprout-ad.com
107008.speead.jp
150601.fc2rs.com
1tmg.info
2.chmato.me
・
・
・

Fügen Sie der Projektdatei hosts.txt hinzu

Fügen Sie es dem Assets-Ordner hinzu. Wenn der Assets-Ordner nicht vorhanden ist, erstellen Sie ihn.

スクリーンショット 2019-01-22 15.57.10.png

Implementieren Sie AdBlock

AdBlocker.java


public class AdBlocker {
    private static final String AD_HOSTS_FILE = "hosts.txt";
    private static final Set<String> AD_HOSTS = new HashSet<>();

    public static void init(final Context context) {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                try {
                    loadFromAssets(context);
                } catch (IOException e) {
                    // noop
                }
                return null;
            }
        }.execute();
    }

    @WorkerThread
    private static void loadFromAssets(Context context) throws IOException {
        InputStream stream = context.getAssets().open(AD_HOSTS_FILE);
        BufferedSource buffer = Okio.buffer(Okio.source(stream));
        String line;
        while ((line = buffer.readUtf8Line()) != null) {
            AD_HOSTS.add(line);
        }
        buffer.close();
        stream.close();
    }

    public static boolean isAd(String url) {
        HttpUrl httpUrl = HttpUrl.parse(url);
        return isAdHost(httpUrl != null ? httpUrl.host() : "");
    }

    private static boolean isAdHost(String host) {
        if (TextUtils.isEmpty(host)) {
            return false;
        }
        int index = host.indexOf(".");
        return index >= 0 && (AD_HOSTS.contains(host) ||
                index + 1 < host.length() && isAdHost(host.substring(index + 1)));
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static WebResourceResponse createEmptyResource() {
        return new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes()));
    }
}

Implementieren Sie WebViewClient.shouldInterceptRequest ()

Überschreiben und implementieren Sie die shouldInterceptRequest () -Methode des WebViewClient. Alle von Webview gelesenen Anfragen aus der Quelle werden einmal durch shouldInterceptRequest () geleitet (ich verstehe, dass dies korrekt ist).

MyWebViewClient.java


private Map<String, Boolean> loadedUrls = new HashMap<>();

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@override99 
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        boolean ad;
        if (!loadedUrls.containsKey(url)) {
            ad = AdBlocker.isAd(url);
            loadedUrls.put(url, ad);
        } else {
            ad = mLoadedUrls.get(url);
        }
        return ad ? AdBlocker.createEmptyResource() :
                super.shouldInterceptRequest(view, url);
    }

Anwendung implementieren

Initialisieren Sie AdBlocker in MyApplication, das die Anwendung erbt.

MyApplication.java


public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        AdBlocker.init(this);
    }
}

Vergessen Sie nicht, es zu Android Manifest hinzuzufügen.

AndroidManifest.xml


<application
        android:name="MyApplication"
        ....
        ....
/>

das ist alles

https://www.hidroh.com/2016/05/19/hacking-up-ad-blocker-android/ Fast wie auf dieser Seite gezeigt. Weitere Informationen finden Sie hier.

Recommended Posts

[Android] Implementieren Sie Adblock in WebView
Implementieren Sie CustomView im Code
Hinweise zu Android Studio
Markdown in Rails implementiert
Implementieren Sie die Anwendungsfunktion in Rails
Implementieren von Firebase Cloud Messaging in Android-Apps (2) - Empfangen von Nachrichten in Apps
Implementierung der zweistufigen Authentifizierung in Java
Implementieren Sie die LTI-Authentifizierung in Rails
Implementieren Sie die Standardauthentifizierung in Java
Implementieren Sie eine Kombination aus Mathematik in Java
2 Implementieren Sie eine einfache Syntaxanalyse in Java
Implementieren Sie das Senden von E-Mails in Java
So implementieren Sie eine einzeilige Anzeige von TextView in der Android-Entwicklung
Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java
Implementieren Sie rm -rf in Java.
Implementieren Sie die XML-Signatur in Java
Implementieren Sie einen tabellengesteuerten Test in Java 14
Implementieren Sie das textField-Fokusereignis in JavaFX
Versuchen Sie, Android Hilt in Java zu implementieren
So blenden Sie die Bildlaufleiste in WebView aus
3 Implementieren Sie einen einfachen Interpreter in Java
Versuchen Sie, Yuma in Ruby zu implementieren
Implementieren Sie eine einfache Anmeldefunktion in Rails
Implementieren einer Materialdesignansicht in Kotlin
Fügen Sie "@ SuppressWarnings" automatisch in Android Studio ein
OkHttp3 (GET, POST) in Android Studio
Implementieren Sie den gRPC-Client in Ruby
Implementieren Sie die REST-API mit Spring Boot
Implementieren Sie ein Kontaktformular in Rails
Implementieren Sie die Spring Boot-Anwendung in Gradle
Versuchen Sie, Yuma in Java zu implementieren
Implementieren Sie die CSV-Download-Funktion in Rails
1 Implementieren Sie eine einfache Phrasenanalyse in Java
Implementieren Sie die Welligkeitsdarstellung in Bildern auf Android