├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── gzsll │ │ └── webviewjavascriptbridge │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── ExampleApp.html │ ├── java │ │ └── com │ │ │ └── gzsll │ │ │ └── webviewjavascriptbridge │ │ │ └── MainActivity.java │ └── res │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── gzsll │ └── webviewjavascriptbridge │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── gzsll │ │ └── jsbridge │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── WebViewJavascriptBridge.js │ ├── java │ │ └── com │ │ │ └── gzsll │ │ │ └── jsbridge │ │ │ ├── Logger.java │ │ │ ├── WVJBConstants.java │ │ │ ├── WVJBMessage.java │ │ │ ├── WVJBWebView.java │ │ │ └── WVJBWebViewClient.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── gzsll │ └── jsbridge │ └── ExampleUnitTest.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # files for the dex VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # generated files 12 | build/ 13 | bin/ 14 | gen/ 15 | out/ 16 | .gradle 17 | 18 | # Local configuration file (sdk path, etc) 19 | local.properties 20 | ant.properties 21 | proguard-project.txt 22 | build.xml 23 | 24 | # Eclipse project files 25 | .classpath 26 | .project 27 | 28 | # Proguard folder generated by Eclipse 29 | proguard/ 30 | 31 | # Intellij project files 32 | *.iml 33 | *.ipr 34 | *.iws 35 | .idea/ 36 | 37 | 38 | #Gradle Files 39 | gradle/ 40 | gradlew 41 | gradlew.bat 42 | local.properties 43 | *.keystore 44 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | WebViewJavascriptBridge -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 47 | 48 | 49 | 50 | 1.7 51 | 52 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | `WebViewJavascriptBridge for Android` is Cross-platform [WebViewJavascriptBridge](https://github.com/marcuswestin/WebViewJavascriptBridge) for Android Extension,the JavaScript interface compatible with [WebViewJavascriptBridge](https://github.com/marcuswestin/WebViewJavascriptBridge) 。 2 | 3 | ## Usage ## 4 | 5 | 1) Add following to the build.gradle of your project. 6 | 7 | ``` 8 | dependencies { 9 | compile 'com.gzsll.jsbridge:library:1.1.0' 10 | } 11 | ``` 12 | 13 | 2) Add `com.gzsll.jsbridge.WVJBWebView` to your layout, it is inherited from `WebView`. 14 | 15 | ```java 16 | webView.registerHandler("testJavaCallback", new WVJBWebView.WVJBHandler() { 17 | 18 | @Override 19 | public void request(Object data, WVJBWebView.WVJBResponseCallback callback) { 20 | Toast.makeText(MainActivity.this, "testJavaCallback called:" + data, Toast.LENGTH_LONG).show(); 21 | callback.callback("Response from testJavaCallback!"); 22 | } 23 | }); 24 | 25 | webView.callHandler("testJavascriptHandler", "{\"foo\":\"before ready\" }", new WVJBWebView.WVJBResponseCallback() { 26 | 27 | @Override 28 | public void callback(Object data) { 29 | Toast.makeText(MainActivity.this, "Java call testJavascriptHandler got response! :" + data, Toast.LENGTH_LONG).show(); 30 | } 31 | }); 32 | ``` 33 | 34 | ... 35 | 36 | 37 | 38 | 3) Copy and paste `setupWebViewJavascriptBridge` into your JS: 39 | 40 | ```javascript 41 | function setupWebViewJavascriptBridge(callback) { 42 | if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); } 43 | if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); } 44 | window.WVJBCallbacks = [callback]; 45 | var WVJBIframe = document.createElement('iframe'); 46 | WVJBIframe.style.display = 'none'; 47 | WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__'; 48 | document.documentElement.appendChild(WVJBIframe); 49 | setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0) 50 | } 51 | ``` 52 | 53 | 4) Finally, call `setupWebViewJavascriptBridge` and then use the bridge to register handlers and call Java handlers: 54 | 55 | 56 | ```javascript 57 | setupWebViewJavascriptBridge(function(bridge) { 58 | bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) { 59 | var responseData = { 'Javascript Says':'Right back atcha!' } 60 | responseCallback(responseData) 61 | }) 62 | 63 | var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button')) 64 | callbackButton.innerHTML = 'Fire testJavaCallback' 65 | callbackButton.onclick = function(e) { 66 | bridge.callHandler('testJavaCallback', {'foo': 'bar'}, function(response) { 67 | log('JS got response', response) 68 | }) 69 | } 70 | }) 71 | ``` 72 | 73 | 5) If you want to use `WebViewClient`,you must use like this 74 | ```java 75 | public class CustomWebViewClient extends WVJBWebViewClient { 76 | 77 | public CustomWebViewClient(WVJBWebView webView) { 78 | super(webView); 79 | } 80 | 81 | @Override 82 | public boolean shouldOverrideUrlLoading(WebView view, String url) { 83 | // do your work here 84 | // ... 85 | return super.shouldOverrideUrlLoading(view, url); 86 | } 87 | } 88 | 89 | ``` 90 | 91 | 6) Read Demo for more detail. 92 | 93 | 94 | 95 | API Reference 96 | ------------- 97 | 98 | ### Java API 99 | 100 | ##### `public void registerHandler(String handlerName, WVJBHandler handler)` 101 | 102 | Register a handler called `handlerName`. The javascript can then call this handler with `WebViewJavascriptBridge.callHandler("handlerName")`. 103 | 104 | 105 | ##### `public void callHandler(String handlerName)` 106 | ##### `public void callHandler(String handlerName, Object data)` 107 | ##### `public void callHandler(String handlerName, Object data,WVJBResponseCallback callback)` 108 | 109 | Call the javascript handler called `handlerName`. If a `WVJBResponseCallback` callback is given the javascript handler can respond. 110 | 111 | 112 | ### Javascript API 113 | 114 | ##### `bridge.registerHandler("handlerName", function(responseData) { ... })` 115 | 116 | Register a handler called `handlerName`. The Java can then call this handler with `public void callHandler(String handlerName, Object data)` and `public void callHandler(String handlerName, Object data,WVJBResponseCallback callback)` 117 | 118 | Example: 119 | 120 | ```javascript 121 | bridge.registerHandler("showAlert", function(data) { alert(data) }) 122 | bridge.registerHandler("getCurrentPageUrl", function(data, responseCallback) { 123 | responseCallback(document.location.toString()) 124 | }) 125 | ``` 126 | 127 | 128 | ##### `bridge.callHandler("handlerName", data)` 129 | ##### `bridge.callHandler("handlerName", data, function responseCallback(responseData) { ... })` 130 | 131 | Call an Java handler called `handlerName`. If a `responseCallback` function is given the Java handler can respond. 132 | 133 | Example: 134 | 135 | ```javascript 136 | bridge.callHandler("Log", "Foo") 137 | bridge.callHandler("getScreenHeight", null, function(response) { 138 | alert('Screen height:' + response) 139 | }) 140 | ``` 141 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.3" 6 | 7 | defaultConfig { 8 | applicationId "com.gzsll.webviewjavascriptbridge" 9 | minSdkVersion 14 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.1.1' 26 | compile project(':library') 27 | } 28 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/gzsll/webviewjavascriptbridge/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.gzsll.webviewjavascriptbridge; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/assets/ExampleApp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 |

WebViewJavascriptBridge Demo

12 | 59 |
60 | 61 | -------------------------------------------------------------------------------- /app/src/main/java/com/gzsll/webviewjavascriptbridge/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.gzsll.webviewjavascriptbridge; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.view.View; 6 | import android.webkit.WebView; 7 | import android.widget.Toast; 8 | 9 | import com.gzsll.jsbridge.WVJBWebView; 10 | import com.gzsll.jsbridge.WVJBWebViewClient; 11 | 12 | public class MainActivity extends AppCompatActivity { 13 | 14 | private static final String TAG = "WebViewJavascriptBridge"; 15 | 16 | 17 | private WVJBWebView webView; 18 | 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_main); 24 | webView = (WVJBWebView) findViewById(R.id.webView); 25 | webView.loadUrl("file:///android_asset/ExampleApp.html"); 26 | webView.setWebViewClient(new CustomWebViewClient(webView)); 27 | 28 | findViewById(R.id.call).setOnClickListener(new View.OnClickListener() { 29 | @Override 30 | public void onClick(View v) { 31 | webView.callHandler("testJavascriptHandler", "{\"greetingFromJava\": \"Hi there, JS!\" }", new WVJBWebView.WVJBResponseCallback() { 32 | 33 | @Override 34 | public void callback(Object data) { 35 | Toast.makeText(MainActivity.this, "testJavascriptHandler responded: " + data, Toast.LENGTH_LONG).show(); 36 | } 37 | }); 38 | } 39 | }); 40 | 41 | webView.registerHandler("testJavaCallback", new WVJBWebView.WVJBHandler() { 42 | 43 | @Override 44 | public void request(Object data, WVJBWebView.WVJBResponseCallback callback) { 45 | Toast.makeText(MainActivity.this, "testJavaCallback called:" + data, Toast.LENGTH_LONG).show(); 46 | callback.callback("Response from testJavaCallback!"); 47 | } 48 | }); 49 | 50 | webView.callHandler("testJavascriptHandler", "{\"foo\":\"before ready\" }", new WVJBWebView.WVJBResponseCallback() { 51 | 52 | @Override 53 | public void callback(Object data) { 54 | Toast.makeText(MainActivity.this, "Java call testJavascriptHandler got response! :" + data, Toast.LENGTH_LONG).show(); 55 | } 56 | }); 57 | 58 | } 59 | 60 | public class CustomWebViewClient extends WVJBWebViewClient { 61 | 62 | public CustomWebViewClient(WVJBWebView webView) { 63 | super(webView); 64 | } 65 | 66 | @Override 67 | public boolean shouldOverrideUrlLoading(WebView view, String url) { 68 | // do your work here 69 | // ... 70 | return super.shouldOverrideUrlLoading(view, url); 71 | } 72 | } 73 | 74 | 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | 10 |