質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

307閲覧

javaからローカルhtml/scriptのfunctionを実行したい

McQueen

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/12/02 12:51

編集2018/12/03 20:58

前提・実現したいこと

androidアプリをローカルhtmlをベースにwebviewで作成したいと思っています。
javascriptからjavaへのデータ受け渡し・操作は問題なくできたのですが、逆のjavaからjavascriptのfunctionが動かなくて行き詰まっています。
androidは初心者なので、基本的なところから間違っているのかもしれません。ご教示お願いします。

発生している問題・エラーメッセージ

javascript --> Java すなわちappJsInterface.testMessageStart() --> testMessageStartは問題なく動きます。
Java --> javascript() すなわちwebView.loadUrl --> window.testMessageCallbackでアプリが落ちます。

androidStudio初心者で適切なエラーメッセージを提示できないのですが、Event Logにはエラーは出ていません。LogCatは以下のメッセージが流れっぱなしになっています。
コード

2018

12018-12-02 18:41:31.446 1763-32080/? I/AudioFlinger: AudioFlinger's thread 0xe2383c40 tid=32080 ready to run 22018-12-02 18:41:31.447 2763-30854/com.google.android.googlequicksearchbox:search E/IAudioFlinger: createRecord returned error -12 32018-12-02 18:41:31.447 2763-30854/com.google.android.googlequicksearchbox:search E/AudioRecord: AudioFlinger could not create record track, status: -12 42018-12-02 18:41:31.447 2763-30854/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -12. 52018-12-02 18:41:31.447 2763-30854/com.google.android.googlequicksearchbox:search E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object. 62018-12-02 18:41:31.448 2763-30854/com.google.android.googlequicksearchbox:search I/MicrophoneInputStream: mic_started SR : 16000 CC : 16 SO : 6 72018-12-02 18:41:31.449 2763-2763/com.google.android.googlequicksearchbox:search I/MicroDetectionWorker: onReady 82018-12-02 18:41:31.456 2763-30854/com.google.android.googlequicksearchbox:search I/MicrophoneInputStream: mic_close SR : 16000 CC : 16 SO : 6 92018-12-02 18:41:31.458 2763-28065/com.google.android.googlequicksearchbox:search I/MicroRecognitionRunner: Detection finished 102018-12-02 18:41:31.458 2763-28065/com.google.android.googlequicksearchbox:search W/ErrorReporter: reportError [type: 211, code: 524300]: Error reading from input stream 112018-12-02 18:41:31.459 2763-3112/com.google.android.googlequicksearchbox:search I/MicroRecognitionRunner: Stopping hotword detection. 122018-12-02 18:41:31.459 2763-28065/com.google.android.googlequicksearchbox:search W/ErrorProcessor: onFatalError, processing error from engine(4) 13 com.google.android.apps.gsa.shared.speech.b.g: Error reading from input stream 14 at com.google.android.apps.gsa.staticplugins.microdetection.d.k.a(SourceFile:91) 15 at com.google.android.apps.gsa.staticplugins.microdetection.d.l.run(Unknown Source:14) 16 at com.google.android.libraries.gsa.runner.a.a.b(SourceFile:32) 17 at com.google.android.libraries.gsa.runner.a.c.call(Unknown Source:4) 18 at java.util.concurrent.FutureTask.run(FutureTask.java:266) 19 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458) 20 at java.util.concurrent.FutureTask.run(FutureTask.java:266) 21 at com.google.android.apps.gsa.shared.util.concurrent.b.g.run(Unknown Source:4) 22 at com.google.android.apps.gsa.shared.util.concurrent.b.aw.run(SourceFile:4) 23 at com.google.android.apps.gsa.shared.util.concurrent.b.aw.run(SourceFile:4) 24 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 25 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 26 at java.lang.Thread.run(Thread.java:764) 27 at com.google.android.apps.gsa.shared.util.concurrent.b.i.run(SourceFile:6) 28 Caused by: com.google.android.apps.gsa.shared.exception.GsaIOException: Error code: 393238 | Buffer overflow, no available space. 29 at com.google.android.apps.gsa.speech.audio.Tee.j(SourceFile:103) 30 at com.google.android.apps.gsa.speech.audio.au.read(SourceFile:2) 31 at java.io.InputStream.read(InputStream.java:101) 32 at com.google.android.apps.gsa.speech.audio.ao.run(SourceFile:17) 33 at com.google.android.apps.gsa.speech.audio.an.run(SourceFile:2) 34 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458) 35 at java.util.concurrent.FutureTask.run(FutureTask.java:266)  36 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)  37 at java.util.concurrent.FutureTask.run(FutureTask.java:266)  38 at com.google.android.apps.gsa.shared.util.concurrent.b.g.run(Unknown Source:4)  39 at com.google.android.apps.gsa.shared.util.concurrent.b.aw.run(SourceFile:4)  40 at com.google.android.apps.gsa.shared.util.concurrent.b.aw.run(SourceFile:4)  41 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  42 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  43 at java.lang.Thread.run(Thread.java:764)  44 at com.google.android.apps.gsa.shared.util.concurrent.b.i.run(SourceFile:6)  45コード

該当のソースコード

###Java
ソースコード

import

1import android.app.AlertDialog; 2import android.content.DialogInterface; 3import android.content.pm.ActivityInfo; 4import android.os.Bundle; 5import android.support.v7.app.AppCompatActivity; 6import android.webkit.JavascriptInterface; 7import android.webkit.WebView; 8import android.webkit.WebViewClient; 9 10@SuppressLint({"JavascriptInterface", "SetJavaScriptEnabled"}) 11public class MainActivity extends AppCompatActivity { 12 13 private WebView webView; 14 15 @SuppressLint("AddJavascriptInterface") 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 21 webView = findViewById(R.id.webView); 22 webView.setWebViewClient(new WebViewClient()); 23 webView.getSettings().setJavaScriptEnabled(true); 24 webView.getSettings().setDomStorageEnabled(true); 25 26 MyJavaScriptInterface obj = new MyJavaScriptInterface(); 27 webView.addJavascriptInterface( obj, "appJsInterface" ); 28 29 webView.loadUrl("file:///android_asset/index.html"); 30 31 } 32 33 // js -> ネイティブ 34 class MyJavaScriptInterface { 35 36 @JavascriptInterface 37 public void showAlert( String title, String message ) { 38 new AlertDialog.Builder(MainActivity.this) 39 .setTitle(title) 40 .setMessage(message) 41 .setPositiveButton("OK", null) 42 .show(); 43 } 44 45 @JavascriptInterface 46 public void testMessageStart() { .....................① 47 new AlertDialog.Builder(MainActivity.this) 48 .setTitle("resept") 49 .setMessage("JS --> ネイティブ OK") 50 .setPositiveButton("OK", new DialogInterface.OnClickListener() { 51 @Override 52 public void onClick(DialogInterface dialog, int which) { 53 // OK button pressed 54 testMessageCallback(); 55 56 } 57 }) 58 .setNegativeButton("Cancel", null) 59 .show(); 60 61 } 62 } 63 64 // ネイティブ -> js 65 public void testMessageCallback() { 66 67 //webView = findViewById(R.id.webView); 68 final String script = "javascript:window.testMessageCallback('%s');"; 69 webView.loadUrl( String.format( script, "testMessageCallback" ) ); .......② 70 71 } 72コード

###JavaScript

コード

var testMessageSendClick = function () { appJsInterface.testMessageStart(); } window.testMessageCallback = function (message) { appJsInterface.showAlert("infomation", "testOK"); }
### 試したこと javascriptからjavaへのデータ受け渡し・操作①、すなわちAlertDialogは問題なく表示されるのでうまくいっていると思われます。 javaからjavascriptへのデータ受け渡し・操作②、すなわちwebView.loadUrl( String.format( script, "testMessageCallback" ) );が動かず、アプリが落ちてしまいます。(testMessageCallback()は間違いなく呼ばれているのは確認しました) webViewが認識されてないのかと思いtestMessageCallback()内でwebView = findViewById(R.id.webView);の有無は確認しましたが関係ありませんでした。 javascript内のwindow.testMessageCallback()が無いと判断されて落ちているのかとも思うのですが、原因・解決策がネット検索からはたどり着けませんでした。 ### 補足情報(FW/ツールのバージョンなど) AndroidStudio 3.2.1 API Level 28 minSdkVersion 23 targetSdkVersion 28 確認はエミュレータ,Nexus5x API28

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

その後もいろいろ試しましたが、うまくいきませんでした。
素人ながら下記のweb情報から、漠然とした原因ですが、セキュリティ上の観点から
JavascriptInterfaceでjavaScript->Javaに送って処理し、その結果をwebView.loadUrlでjava->javaScriptに送ることができないのかなと判断しました。

リンク内容

WebChromeClientのonJsConfirmを使ってなんとかやりたい機能を代替えできそうなので、とりあえずはそれで対応しますが、はっきりとした原因をお分かりの方は是非教えてください。

投稿2018/12/07 08:39

McQueen

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問