Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们如何在android应用程序中执行javascript函数并获得返回值?_Javascript_Android_Return - Fatal编程技术网

我们如何在android应用程序中执行javascript函数并获得返回值?

我们如何在android应用程序中执行javascript函数并获得返回值?,javascript,android,return,Javascript,Android,Return,我们如何在android应用程序中执行javascript函数并获取返回值 我们希望在按钮按下事件上执行javascript,我们需要向脚本传递参数并获取返回值,因此我们使用“WebChromeClient”来实现这一点, 但我们得到的异常是“SyntaxError:Parse error at undefined:1” 下面是我的代码 import android.app.Activity; import android.os.Bundle; import android.util.Log;

我们如何在android应用程序中执行javascript函数并获取返回值

我们希望在按钮按下事件上执行javascript,我们需要向脚本传递参数并获取返回值,因此我们使用“WebChromeClient”来实现这一点, 但我们得到的异常是“SyntaxError:Parse error at undefined:1”

下面是我的代码

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class FirstTab extends Activity 
{


    private WebView webView;

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
             setContentView(R.layout.regis);

            try{

                webView = (WebView) findViewById(R.id.webView1);
                webView.getSettings().setJavaScriptEnabled(true);
                webView.setWebChromeClient(new MyWebChromeClient());
                String customHtml = "<html><head><title>iSales</title><script type=\"text/javascript\"> function fieldsOnDelete(){ var x=123; return \"JIJO\"; } </script></head><body>hi</body></html>";
                webView.loadData(customHtml, "text/html","UTF-8");  

                }catch(Exception e)
                {
                     Log.v("JAC LOG",e.toString());
                }

        }
    public void onResume()
    {
        super.onResume();

            final Button button = (Button) findViewById(R.id.button1);
             button.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 try{
                    webView.loadUrl("javascript:alert(javascript:fieldsOnDelete())");
                 }
                 catch(Exception e)
                 {
                     Log.v("JAC LOG",e.toString());

                 }
              } 
             });
    }


    final class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

        Log.v("LogTag", message);
          result.confirm();
          return true;
        }
    }


}
导入android.app.Activity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.webkit.JsResult;
导入android.webkit.WebChromeClient;
导入android.webkit.WebSettings;
导入android.webkit.WebView;
公共类FirstTab扩展活动
{
私有网络视图;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.regis);
试一试{
webView=(webView)findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
setWebChromeClient(新的MyWebChromeClient());
String customHtml=“iSales function fieldsOnDelete(){var x=123;返回\“JIJO\”;}hi”;
加载数据(自定义html、“文本/html”、“UTF-8”);
}捕获(例外e)
{
Log.v(“JAC Log”,例如toString());
}
}
恢复时公开作废()
{
super.onResume();
最终按钮按钮=(按钮)findViewById(R.id.button1);
setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
试一试{
loadUrl(“javascript:alert(javascript:fieldsOnDelete())”;
}
捕获(例外e)
{
Log.v(“JAC Log”,例如toString());
}
} 
});
}
最后一个类MyWebChromeClient扩展了WebChromeClient{
@凌驾
公共布尔onJsAlert(WebView视图、字符串url、字符串消息、JsResult){
Log.v(“LogTag”,消息);
结果:确认();
返回true;
}
}
}

您可以使用
mWebView.loadUrl(“javascript:checkName”)调用该方法

然后可以使用
addJavascriptInterface()
将Java对象添加到Javascript环境中。让Java脚本调用该Java对象上的方法以提供其“返回值”

EDIT1:或者您可以使用以下黑客:

将此客户端添加到您的WebView:

final class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            Log.d("LogTag", message);
            result.confirm();
            return true;
        }
    }
现在在java脚本调用中执行以下操作:

webView.loadUrl("javascript:alert(functionThatReturnsSomething)");
现在在onJsAlert调用中,“
消息
”将包含返回值

编辑2:

因此,如果我们在调用之后调用javascript方法来加载URL,则不会起作用,因为页面加载需要时间。所以我创建了一个测试程序来测试

以下是我的html文件(名为test.html)存储在资产文件夹中:

<html>
<head>
<script language="javascript">
    function fieldsOnDelete(message) {
        alert("i am called with " + message);
        window.myjava.returnValue(message + " JIJO");
    }
</script>
<title>iSales android</title>


</head>
<body></body>
</html>
</body>
</html>
下面是我的活动课:

public class CheckWebView extends Activity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_check_web_view);
        webView = (WebView) findViewById(R.id.webview);

        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onConsoleMessage(String message, int lineNumber,
                    String sourceID) {
                super.onConsoleMessage(message, lineNumber, sourceID);
                Log.d(this.getClass().getCanonicalName(), "message " + message
                        + "   :::line number " + lineNumber + "   :::source id "
                        + sourceID);
            }

            @Override
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                // TODO Auto-generated method stub

                onConsoleMessage(consoleMessage.message(),
                        consoleMessage.lineNumber(), consoleMessage.sourceId());

                Log.d(this.getClass().getCanonicalName(), "message::::: "
                        + consoleMessage.message());

                return super.onConsoleMessage(consoleMessage);
            }
        });

        webView.addJavascriptInterface(new MyJS(), "myjava");
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setPluginsEnabled(true);
        webView.getSettings().setAllowFileAccess(true);

        webView.loadUrl("file:///android_asset/test.html");

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_check_web_view, menu);
        return true;
    }

    /* (non-Javadoc)
     * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        webView.loadUrl("javascript:fieldsOnDelete('name');");
        return super.onOptionsItemSelected(item);
    }

}
这里的关键是,在调用从资产文件夹加载html文件和调用
javascript:method
之间应该有一段时间间隔。在这里,我从选项ItemSelected调用它,它工作正常。。如果我移动
webView.loadUrl(“javascript:fieldsOnDelete('name');”)
到onCreate()方法的末尾,它显示了找不到的错误
fieldsOnDelete()
方法

希望对你有帮助

编辑3:

替换代码中的以下内容

webView.loadUrl("javascript:alert(javascript:fieldsOnDelete())");


然后试试…

在Android KitKat中,有一个新方法evaluateJavascript,它有一个返回值的回调。回调函数根据返回的内容返回JSON值、对象或数组

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // In KitKat+ you should use the evaluateJavascript method
            mWebView.evaluateJavascript(javascript, new ValueCallback<String>() {
                @TargetApi(Build.VERSION_CODES.HONEYCOMB)
                @Override
                public void onReceiveValue(String s) {
                    JsonReader reader = new JsonReader(new StringReader(s));

                    // Must set lenient to parse single values
                    reader.setLenient(true);

                    try {
                        if(reader.peek() != JsonToken.NULL) {
                            if(reader.peek() == JsonToken.STRING) {
                                String msg = reader.nextString();
                                if(msg != null) {
                                    Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
                                }
                            }
                        }
                    } catch (IOException e) {
                        Log.e("TAG", "MainActivity: IOException", e);
                    } finally {
                        try {
                            reader.close();
                        } catch (IOException e) {
                            // NOOP
                        }
                    }
                }
            });
        }
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.KITKAT){
//在KitKat+中,您应该使用evaluateJavascript方法
evaluateJavascript(javascript,new ValueCallback(){
@TargetApi(构建版本代码蜂窝)
@凌驾
公共void onReceiveValue(字符串s){
JsonReader=新的JsonReader(新的StringReader);
//必须设置lenient以分析单个值
读者:setLenient(真);
试一试{
if(reader.peek()!=JsonToken.NULL){
if(reader.peek()==JsonToken.STRING){
字符串msg=reader.nextString();
如果(msg!=null){
Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_LONG.show();
}
}
}
}捕获(IOE异常){
Log.e(“TAG”,“MainActivity:IOException”,e);
}最后{
试一试{
reader.close();
}捕获(IOE异常){
//努普
}
}
}
});
}

您可以在这里看到一个完整的示例:

这有助于解决您的问题我们没有url,我们正在将javascript保存在一个字符串变量中。例如:String customHtml=“iSalesfunction fieldsOnDelete(){return\'JIJO\';}”;加载数据(自定义html、“文本/html”、“UTF-8”);执行时出现了一个解析错误。请尝试调用
mWebView.loadUrl(“javascript:checkName”)webView.loadData(customHtml,“text/html”,“UTF-8”)我们尝试了webView.loadUrl(“javascript:alert(javascript:fieldsOnDelete())”;对于get返回值,我们在web控制台标记中得到了“SyntaxError:Parse error at undefined:1”消息,但对于webView.loadUrl(“javascript”)来说它的工作正常
webView.loadUrl("javascript:alert(fieldsOnDelete())");
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // In KitKat+ you should use the evaluateJavascript method
            mWebView.evaluateJavascript(javascript, new ValueCallback<String>() {
                @TargetApi(Build.VERSION_CODES.HONEYCOMB)
                @Override
                public void onReceiveValue(String s) {
                    JsonReader reader = new JsonReader(new StringReader(s));

                    // Must set lenient to parse single values
                    reader.setLenient(true);

                    try {
                        if(reader.peek() != JsonToken.NULL) {
                            if(reader.peek() == JsonToken.STRING) {
                                String msg = reader.nextString();
                                if(msg != null) {
                                    Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
                                }
                            }
                        }
                    } catch (IOException e) {
                        Log.e("TAG", "MainActivity: IOException", e);
                    } finally {
                        try {
                            reader.close();
                        } catch (IOException e) {
                            // NOOP
                        }
                    }
                }
            });
        }