问题如下
1、android调用js方法无效的问题
我的原因是少了
webView.setWebChromeClient(new WebChromeClient());这一句
2、js调用android方法无效的问题
我的原因:在api>17之后为了解决webviewjs调用任意代码的漏洞,要给回调的方法加上
@JavascriptInterface 使用方式可以看下面的源码
解决后的代码:
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; WebView webView; String text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView= (WebView) findViewById(R.id.main_webview); webView.getSettings().setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient()); //这一句是为了不让外部链接跳转到其他app去执行,而是在我们自己的webview上显示 // webView.setWebViewClient(new WebViewClient(){ // @Override // public boolean shouldOverrideUrlLoading(WebView view, String url) { // view.loadUrl(url); // return false; // } // }); //我在raw目录下存放了一个test.html文件,代码在后面 InputStream inputStream = getResources().openRawResource(R.raw.test); try { text=readStreamText(inputStream); //加载本地的html文件 webView.loadData(text,"text/html","utf-8"); //设置js回调的方法,回调方法要加上@JavascriptInterface注释,第二个参数对应js中window.demo中的demo webView.addJavascriptInterface(new Object(){ @JavascriptInterface public void clickon(){ Toast.makeText(MainActivity.this, "js call android", Toast.LENGTH_SHORT).show(); } },"demo"); Log.i(TAG,"text="+text); } catch (IOException e) { e.printStackTrace(); } } private String readStreamText(InputStream inputStream) throws IOException { BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream)); StringBuffer b=new StringBuffer(); String temp=null; while ((temp=reader.readLine())!=null) b.append(temp); reader.close(); return b.toString(); } //android调用js的testa函数,加入webView.setWebChromeClient(new WebChromeClient())后成功alert public void c(View v){ new Handler().post(new Runnable() { @Override public void run() { webView.loadUrl("javascript:testa()"); } }); } }
html(raw目录下):
<html> <body> <script language="JavaScript"> function testa() { alert("hello js"); } </script> <font size=31 color=red οnclick="window.demo.clickon()">hello js</font> </body> </html>