首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android WebView JS 調用 Java:addJavascriptInterface 完整實現與安全最佳實踐

     編輯:程式設計綜合問答

核心機制

WebView.addJavascriptInterface(Object, String) 將 Java 物件暴露給 JavaScript,JS 端可透過指定名稱呼叫 Java 方法。

完整實現步驟

1. 定義 Java 介面類


public class JsBridge {
    private Context context;
    
    public JsBridge(Context context) {
        this.context = context;
    }
    
    @JavascriptInterface  // API 17+ 必須加此註解,否則方法不可見
    public void shareToSocial(String title, String content, String url) {
        // 在主執行緒執行 UI 操作
        new Handler(Looper.getMainLooper()).post(() -> {
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setType("text/plain");
            intent.putExtra(Intent.EXTRA_SUBJECT, title);
            intent.putExtra(Intent.EXTRA_TEXT, content + " " + url);
            context.startActivity(Intent.createChooser(intent, "分享到"));
        });
    }
    
    @JavascriptInterface
    public String getAppVersion() {
        try {
            return context.getPackageManager()
                .getPackageInfo(context.getPackageName(), 0).versionName;
        } catch (Exception e) {
            return "unknown";
        }
    }
}

2. WebView 配置與註冊


WebView webView = findViewById(R.id.webview);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);  // 必須啟用 JS
settings.setDomStorageEnabled(true);  // 支援 localStorage

// 註冊介面,JS 端透過 window.AndroidBridge 呼叫
webView.addJavascriptInterface(new JsBridge(this), "AndroidBridge");

// 載入頁面
webView.loadUrl("file:///android_asset/share.html");  // 或 https://...

3. HTML/JS 呼叫端


<button onclick="shareArticle()">分享</button>

<script>
function shareArticle() {
    var title = document.title;
    var content = "精彩文章推薦";
    var url = window.location.href;
    
    // 呼叫 Java 方法
    if (window.AndroidBridge) {
        window.AndroidBridge.shareToSocial(title, content, url);
    } else {
        alert("原生介面未就緒");
        // 降級:Web Share API 或複製連結
        if (navigator.share) {
            navigator.share({title, text: content, url});
        }
    }
}

// 獲取 App 版本
window.AndroidBridge.getAppVersion(function(version) {
    console.log("App 版本:" + version);
});

安全最佳實踐(必須遵守)

安全配置範例


webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // 域名白名單檢查
        if (!isTrustedDomain(url)) {
            view.removeJavascriptInterface("AndroidBridge");
            view.removeJavascriptInterface("searchBoxJavaBridge_");  // 移除系統預設
        }
    }
});

private boolean isTrustedDomain(String url) {
    return url.startsWith("https://myapp.com/") || url.startsWith("file:///android_asset/");
}

社會化分享完整流程

  1. JS 呼叫 AndroidBridge.shareToSocial(...)
  2. Java 建立 ACTION_SEND Intent
  3. 系統顯示分享選單 (微信、QQ、郵件、短信...)
  4. 用戶選擇目標 App 完成分享

總結

Android WebView JS 調用 Java 核心是 addJavascriptInterface + @JavascriptInterface。**安全第一**:僅暴露必要業務方法、強制 HTTPS/白名單域名、移除系統預設介面、API 17+ 環境。社會化分享用 ACTION_SEND Intent 讓系統選單處理,最兼容、零 SDK 依賴。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
風險對策
任意代碼執行 (API < 17)僅在 API 17+ 使用,強制加 @JavascriptInterface 註解,僅暴露必要方法
XSS 注入載入可信內容 (assets/自有域名);setAllowFileAccess(false)、setAllowContentAccess(false)
釣魚網站盜用介面onPageStarted 檢查 URL 域名,非白名單 removeJavascriptInterface
敏感資料洩漏不暴露取得 Token/密碼/個資的方法;僅暴露業務動作 (分享、支付、登入)