目次
実装方法
このサンプルコード
呼び出し例
jsはJavaを呼び出します
JavaはJSを呼び出します
関数" >パラメータなし、戻り値なしでjsを呼び出します関数
パラメータ付きでjsを呼び出します関数
パラメータと戻り値を使用して js 関数を呼び出す
4.4処理
質問の回答
アラートがポップアップ表示できません" >アラートがポップアップ表示できません
キャッチされない参照エラー: functionNameが定義されていません" >キャッチされない参照エラー: functionNameが定義されていません
Uncaught TypeError: Object [object Object] has no method" >Uncaught TypeError: Object [object Object] has no method
セキュリティ制限の問題
2つの解決策
コード難読化の問題
すべての WebView メソッドは同じスレッドで呼び出す必要があります" >すべての WebView メソッドは同じスレッドで呼び出す必要があります
ホームページ ウェブフロントエンド jsチュートリアル Android における Java と JavaScript の相互作用の詳細な説明

Android における Java と JavaScript の相互作用の詳細な説明

Mar 15, 2017 pm 05:30 PM

Android は、Web ページを処理するための非常に強力な WebView コントロールを提供します。Web ページでは、JavaScript も非常に重要なスクリプトです。この記事では、JavaコードとJavaScriptコード間の相互呼び出しを実装する方法を紹介します。

実装方法

Javaとjsのやりとりを実現するととても便利です。通常は次の手順のみが必要です。

  • WebView は JavaScript スクリプトの実行を有効にします

  • WebView は、JavaScript 呼び出しの対話型インターフェイスを設定します。

  • クライアントと Web ページは、相互に呼び出すコードを記述します。

このサンプルコード

説明の便宜上、すべてのコードを最初に掲載しています

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);
      }
  }

}
ログイン後にコピー

フロントエンドWebコード

<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>
ログイン後にコピー

呼び出し例

jsはJavaを呼び出します

呼び出し形式はウィンドウです.jsInterfaceName.methodName(parameterValues ) この例では、注入インターフェイス名として control を使用します。

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

function sumToJava(number1, number2){
   window.control.onSumResult(number1 + number2)
}
ログイン後にコピー

JavaはJSを呼び出します

webViewがjsを呼び出す基本形式はwebView.loadUrl("javascript:methodName(parameterValues)")です

パラメータなし、戻り値なしでjsを呼び出します関数

String call = "javascript:sayHello()";
webView.loadUrl(call);
ログイン後にコピー

パラメータ付きでjsを呼び出します関数

パラメータ値としての strings では二重引用符をエスケープする必要があることに注意してください。

String call = "javascript:alertMessage(\"" + "content" + "\")";
webView.loadUrl(call);
ログイン後にコピー

パラメータと戻り値を使用して js 関数を呼び出す

Android 4.4 より前の Android には、js 関数を直接呼び出して値を取得するメソッドが提供されていなかったため、それ以前は、Java が js メソッドを呼び出し、js メソッドを呼び出すという一般的な考え方がありました。 Java コードを再度呼び出して値を返します。

1.Javaがjsコードを呼び出し

String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);
ログイン後にコピー

2.js関数の処理をjavaメソッドを呼び出して結果を返す

function sumToJava(number1, number2){
       window.control.onSumResult(number1 + number2)
}
ログイン後にコピー

3.Javaがコールバックメソッドでjs関数の戻り値を取得

@JavascriptInterface
public void onSumResult(int result) {
  Log.i(LOGTAG, "onSumResult result=" + result);
}
ログイン後にコピー

4.4処理

後Android 4.4 では、evaluateJavaScript を使用するだけです。これは、戻り値を持つ js メソッドの簡単な対話型の例です

function getGreetings() {
      return 1;
}
ログイン後にコピー

Java コードを使用するときに呼び出すには、evaluateJavascript メソッドを使用します

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

  @Override
  public void onReceiveValue(String value) {
      Log.i(LOGTAG, "onReceiveValue value=" + value);
  }});
}
ログイン後にコピー

結果を出力します

I/MainActivity( 1432): onReceiveValue value=1
ログイン後にコピー

注意

  • 上記は、戻り値を String に制限しています。単純な型の場合は、文字列に変換して返します。複雑な データ型 の場合は、文字列形式の json の形式で返すことをお勧めします。

  • evaluateJavascriptメソッドはUIスレッド(メインスレッド)で呼び出す必要があるため、onReceiveValueもメインスレッドで実行されます。

質問の回答

アラートがポップアップ表示できません

WebChromeClientを設定する必要はありません。次のコードに従って設定してください

myWebView.setWebChromeClient(new WebChromeClient() {});
ログイン後にコピー

キャッチされない参照エラー: functionNameが定義されていません

問題は、Webページのjsコードが存在しません読み込みが完了した後、jsメソッドが呼び出されます。解決策は、Web ページが読み込まれた後に js メソッドを呼び出すことです

myWebView.setWebViewClient(new WebViewClient() {

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

});
ログイン後にコピー

Uncaught TypeError: Object [object Object] has no method

セキュリティ制限の問題

問題がバージョン 4.2 以降のマシンでのみ発生する場合上記の場合、それはシステムです。セキュリティ制限の問題です。 Android のドキュメントには次のように書かれています

注意: targetSdkVersion を 17 以降に設定している場合は、Web ページのコードで使用できるようにするメソッドに @JavascriptInterface アノテーションを追加する必要があります (メソッドはパブリックである必要もあります)。注釈を提供しない場合、Android 4.2 以降で実行している場合、Web ページからメソッドにアクセスできなくなります。

中国語の意味は

警告: プログラムのターゲット プラットフォームが 17 以降の場合、@JavascriptInterface アノテーション は、Web ページに公開される呼び出し可能なメソッドに追加する必要があります (このメソッドはパブリックである必要があります)。これを行わないと、Web ページはプラットフォーム 4.2 以降のメソッドにアクセスできなくなります。

2つの解決策
  • targetSdkVersionを17以降に設定し、@JavascriptInterfaceアノテーションを導入します

  • @JavascriptInterfaceという名前のアノテーションインターフェイスを自分で作成して導入します。このインターフェースを混同しないように注意してください。

@JavascriptInterface コードを作成してください

public @interface JavascriptInterface {

}
ログイン後にコピー

コード難読化の問題

難読化されていないコードが正常に実行される場合、難読化されたバージョンのコードはエラーを実行し、Uncaught TypeError: Object [object Object] has no method というプロンプトが表示されます。難読化された例外処理を行っていません。 難読化されたファイルに次のようなコードを追加します

-keep class com.example.javajsinteractiondemo$JsInteration {
    *;
}
ログイン後にコピー

すべての WebView メソッドは同じスレッドで呼び出す必要があります

フィルター ログでこの問題が発見されました。

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)
ログイン後にコピー

js 呼び出し後の Java コールバック スレッドはメインスレッドではありません。ログを出力すると、

ThreadInfo=Thread[WebViewCoreThread,5,main]
ログイン後にコピー

を確認できます。 上記の例外を解決するには、メイン スレッドに Webview 操作を追加するだけです。

りー


以上がAndroid における Java と JavaScript の相互作用の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Sep 27, 2024 am 06:23 AM

Redmi Note 14 Pro Plusは、昨年のRedmi Note 13 Pro Plus(Amazonで現在375ドル)の直接の後継者として正式に発表されました。予想通り、Redmi Note 14 Pro Plusは、Redmi Note 14およびRedmi Note 14 Proと並んでRedmi Note 14シリーズをリードします。李

Oppo Find X8のデザインは、初期の画像ではApple iPhone 16 ProとOnePlus Openを組み合わせたように見えます Oppo Find X8のデザインは、初期の画像ではApple iPhone 16 ProとOnePlus Openを組み合わせたように見えます Sep 28, 2024 am 06:04 AM

歴史的に、Oppo は 2018 年 6 月に発表したオリジナルの Find X を除いて、冬の終わりか春の初めにフラッグシップの「Find X」シリーズを刷新してきました。そのため、Find X7 と Find X7 Ultra は発売からわずか 6 か月を超えています。この時点で。 H

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

レノボ、2024 Legion Y700 ゲーミングタブレットの新しいカラーオプションを発表 レノボ、2024 Legion Y700 ゲーミングタブレットの新しいカラーオプションを発表 Sep 29, 2024 am 06:05 AM

Lenovo は、2024 Legion Y700 を中国で 9 月 29 日に発売する準備を進めています。この新しい Android ゲーム タブレットは RedMagic Nova に対抗するものとなり、同社はすでにデバイスのほぼすべての仕様を確認しています。さて、満席の数時間前に

Samsung Galaxy Z Fold Special Edition、競合する名前が浮上、10月下旬に発売されることが判明 Samsung Galaxy Z Fold Special Edition、競合する名前が浮上、10月下旬に発売されることが判明 Oct 01, 2024 am 06:21 AM

サムスンの待望の折りたたみ式「スペシャルエディション」の発売には、また新たな展開が加わった。ここ数週間、いわゆる Galaxy Z Fold Special Edition に関する噂はかなり静かになりました。代わりに、焦点はGalaxy S25シリーズに移りました。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

未来を創る: まったくの初心者のための Java プログラミング 未来を創る: まったくの初心者のための Java プログラミング Oct 13, 2024 pm 01:32 PM

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。

See all articles