image/svg+xml $ $ ing$ ing$ ces$ ces$ Res Res ea ea Res->ea ou ou Res->ou r r ea->r ch ch ea->ch r->ces$ r->ch ch->$ ch->ing$ T T T->ea ou->r

Présentation

Exemple : implantation d'un navigateur

Capture d'écran navigateur
// Code sample from Coursand [http://igm.univ-mlv.fr/~chilowi/], under the Apache 2.0 License

package fr.upem.coursand.navigator;

import android.Manifest;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.ImageView;

import androidx.appcompat.app.AppCompatActivity;

import fr.upem.coursand.R;
import fr.upem.coursand.launcher.ActivityMetadata;

@ActivityMetadata(permissions={Manifest.permission.INTERNET})
public class NavigatorActivity extends AppCompatActivity {

    private WebView webView;
    private EditText urlView;
    private ImageView faviconView;

    static class State {
        String currentUrl = null;
    }

    private State state = new State();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_navigator);
        webView = findViewById(R.id.webView);
        urlView = findViewById(R.id.urlView);
        faviconView = findViewById(R.id.faviconView);
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                urlView.setText(url);
                faviconView.setImageBitmap(favicon);
            }
        });

        // listener to capture enter key to change the displayed URL on the webview
        urlView.setOnKeyListener((v, keyCode, event) -> {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                changeUrl(urlView.getText().toString().trim());
                return true;
            }
            return false;
        });
        // to support configuration changes restart
        if (state.currentUrl != null)
            changeUrl(state.currentUrl);
    }

    protected void changeUrl(String newUrl) {
        state.currentUrl = newUrl;
        webView.loadUrl(newUrl);
    }

    /********
     * Code that follows displays a menu with the settings of WebSettings
     * The WebSettingInfo class and WebSettingsUtils singleton are implemented in this package
     * It relies on standard Java introspection to fetch all the setters of WebSettings
     */

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        for (WebSettingInfo wsi: WebSettingsUtils.INSTANCE.getSettingsInfo())
            menu.add(wsi.getName()).setCheckable(true);
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        WebSettings settings = webView.getSettings();
        int i = 0;
        for (WebSettingInfo wsi: WebSettingsUtils.INSTANCE.getSettingsInfo())
            menu.getItem(i++).setChecked(wsi.get(settings));
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        WebSettings settings = webView.getSettings();
        WebSettingInfo wsi = WebSettingsUtils.INSTANCE.getSettingInfo(item.getTitle().toString());
        if (wsi != null) {
            wsi.set(settings, !wsi.get(settings)); // toggle the boolean
            return true;
        }
        return false;
    }
}

Recette : créer une application Android offline depuis un site web

  1. Créer le site web en utilisant les technologies et frameworks souhaités
    • Ecriture des fichiers HTML, JavaScript, CSS à la main
    • Ou utilisation d'un framework JavaScript tel que Angular, VueJS, React...
  2. Incorporer le répertoire du site web dans les assets de l'application
    • Ajout dans le fichier build.gradle du chemin vers le répertoire racine du site
    • Appeler éventuellement la commande de compilation du site (par exemple ng build pour un site Angular)
  3. Créer une activité ne contenant qu'une WebView comme composant principal
  4. Appeler loadUrl("file:///android_asset/site/index.html") pour charger la page d'accueil du site (si son chemin est site/indexe.html dans les assets)
  5. Possibilité d'exposer des objets Java dans le code JavaScript avec addJavaScriptInterface(Object object, String name)