2012-04-30 34 views
58

Tôi muốn thực hiện cuộc gọi đồng bộ với một số mã Java trong ứng dụng Android của mình.Gọi chức năng Java từ JavaScript qua Android WebView

Tôi đang sử dụng giải pháp này: https://stackoverflow.com/a/3338656

My Java mã:

final class MyWebChromeClient extends WebChromeClient { 
     public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
      Log.d("LogTag", message); 
      result.confirm(); 
      return true; 
     } 
    } 

My mã JavaScript:

<html> 
<script> 
function java_request(){ 
    alert('test'); 
} 
</script> 
<body> 
<h2>Welcome</h2> 
<div id="area"></div> 
<form> 
<input type="button" value="java_call" onclick="java_request()"> 
</form> 
</body> 
</html> 

Khi tôi bấm vào nút java_call, nút đi vào trạng thái ép. Tôi có thể thấy 'test' trong nhật ký bảng điều khiển. Mọi thứ đều bình thường cho đến đây.

Vấn đề là, nút không bao giờ quay trở lại trạng thái bình thường. Nó vẫn ở trạng thái ép. Có thể việc thực thi JavaScript bị hỏng hay gì đó?

Tại sao nút này không bao giờ trở về trạng thái bình thường?

Trả lời

81

Tôi không nghĩ đây là giải pháp tốt nhất để javascript thực thi mã java. Xem ở đây:

Nếu bạn muốn để lộ mã nguồn gốc với HTML để có thể được gọi thông qua javascript, làm như sau xung quanh xem khai web của bạn:

JavaScriptInterface jsInterface = new JavaScriptInterface(this); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.addJavascriptInterface(jsInterface, "JSInterface"); 

Khai báo lớp JavaScriptInterface:

public class JavaScriptInterface { 
    private Activity activity; 

    public JavaScriptInterface(Activity activiy) { 
     this.activity = activiy; 
    } 

    public void startVideo(String videoAddress){ 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.parse(videoAddress), "video/3gpp"); 
     activity.startActivity(intent); 
    } 
} 

Tôi đang khai báo một chức năng duy nhất để phát video, nhưng bạn có thể làm bất cứ điều gì bạn muốn.

Cuối cùng bạn gọi này trong nội dung WebView qua cuộc gọi javascript đơn giản:

<video width="320" height="240" controls="controls" poster='poster.gif' 
     onclick="window.JSInterface.startVideo('file:///sdcard/test.3gp');" > 
    Your browser does not support the video tag. 
</video> 

Ví dụ được lấy từ một câu trả lời của tôi, về chơi video, nhưng nên được giải thích đầy đủ.

EDIT Theo nhận xét của @ CedricSoubrie: nếu phiên bản đích của ứng dụng được đặt thành 17 hoặc cao hơn, bạn cần thêm chú thích @JavascriptInterface phía trên mỗi phương pháp bạn muốn xuất sang chế độ xem web.

+1

cảm ơn thông tin, tôi đã thấy giải pháp này. vì có một lỗi trong 2.3.X cho giải pháp này, tôi không muốn sử dụng nó. workaround là rất tuyệt vời. – ozkolonur

+0

@ozkolonur Tôi đã sử dụng tính năng này với tất cả các phiên bản Android 2.2+, chưa bao giờ thấy bất kỳ lỗi nào. Bạn có thể chia sẻ nó là gì không. Một liên kết cũng rất được hoan nghênh. –

+0

http://code.google.com/p/android/issues/detail?id=12987 – ozkolonur

1

Chức năng của bạn trả về 'true'. Điều đó làm cho thuộc tính 'onclick' của mã HTML của bạn bằng true, do đó nút vẫn được 'nhấp vào'.

Các vấn đề liên quan