[JAVA] [Android] Mettre en œuvre Adblock dans WebView

Je souhaite supprimer les publicités WebView

Si vous désactivez javascript, la plupart des publicités disparaîtront, mais si vous ne pouvez pas utiliser javascript, ce n'est pas pratique, c'est donc un mémo lorsque vous implémentez adblock. En anglais, le matériel était approprié, mais je n'ai pas trouvé la page japonaise.

référence

Vous pouvez l'implémenter en suivant cette page https://www.hidroh.com/2016/05/19/hacking-up-ad-blocker-android/

Liste des hébergeurs publicitaires https://sites.google.com/site/hosts2ch/

Flux général

Remplacez WebViewClient.shouldInterceptRequest () pour déterminer si l'URL de la requête de la page est l'hôte de diffusion d'annonces. S'il s'agit d'une publicité, elle renvoie une réponse vide. c'est tout.

la mise en oeuvre

Façonnez la liste des hébergeurs d'annonces pour faciliter sa gestion

Vous pouvez télécharger une liste d'hôtes diffusant des annonces à l'adresse https://sites.google.com/site/hosts2ch/. (Très pratique .. !!) Je pense que cela ressemblera à ceci une fois téléchargé, donc je vais le modeler pour qu'il soit facile à manipuler.

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
・
・
・

Supprimez la ligne de commentaire et la colonne d'adresse IP pour en faire un hôte uniquement et nommez le fichier hosts.txt. Comme ça ↓

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
・
・
・

Ajoutez hosts.txt au fichier de projet

Ajoutez-le au dossier des actifs. Si le dossier des ressources n'existe pas, créez-le.

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

Mettre en œuvre 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()));
    }
}

Implémenter WebViewClient.shouldInterceptRequest ()

Remplacez et implémentez la méthode shouldInterceptRequest () de WebViewClient. Toutes les demandes de la source lues par webview passent par shouldInterceptRequest () une fois (je comprends que c'est correct)

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);
    }

Mettre en œuvre l'application

Initialisez AdBlocker dans MyApplication qui hérite de l'application.

MyApplication.java


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

N'oubliez pas de l'ajouter à Android Manifest.

AndroidManifest.xml


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

c'est tout

https://www.hidroh.com/2016/05/19/hacking-up-ad-blocker-android/ Presque comme indiqué sur cette page, veuillez donc vous reporter ici pour plus de détails.

Recommended Posts

[Android] Mettre en œuvre Adblock dans WebView
Implémenter CustomView dans le code
Remarques sur le studio Android
Markdown implémenté dans Rails
Implémenter la fonction d'application dans Rails
Mettre en œuvre Firebase Cloud Messaging dans les applications Android (2) -Recevoir des messages dans les applications
Implémentation de l'authentification en deux étapes en Java
Implémenter l'authentification LTI dans Rails
Implémenter l'authentification de base en Java
Implémenter une combinaison de mathématiques en Java
2 Implémentez une analyse syntaxique simple en Java
Implémenter l'envoi d'e-mails en Java
Comment implémenter l'affichage sur une seule ligne de TextView dans le développement Android
Implémenter un tri rapide de type fonction en Java
Implémentez rm -rf en Java.
Implémenter la signature XML en Java
Implémenter un test piloté par table dans Java 14
Implémenter l'événement de mise au point de textField dans JavaFX
Essayez d'implémenter Android Hilt en Java
Comment masquer la barre de défilement dans WebView
3 Implémentez un interpréteur simple en Java
Essayez d'implémenter Yuma dans Ruby
Implémenter une fonction de connexion simple dans Rails
Implémentation d'une vue de conception de matériaux dans Kotlin
Insérez automatiquement `@ SuppressWarnings` dans Android Studio
OkHttp3 (GET, POST) dans Android Studio
Implémenter le client gRPC dans Ruby
Implémenter l'API REST avec Spring Boot
Implémenter un formulaire de contact dans Rails
Implémenter l'application Spring Boot dans Gradle
Essayez d'implémenter Yuma en Java
Implémenter la fonction de téléchargement CSV dans Rails
1 Implémentez une analyse de phrase simple en Java
Implémenter la représentation ondulatoire dans les images sur Android