android原生webview中调用JS方法并传递参数给JS遇到的问题

在使用webview时,需要给JS传递一个参数,之前前端同事把JS方法内容和html内容分离了,所以在使用下面的方法的时候一直显示方法未定义[INFO:CONSOLE(1)] "Uncaught ReferenceError: load is not defined", source:  (1),后来把JS方法写到html里,这个方法就可以调用了,因为是第一次做这个问题,所以不知道有没有直接调用单独JS文件里的方法

webview不能够正常加载JS的问题可以看我的另一篇文章 http://blog.csdn.net/weixue9/article/details/78324737,调用Js方法并传递参数的具体步骤如下:

通过 WebViewClient 的方法shouldOverrideUrlLoading ()回调拦截 url

具体原理:
1.Android通过 WebViewClient 的回调方法shouldOverrideUrlLoading ()拦截 url 
2.解析该 url 的协议 
3.如果检测到是预先约定好的协议,就调用相应方法,即JS需要调用Android的方法

具体使用:
步骤1:在JS约定所需要的Url协议
JS代码:javascript.html,以.html格式放到src/main/assets文件夹里



   
     
      Carson_Ho

     



   
     
   


当该JS通过Android的mWebView.loadUrl("file:///android_asset/javascript.html")加载后,就会回调shouldOverrideUrlLoading (),接下来继续看步骤2:
步骤2:在Android通过WebViewClient复写shouldOverrideUrlLoading()

public class MainActivity extends AppCompatActivity {
    WebView mWebView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = mWebView.getSettings();
        // 设置与Js交互的权限
        webSettings.setJavaScriptEnabled(true);
        // 设置允许JS弹窗
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        // 步骤1:加载JS代码
        // 格式规定为:file:///android_asset/文件名.html
        mWebView.loadUrl("file:///android_asset/javascript.html");
        // 复写WebViewClient类的shouldOverrideUrlLoading方法
        mWebView.setWebViewClient(new WebViewClient() {
              @Override
              public boolean shouldOverrideUrlLoading(WebView view, String url) {
                  // 步骤2:根据协议的参数,判断是否是所需要的url
                  // 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)
                  //假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的)
                  Uri uri = Uri.parse(url);                                 
                  // 如果url的协议 = 预先约定的 js 协议
                  // 就解析往下解析参数
                  if ( uri.getScheme().equals("js")) {
                      // 如果 authority  = 预先约定协议里的 webview,即代表都符合约定的协议
                      // 所以拦截url,下面JS开始调用Android需要的方法
                      if (uri.getAuthority().equals("webview")) {
                         //  步骤3:
                          // 执行JS所需要调用的逻辑
                          System.out.println("js调用了Android的方法");
                          // 可以在协议上带有参数并传递到Android上
                          HashMap params = new HashMap<>();
                          Set collection = uri.getQueryParameterNames();
                      }
                      return true;
                  }
                  return super.shouldOverrideUrlLoading(view, url);
              }
          }

特点

优点:不存在JS代码调用一定要在 onPageFinished() 回调之后才能调用,否则不会调用。;
缺点:JS获取Android方法的返回值复杂。如果JS想要得到Android方法的返回值,只能通过WebView的loadUrl()去执行JS方法把返回值传递回去,相关的代码如下:

// Android:MainActivity.java
mWebView.loadUrl("javascript:returnResult(" + result + ")");

// JS:javascript.html
function returnResult(result){
    alert("result is" + result);
}


上面的方法是借鉴http://www.jianshu.com/p/345f4d8a5cfa的方法

你可能感兴趣的:(Android问题及解决)