Android 对接
在加载游戏H5的WebView中添加Js Bridge以供游戏调用
说明
安卓需实现两个接口以供游戏调用
window.JsBridge.recharge(); //余额不足,App弹出充值弹窗
window.JsBridge.quit(); //用户退出游戏,App关闭WebView同时,游戏提供一个接口以供 App 调用
window.rechargeSuccess(); //让用户在App完成充值时,App通知游戏刷新余额添加 Javascript Bridge
JsBridge 类
import android.webkit.JavascriptInterface;
public class JsBridge {
//仅为样例,可根据情况自行修改
private final WeakReference<Activity> activityWeakReference;
public JsBridge(Activity activity) {
activityWeakReference = new WeakReference(activity);
}
@JavascriptInterface
public void quit() {
//TODO: 关闭WebView,退出游戏
}
@JavascriptInterface
public void recharge() {
//TODO: 弹出充值弹窗
}
//App端调用H5提供的Javascript函数
//用户在App完成充值或通过其他方式产生余额变动时,通知游戏刷新余额
public static void notifyRechargeSuccess(WebView webView) {
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript:window.rechargeSuccess()");
}
});
}
}WebView 配置
webView.setWebViewClient(new WebViewClient());
webView.setBackgroundColor(Color.Transparent);
//添加Javascript Bridge
webView.addJavascriptInterface(new JsBridge(this), "JsBridge");
WebSettings settings = webView.getSettings();
//设置支持Javascript
settings.setJavaScriptEnabled(true);
//设置默认文本编码
settings.setDefaultTextEncodingName("UTF-8");
//设置可访问本地文件
settings.setAllowFileAccess(true);
//设置允许通过file url加载的Javascript读取全部资源(包括文件,http,https)
settings.setAllowUniversalAccessFromFileURLs(true);
//设置启用HTML5 DOM storage
settings.setDomStorageEnabled(true);
//设置开启数据库缓存
settings.setDatabaseEnabled(true);
//设置支持缩放
settings.setSupportZoom(true);
//设置自适应
settings.setUseWideViewPort(true);
//设置自动播放媒体
settings.setMediaPlaybackRequiresUserGesture(false);加载游戏 Zip 包 (可选)
仅需要通过 zip 方式接入的商户需要进行此项步骤,通过 H5 接入的商户无需进行此部分操作。
package com.game.demo;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
import java.io.FileInputStream;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = findViewById(R.id.webview);
File webRoot = new File(getExternalCacheDir() + File.separator + "TeenPatti" + File.separator); //此处可修改为其他路径或者其他文件夹命名
try {
if (!webRoot.exists()) {
webRoot.mkdir();
}
ZipHelper.unzip(new FileInputStream("/xxx/TeenPatti-1.0.zip"), webRoot.getAbsolutePath()); //此处替换为下载完成的实际zip文件路径
webView.loadUrl("file://" + webRoot.getAbsolutePath() + "/web-mobile/index.html?appId=xxx&userId=xxx&token=xxx"); //此处query参数需替换为实际参数
} catch (Exception e) {
Log.e("MainActivity", "Exception", e);
}
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.setWebViewClient(new WebViewClient());
}
}package com.game.demo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipHelper {
public static void unzip(InputStream is, String destDirectory) throws IOException {
File destDir = new File(destDirectory);
if (!destDir.exists()) {
destDir.mkdir();
}
ZipInputStream zipIn = new ZipInputStream(is);
ZipEntry entry = zipIn.getNextEntry();
while (entry != null) {
String filePath = destDirectory + File.separator + entry.getName();
if (!entry.isDirectory()) {
extractFile(zipIn, filePath);
} else {
File dir = new File(filePath);
dir.mkdir();
}
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
zipIn.close();
}
private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
FileOutputStream fos = new FileOutputStream(filePath);
byte[] buffer = new byte[1024];
int len;
while ((len = zipIn.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
}
}