Estou tentando chamar algumas javascript
funções em uma html
página em execução dentro de um android webview
. Bem simples do que o código tenta fazer abaixo - no aplicativo Android, chame uma javascript
função com uma mensagem de teste, que inturn chama uma função java de volta no aplicativo Android que exibe a mensagem de teste via brinde.
A javascript
função se parece com:
function testEcho(message){
window.JSInterface.doEchoTest(message);
}
No WebView, tentei chamar javascript
as seguintes maneiras sem sorte:
myWebView.loadUrl("javascript:testEcho(Hello World!)");
mWebView.loadUrl("javascript:(function () { " + "testEcho(Hello World!);" + "})()");
Eu habilitei javascript
noWebView
myWebView.getSettings().setJavaScriptEnabled(true);
// register class containing methods to be exposed to JavaScript
myWebView.addJavascriptInterface(myJSInterface, "JSInterface");
E aqui está a Java
classe
public class JSInterface{
private WebView mAppView;
public JSInterface (WebView appView) {
this.mAppView = appView;
}
public void doEchoTest(String echo){
Toast toast = Toast.makeText(mAppView.getContext(), echo, Toast.LENGTH_SHORT);
toast.show();
}
}
Passei muito tempo pesquisando o que eu estava fazendo de errado. Todos os exemplos que encontrei usam essa abordagem. Alguém vê algo errado aqui?
Edit: Existem vários outros javascript
arquivos externos sendo referenciados e usados no html
, eles poderiam ser o problema?
fonte
@JavascriptInterface
decorador nos métodos Java que deseja disponibilizar para o WebView por meio da interface JavaScript.myWebView.loadUrl("javascript:testEcho('Hello World!')");
, entendo que você já anexou o arquivo html a essa visualização na web. Você poderia me dizer como você fez isso?Respostas:
Eu descobri qual era o problema: falta de aspas no parâmetro testEcho (). Foi assim que recebi a ligação para trabalhar:
fonte
A partir do kitkat, use o método assessmentJavascript, em vez disso, loadUrl para chamar as funções javascript como abaixo
fonte
loadUrl
também fez com que o teclado do software aparecesse quando tento preencher o valor em um campo de entrada.fonte
Criei um bom invólucro para chamar métodos JavaScript; também mostra erros de JavaScript no log:
Você precisa adicionar isso também:
E adicione esta interface ao seu webview:
fonte
final Object a = new Object(); callJavaScript(mBrowser, "alert", 1, true, "abc", a);
vai cederSyntaxError
comUnexpected token
o que não é surpreendente quando você vai olhar para os js gerados chamar:javascript:try{alert(,,'abc',,)}catch(error){console.error(error.message);}
callJavaScript(mBrowser, "alert", "abc", "def");
geram erros, pois sempre há vírgula desonesta no final. -1 de mim.callJavascript(mBrowser, "can't do it");
Sim, você tem o erro de sintaxe. Se você deseja obter seus erros de Javascript e instruções de impressão em seu logcat, deve implementar o
onConsoleMessage(ConsoleMessage cm)
método em seu WebChromeClient. Ele fornece rastreamentos completos da pilha, como o console da Web (elemento Inspecionar). Aqui está o métodoApós a implementação, você receberá seus erros de Javascript e imprimirá instruções (
console.log
) no seu logcat.fonte
Modificação da resposta @Ilya_Gazman
criará corretamente chamadas JS, por exemplo
Observe que os objetos não serão transmitidos corretamente - mas você pode serializá-los antes de passar como argumento.
Também mudei para onde o erro foi, desviei-o para o log do console, que pode ser ouvido por:
e cliente
fonte
callJavascript(mBrowser, "can't do it");
:?activity_main.xml
MainActivity.java
arquivo de ativos
fonte