Plugins Android

Cette section fournit des détails pour savoir comment implémenter le code du plugin native sur la plateforme Android. Avant de lire ceci, voir Application Plugins pour avoir un aperçu de la structure du plugin et son interface commune de JavaScript. Cette section continue de démontrer l'échantillon écho plugin qui communique de la webview Cordova à la plate-forme native et le dos. Pour un autre exemple, voir aussi les commentaires à CordovaPlugin.java.

Plugins Android sont basés sur Android-Cordova, qui consiste en une WebView Android avec crochets attachés à elle. Plugins sont représentés comme des mappages de classe dans le config.xml fichier. Un plugin est composé d'au moins une classe Java qui étend la CordovaPlugin classe, de la substitution de l'un de ses execute méthodes. Aussi pratique, le plugin devrait également réaliser au mieux [pause](../../../cordova/events/events.pause.html) et [resume](../../../cordova/events/events.resume.html) des événements, ainsi que tout message transitant entre les plugins. Plugins avec longues requêtes, activité de fond telles que la lecture du média, auditeurs ou état interne doit mettre en œuvre la onReset() méthode aussi bien. Il exécute quand le WebView navigue vers une nouvelle page ou des actualisations, qui recharge le JavaScript.

Classe plugin cartographie

Interface JavaScript du plugin utilise la cordova.exec méthode comme suit :

    exec (< successFunction >, < failFunction >, < service >, < action >, [< args >]) ;

Cela marshale une demande de la WebView vers le côté natif Android, effectivement l'appel la action méthode sur la service classe, avec des arguments supplémentaires passés dans le args tableau.

Si vous distribuez un plugin sous Java fichier ou un fichier jar de ses propres, le plugin doit être spécifié dans votre application Android-Cordova res/xml/config.xml fichier. Voir Application Plugins pour plus d'informations sur la façon d'utiliser le plugin.xml fichier à injecter ce feature élément :

    <feature name="<service_name>">
        <param name="android-package" value="<full_name_including_namespace>" />
    </feature>

Le nom de service correspond à celle utilisée dans le code JavaScript exec appeler. La valeur est identificateur d'espace de noms complet de la classe Java. Dans le cas contraire, le plugin peut compiler mais toujours être indisponible à Cordova.

Durée de vie et initialisation du Plugin

Une seule instance d'un objet plugin est créée pour la vie de chaque WebView . Plugins ne sont pas instanciés jusqu'à ce qu'ils sont tout d'abord référencées par un appel de JavaScript, à moins que <param> avec un onload name attribut a la valeur "true" dans config.xml . Par exemple :

<feature name="Echo">
    <param name="android-package" value="<full_name_including_namespace>" />
    <param name="onload" value="true" />
</feature>

Plugins devraient utiliser la initialize méthode pour leur logique de démarrage.

@Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
    super.initialize(cordova, webView);
    // your init code here
}

Écriture d'un Plugin Java Android

Une demande de plugin pour le côté natif déclenche un appel JavaScript et le plugin Java correspondant est mappé correctement en le config.xml fichier, mais en quoi le dernier Android Plugin Java classe ressemble ? Tout ce qui est dépêché sur le plugin avec du JavaScript exec fonction est passée dans la classe plugin execute méthode. La plupart execute implémentations ressemblent à ceci :

    @Override public boolean exécuter (cordes, args JSONArray, CallbackContext callbackContext) lève JSONException {si (« beep".equals(action)) {this.beep(args.getLong(0)) ;
            callbackContext.success() ;
            retourner la valeur true ;
        } return false ;  / / Retour des résultats faussement une erreur « MethodNotFound ».
    }

Le JavaScript exec de fonction action paramètre correspond à une méthode de classe privée d'expédier avec les paramètres facultatifs.

Quand interception d'exceptions et de retourner des erreurs, il est important pour plus de clarté que des erreurs retournées aux noms d'exception du Java JavaScript match autant que possibles.

Filetage

Le plugin JavaScript est pas exécuté dans le thread principal de le WebView interface ; au lieu de cela, il s'exécute le WebCore fil, comme le fait la execute méthode. Si vous avez besoin d'interagir avec l'interface utilisateur, vous devez utiliser la variation suivante :

    @Override
    public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
        if ("beep".equals(action)) {
            final long duration = args.getLong(0);
            cordova.getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    ...
                    callbackContext.success(); // Thread-safe.
                }
            });
            return true;
        }
        return false;
    }

Utiliser ce qui suit si vous n'avez pas besoin d'exécuter sur l'interface principale de thread, mais ne voulez pas bloquer la WebCore visser soit :

    @Override
    public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
        if ("beep".equals(action)) {
            final long duration = args.getLong(0);
            cordova.getThreadPool().execute(new Runnable() {
                public void run() {
                    ...
                    callbackContext.success(); // Thread-safe.
                }
            });
            return true;
        }
        return false;
    }

Echo Android Plugin exemple

Pour trouver l'écho de l'interface JavaScript décrite dans les Plugins de l'Application , utilisez le plugin.xml pour injecter un feature spécification à de la plate-forme locale config.xml fichier :

    <platform name="android">
        <config-file target="config.xml" parent="/*">
            <feature name="Echo">
                <param name="android-package" value="org.apache.cordova.plugin.Echo"/>
            </feature>
        </config-file>
    </platform>

Puis ajoutez le code suivant à la src/org/apache/cordova/plugin/Echo.java fichier :

    package org.apache.cordova.plugin;

    import org.apache.cordova.CordovaPlugin;
    import org.apache.cordova.CallbackContext;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    /**
     * This class echoes a string called from JavaScript.
     */
    public class Echo extends CordovaPlugin {

        @Override
        public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
            if (action.equals("echo")) {
                String message = args.getString(0);
                this.echo(message, callbackContext);
                return true;
            }
            return false;
        }

        private void echo(String message, CallbackContext callbackContext) {
            if (message != null && message.length() > 0) {
                callbackContext.success(message);
            } else {
                callbackContext.error("Expected one non-empty string argument.");
            }
        }
    }

Les importations nécessaires en haut du fichier étend la classe de CordovaPlugin , dont execute() méthode, elle se substitue pour recevoir les messages de exec() . La execute() méthode teste tout d'abord la valeur de action , qui dans ce cas il est un seul valide echo valeur. Tout autre retour d'action false et se traduit par une INVALID_ACTION erreur, qui se traduit par un rappel de l'erreur invoqué sur le côté de JavaScript.

Ensuite, la méthode récupère la chaîne echo à l'aide du args de l'objet getString méthode, en spécifiant le premier paramètre passé à la méthode. Après que la valeur est passée à un privé echo méthode, il est paramètre-vérifié pour s'assurer que ce n'est pas null ou une chaîne vide, auquel cas callbackContext.error() appelle rappel d'erreur de JavaScript. Si les divers contrôles passent, la callbackContext.success() passe l'original message chaîne à rappel réussi de JavaScript comme paramètre.

Intégration Android

Android propose un Intent système qui permet aux processus de communiquer entre eux. Plugins ont accès à un CordovaInterface objet, qui peut accéder à l'Android Activity qui exécute l'application. C'est la Context requise pour lancer un nouveau Android Intent . Le CordovaInterface permet aux plugins démarrer une Activity pour un résultat et configurer le plugin de rappel pour quand le Intent retourne à l'application.

À partir de 2.0 de Cordova, Plugins peuvent accéder n'est plus directement le Context et l'héritage ctx membre est obsolète. Tous les ctx méthodes existent sur le Context , afin que les deux getContext() et getActivity() peut retourner l'objet requis.

Débogage des Plugins Android

Eclipse permet de déboguer des plugins comme source de Java inclus dans le projet. Seulement la dernière version de l'Android Developer Tools vous permet d'attacher le code source à dépendances JAR , alors cette fonction n'est pas encore entièrement supportée.