9
votes

Enregistrer le contenu webview pour la navigation hors connexion?

Je voudrais implémenter une application permettant aux utilisateurs de sauver la WebPage comprenant des images. Ensuite, les utilisateurs peuvent afficher à nouveau la page Web. Même il n'y a pas d'accès au réseau. Cependant, j'ai trouvé qu'il n'y avait pas une telle API connexe à le faire. Est-ce que quelqu'un a une idée ou une expérience? Quelqu'un peut-il donner une idée ou une liaison de code source?


1 commentaires

Écrivez-vous ce que vous voulez?


3 Réponses :


8
votes

au moins pour les pages de base, cela devrait être possible.

(1) Téléchargez le fichier HTML au lieu de le charger directement dans la vision Web. Ensuite, utilisez webview.loaddata () ou webview.loaddawithbaseURL () pour charger la page dans la vue. Ne détenez pas le HTML, vous en aurez besoin plus tard.

(2) Définissez votre propre webviewClient qui remplace [au moins] OnloadResource (). Ensuite, économisez chaque ressource unique demandée par la page.

(3) Vous avez maintenant stocké HTML et tous les fichiers nécessaires sur le système de fichiers. Recherchez via le HTML pour les chemins absolus, vous souhaiterez les mettre à jour avec une fonction de remplacement afin qu'ils soient des chemins relatifs (et fonctionneront sur le système de fichiers) ou des chemins absolus à l'endroit où vous avez sauvegardé les images / CSS / etc. (sur le système de fichiers)

(4) Écrivez le HTML sur le système de fichiers.

J'espère que cela vous aidera.

Alternativement, vous pouvez probablement enregistrer la page comme une image, prenant essentiellement une capture d'écran de WEBVIEW. Cela ne permettrait pas de copier / coller ou de cliquer sur des liens, mais ce serait beaucoup plus simple si tout ce que vous avez besoin est "Visualisez-le plus tard".


0 commentaires

1
votes

Vous pouvez utiliser sauvegardewebRarchive code>. Si vous souhaitez également enregistrer les ressources qui sont référées sur la page via URL, telles que des images, vous devez remplacer OnloaderResource () code>.

static WebView getWebView(Activity activity, int id, String url) {
    WebView w1 = activity.findViewById(id);
    WebSettings wSettings = w1.getSettings();
    wSettings.setJavaScriptEnabled(true);
    wSettings.setAllowFileAccess(true);
    wSettings.setAppCacheEnabled(true);
    wSettings.setAppCachePath(activity.getBaseContext().getCacheDir().getAbsolutePath());
    wSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    wSettings.setSavePassword(true);
    wSettings.setSaveFormData(true);
    wSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    wSettings.setUserAgentString("Android");
    w1.setWebViewClient(new WebViewClient() {
        boolean err;

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        }

        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            view.setVisibility(View.GONE);
            err = true;
        }

        public void onPageFinished(WebView view, String url) {
//                super.onPageFinished(view, url);
            if (!err) {
                if (!url.endsWith(".mht")) {
                    File f = getFileFromUrl(url);
                    view.saveWebArchive(f.getAbsolutePath());
                }
                view.setVisibility(VISIBLE);
            }
        }

        @Override
        public void onLoadResource(WebView view, String url) {
            File f = getFileFromUrl(url);
            if(f.exists()) url = "file:///" + f.getAbsolutePath();
            else {
                new Thread(()->{

                }).start();
            }
            super.onLoadResource(view, url);
        }
    });
    w1.setWebChromeClient(new WebChromeClient());
    File f = getFileFromUrl(url);
    if (f.exists() && f.lastModified() > new Date().getTime() - 5 * 24 * 3600000) w1.loadUrl("file:///" + f.getAbsolutePath());
    else w1.loadUrl(url);
    return w1;
}


0 commentaires

0
votes

Ajout d'une autre réponse car l'approche est fondamentalement différente.

Cette réponse n'est applicable que si vous souhaitez contrôler le site Web que vous essayez de vous connecter. p>

Vous pouvez utiliser le cache d'application comme décrit dans Ce message A >. P>

Modifiez votre code comme suit P>

CACHE MANIFEST
index.html
stylesheet.css
images/logo.png
scripts/main.js
http://cdn.example.com/scripts/main.js


1 commentaires

L'application cache est désigné maintenant , et ça ne fonctionne plus dans certains navigateurs.