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? p>
3 Réponses :
au moins pour les pages de base, cela devrait être possible. P>
(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. P>
(2) Définissez votre propre webviewClient qui remplace [au moins] OnloadResource (). Ensuite, économisez chaque ressource unique demandée par la page. P>
(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) p>
(4) Écrivez le HTML sur le système de fichiers. P>
J'espère que cela vous aidera. P>
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". P>
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;
}
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
L'application cache est désigné maintenant , et ça ne fonctionne plus dans certains navigateurs.
Écrivez-vous ce que vous voulez?