WebView與JS交互代碼沒(méi)有被調(diào)用問(wèn)題

WebView與JS交互代碼沒(méi)有被調(diào)用問(wèn)題

今天遇到一個(gè)需求,就是客戶(hù)端調(diào)用webview,客戶(hù)端點(diǎn)擊的時(shí)候服務(wù)端判斷有沒(méi)有登錄,登錄就可以進(jìn)行點(diǎn)贊、評(píng)論啥的,沒(méi)有登錄就調(diào)出Android原生的登錄界面。

  • html中通過(guò)js調(diào)用java代碼

    js中調(diào)用java代碼其實(shí)就記住一點(diǎn),webview設(shè)置一個(gè)和js交互的接口(注意這里只是一般的意思,并不是java中接口的含義),這個(gè)接口其實(shí)是一個(gè)一般的類(lèi),同時(shí)為這個(gè)接口取一個(gè)別名。這個(gè)過(guò)程如下:
    webView.addJavascriptInterface(new AndroidJSI(), “AndroidJSI”);
    new AndroidJSI()就是這個(gè)接口,AndroidJSI就是這個(gè)接口的別名。上面的代碼執(zhí)行之后在html的js中就能通過(guò)別名(這里是 “AndroidJSI”)來(lái)調(diào)用new AndroidJSI()類(lèi)中的任何方法。
    開(kāi)始的時(shí)候我是這么寫(xiě)的,發(fā)現(xiàn)沒(méi)有登錄的時(shí)候,點(diǎn)擊webview上的按鈕,并沒(méi)有調(diào)出登錄界面,如下:

private final class AndroidJSI {
      public void login() {
          if (!DataManager.isLogined()) {
              IntentUtil.gotoActivity(getContext(), LoginActivity.class);
          }
      }
  }

查找資料發(fā)現(xiàn):但是因?yàn)榘踩珕?wèn)題,在Android4.2中(如果應(yīng)用的android:targetSdkVersion數(shù)值為17+)JS只能訪問(wèn)帶有 @JavascriptInterface注解的Java函數(shù)。因此如果你的開(kāi)發(fā)版本比較高,需要在被調(diào)用的函數(shù)前加上@JavascriptInterface注解,如下:

private final class AndroidJSI {
      @JavascriptInterface
      public void login() {
          if (!DataManager.isLogined()) {
              IntentUtil.gotoActivity(getContext(), LoginActivity.class);
          }
      }
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容