Combo Game

Android 对接

在加载游戏H5的WebView中添加Js Bridge以供游戏调用

说明

安卓需实现两个接口以供游戏调用

window.JsBridge.recharge(); //余额不足,App弹出充值弹窗
window.JsBridge.quit(); //用户退出游戏,App关闭WebView

同时,游戏提供一个接口以供 App 调用

window.rechargeSuccess(); //让用户在App完成充值时,App通知游戏刷新余额

添加 Javascript Bridge

JsBridge 类

JsBridge.java
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 配置

Activity.java
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 接入的商户无需进行此部分操作。

Activity.java
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());
    }
}
ZipHelper.java
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();
    }
}