Table des matières
Comment réaliser
Cet exemple de code
Exemple d'appel
js appelle Java
Java appelle JS
Fonction" >Appel de js sans paramètres et aucune valeur de retourFonction
Appelez la fonction js avec des paramètres et aucune valeur de retour
Appel de fonctions js avec des paramètres et des valeurs de retour
Traitement 4.4
Q&A
L'alerte ne peut pas apparaître" >L'alerte ne peut pas apparaître
Uncaught ReferenceError : functionName n'est pas défini" >Uncaught ReferenceError : functionName n'est pas défini
Uncaught TypeError : Object [object Object] n'a pas de méthode" >Uncaught TypeError : Object [object Object] n'a pas de méthode
Problèmes de restriction de sécurité
Deux solutions
Problème d'obscurcissement du code
Toutes les méthodes WebView doivent être appelées sur le même fil" >Toutes les méthodes WebView doivent être appelées sur le même fil
Maison interface Web js tutoriel Explication détaillée de l'interaction Java et JavaScript dans Android

Explication détaillée de l'interaction Java et JavaScript dans Android

Mar 15, 2017 pm 05:30 PM

Android fournit un contrôle WebView très puissant pour le traitement des pages Web, et dans la page Web, JavaScript est un autre script très important. Cet article expliquera comment implémenter des appels mutuels entre le code Java et le code Javascript.

Comment réaliser

Il est très pratique de réaliser l'interaction entre Java et js. Habituellement, seules les étapes suivantes sont requises.

  • WebView permet l'exécution de scripts JavaScript

  • WebView définit une interface interactive pour les appels JavaScript.

  • Le client et la page Web écrivent du code pour s'appeler.

Cet exemple de code

Pour faciliter l'explication, tout le code est publié en premier

Code Java

package com.example.javajsinteractiondemo;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends Activity {
  private static final String LOGTAG = "MainActivity";
  @SuppressLint("JavascriptInterface")
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final WebView myWebView = (WebView) findViewById(R.id.myWebView);
      WebSettings settings = myWebView.getSettings();
      settings.setJavaScriptEnabled(true);
      myWebView.addJavascriptInterface(new JsInteration(), "control");
      myWebView.setWebChromeClient(new WebChromeClient() {});
      myWebView.setWebViewClient(new WebViewClient() {

          @Override
          public void onPageFinished(WebView view, String url) {
              super.onPageFinished(view, url);
              testMethod(myWebView);
          }

      });
      myWebView.loadUrl("file:///android_asset/js_java_interaction.html");
  }

  private void testMethod(WebView webView) {
      String call = "javascript:sayHello()";

      call = "javascript:alertMessage(\"" + "content" + "\")";

      call = "javascript:toastMessage(\"" + "content" + "\")";

      call = "javascript:sumToJava(1,2)";
      webView.loadUrl(call);

  }

  public class JsInteration {

      @JavascriptInterface
      public void toastMessage(String message) {
          Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
      }

      @JavascriptInterface
      public void onSumResult(int result) {
          Log.i(LOGTAG, "onSumResult result=" + result);
      }
  }

}
Copier après la connexion

Code Web frontal

<html>
<script type="text/javascript">
    function sayHello() {
        alert("Hello")
    }

    function alertMessage(message) {
        alert(message)
    }

    function toastMessage(message) {
        window.control.toastMessage(message)
    }

    function sumToJava(number1, number2){
       window.control.onSumResult(number1 + number2)
    }
</script>
Java-Javascript Interaction In Android
</html>
Copier après la connexion

Exemple d'appel

js appelle Java

Le format d'appel est window.jsInterfaceName.methodName(parameterValues) Dans cet exemple, nous utilisons le contrôle comme le nom de l’interface d’injection.

function toastMessage(message) {
  window.control.toastMessage(message)
}

function sumToJava(number1, number2){
   window.control.onSumResult(number1 + number2)
}
Copier après la connexion

Java appelle JS

Le format de base de webView appelant js est webView.loadUrl("javascript:methodName(parameterValues)")

Appel de js sans paramètres et aucune valeur de retourFonction

String call = "javascript:sayHello()";
webView.loadUrl(call);
Copier après la connexion

Appelez la fonction js avec des paramètres et aucune valeur de retour

Notez que pour string comme valeur de paramètre, double les guillemets doivent être échappés.

String call = "javascript:alertMessage(\"" + "content" + "\")";
webView.loadUrl(call);
Copier après la connexion

Appel de fonctions js avec des paramètres et des valeurs de retour

Android ne fournissait pas de méthode pour appeler directement les fonctions js et obtenir des valeurs avant la 4.4, donc avant cela, l'idée commune était Java appelle la méthode js une fois la méthode js exécutée, le code java est à nouveau appelé pour renvoyer la valeur.

1.Java appelle le code js

String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);
Copier après la connexion

2.js traitement de la fonction et renvoie le résultat en appelant la méthode java

function sumToJava(number1, number2){
       window.control.onSumResult(number1 + number2)
}
Copier après la connexion

3.Java dans la méthode de rappel Get la fonction js renvoie la valeur dans

@JavascriptInterface
public void onSumResult(int result) {
  Log.i(LOGTAG, "onSumResult result=" + result);
}
Copier après la connexion

Traitement 4.4

Utilisez évaluerJavascript après Android 4.4. Voici un exemple interactif simple d'une méthode js avec une valeur de retour

function getGreetings() {
      return 1;
}
Copier après la connexion

code Java lors de l'appel de la méthode évaluerJavascript

private void testEvaluateJavascript(WebView webView) {
  webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {

  @Override
  public void onReceiveValue(String value) {
      Log.i(LOGTAG, "onReceiveValue value=" + value);
  }});
}
Copier après la connexion

résultat de sortie

I/MainActivity( 1432): onReceiveValue value=1
Copier après la connexion

Remarque

  • Ce qui précède limite le résultat renvoyé à String Pour les types simples, il essaiera d'être converti en chaîne et renvoyé pour les types de données complexes. est recommandé de le renvoyer sous forme de chaîne. Le json est renvoyé. La méthode

  • evaluateJavascript doit être appelée dans le thread de l'interface utilisateur (thread principal), donc onReceiveValue est également exécuté dans le thread principal.

Q&A

L'alerte ne peut pas apparaître

Vous n'auriez pas dû configurer WebChromeClient, suivez le code suivant pour le définir up

myWebView.setWebChromeClient(new WebChromeClient() {});
Copier après la connexion

Uncaught ReferenceError : functionName n'est pas défini

La raison du problème est que le code js de la page Web n'a pas été chargé , donc la méthode js est appelée. La solution est d'appeler la méthode js

myWebView.setWebViewClient(new WebViewClient() {

  @Override
  public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);
      //在这里执行你想调用的js函数
  }

});
Copier après la connexion

Uncaught TypeError : Object [object Object] n'a pas de méthode

Problèmes de restriction de sécurité

Si le problème ne se produit que sur les machines équipées de la version 4.2 ou supérieure, le problème vient du fait que le système est soumis à des restrictions de sécurité. La documentation Android dit ceci

Attention : Si vous avez défini votre targetSdkVersion sur 17 ou supérieur, vous devez ajouter l'annotation @JavascriptInterface à toute méthode que vous souhaitez rendre disponible dans le code de votre page Web (la méthode doit également publique). Si vous ne fournissez pas l'annotation, la méthode ne sera pas accessible par votre page Web lors de l'exécution sur Android 4.2 ou supérieur.

La signification chinoise est

Attention : Si votre programme cible la plateforme 17 ou supérieure, vous devez ajouter l'annotation @JavascriptInterface à la méthode appelable par la page web (cette méthode doit être publique). Si vous ne le faites pas, la page Web ne pourra pas accéder à votre méthode sur les plateformes 4.2 et ultérieures.

Deux solutions
  • Définissez targetSdkVersion sur 17 ou supérieur et introduisez l'annotation @JavascriptInterface

  • Créer une interface d'annotation nommé @JavascriptInterface vous-même, puis importez-le. Notez que cette interface ne peut pas être confondue.

Remarque, créez le code @JavascriptInterface

public @interface JavascriptInterface {

}
Copier après la connexion

Problème d'obscurcissement du code

S'il s'exécute normalement dans la version non obscurcie, il s'exécutera normalement dans la version obscurcie Le code ne s'exécute pas correctement et affiche Uncaught TypeError: Object [object Object] has no method, c'est-à-dire que vous n'avez pas effectué de gestion des exceptions obscurcies. Ajoutez un code comme celui-ci au fichier obscurci

-keep class com.example.javajsinteractiondemo$JsInteration {
    *;
}
Copier après la connexion

Toutes les méthodes WebView doivent être appelées sur le même fil

Les journaux de filtre ont découvert ce problème.

E/StrictMode( 1546): java.lang.Throwable: A WebView method was called on thread &#39;JavaBridge&#39;. 
All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {528712d4} called on Looper (JavaBridge, tid 121) {52b6678c}, 
FYI main Looper is Looper (main, tid 1) {528712d4})
E/StrictMode( 1546):   at android.webkit.WebView.checkThread(WebView.java:2063)
E/StrictMode( 1546):   at android.webkit.WebView.loadUrl(WebView.java:794)
E/StrictMode( 1546):   at com.xxx.xxxx.xxxx.xxxx.xxxxxxx$JavaScriptInterface.onCanGoBackResult(xxxx.java:96)
E/StrictMode( 1546):   at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
E/StrictMode( 1546):   at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
E/StrictMode( 1546):   at android.os.Handler.dispatchMessage(Handler.java:102)
E/StrictMode( 1546):   at android.os.Looper.loop(Looper.java:136)
E/StrictMode( 1546):   at android.os.HandlerThread.run(HandlerThread.java:61)
Copier après la connexion

Le thread de rappel Java après l'appel js n'est pas le thread principal. Si vous imprimez le journal, vous pouvez vérifier

ThreadInfo=Thread[WebViewCoreThread,5,main]
Copier après la connexion

Pour résoudre l'exception ci-dessus, placez simplement l'opération WebView dans le thread principal.

webView.post(new Runnable() {
    @Override
    public void run() {
        webView.loadUrl(YOUR_URL).
    }
});
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Xiaomi Redmi Note 14 Pro Plus arrive en tant que premier smartphone Qualcomm Snapdragon 7s Gen 3 avec caméra Light Hunter 800 Xiaomi Redmi Note 14 Pro Plus arrive en tant que premier smartphone Qualcomm Snapdragon 7s Gen 3 avec caméra Light Hunter 800 Sep 27, 2024 am 06:23 AM

Le Redmi Note 14 Pro Plus est désormais officiel en tant que successeur direct du Redmi Note 13 Pro Plus de l'année dernière (375 $ sur Amazon). Comme prévu, le Redmi Note 14 Pro Plus est en tête de la série Redmi Note 14 aux côtés du Redmi Note 14 et du Redmi Note 14 Pro. Li

Le design de l'Oppo Find X8 ressemble à un croisement entre Apple iPhone 16 Pro et OnePlus Open dans les premières images Le design de l'Oppo Find X8 ressemble à un croisement entre Apple iPhone 16 Pro et OnePlus Open dans les premières images Sep 28, 2024 am 06:04 AM

Historiquement, Oppo a actualisé sa série phare « Find X » à la fin de l'hiver ou au début du printemps, à l'exception du Find X original annoncé en juin 2018. À cette fin, les Find X7 et Find X7 Ultra ont à peine plus de six mois. à ce point. H

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Lenovo dévoile une nouvelle option de couleur pour la tablette de jeu Legion Y700 2024 Lenovo dévoile une nouvelle option de couleur pour la tablette de jeu Legion Y700 2024 Sep 29, 2024 am 06:05 AM

Lenovo se prépare à lancer le Legion Y700 2024 le 29 septembre en Chine. Cette nouvelle tablette de jeu Android affrontera la RedMagic Nova, et la société a déjà confirmé presque toutes les spécifications de l'appareil. Maintenant, quelques heures avant le plein

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Le Samsung Galaxy Z Fold Special Edition a été révélé pour atterrir fin octobre alors que des noms contradictoires émergent Le Samsung Galaxy Z Fold Special Edition a été révélé pour atterrir fin octobre alors que des noms contradictoires émergent Oct 01, 2024 am 06:21 AM

Le lancement du très attendu pliable « Special Edition » de Samsung a pris une autre tournure. Ces dernières semaines, les rumeurs concernant le soi-disant Galaxy Z Fold Special Edition sont devenues plutôt silencieuses. Au lieu de cela, l’accent s’est déplacé vers la série Galaxy S25, y compris

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles