接入 Android

更新时间:
复制为 MD 格式

本文介绍了接入小程序小游戏的流程和部分使用小程序小游戏的内容。

前置条件

已经开通并接入 mPaaS,更多内容请参考 选择接入方式

安装组件和依赖

修改项目根目录 build.gradle

  1. 增加 mvn 仓库。

    maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
    maven {
        credentials {
            username "mvn_read_ws"
            password "mrk8929"
        }
        url "http://mvn.cloud.alipay.com/nexus/content/repositories/releases/"
    }
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    maven {
        url 'http://maven.aliyun.com/nexus/content/repositories/google/'
        name 'aliyun-google'
    }
    maven {
        credentials {
            username '617696fc6970513e6e677c83'
            password '2qAa=hHdfLOp'
        }
        url 'https://packages.aliyun.com/63dc774a9dee9309492b993a/maven/repo-jpkdy'
    }
  2. 在 buildscript 中增加配置。

    buildscript {
        ext.mpaas_artifact = "mpaas-baseline-cp_change_56100909"
        ext.mpaas_baseline = "23"
        repositories {
            mavenLocal()
            maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
            maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
            maven {
                credentials {
                    username "mvn_read_ws"
                    password "mrk8929"
                }
                url "http://mvn.cloud.alipay.com/nexus/content/repositories/releases/"
            }
            google()
            maven {
                url 'http://maven.aliyun.com/nexus/content/repositories/google/'
                name 'aliyun-google'
            }
        }
        dependencies {
            classpath 'com.android.boost.easyconfig:easyconfig:2.6.7' // 根据项目实际gradle版本修改版本号
            classpath 'com.android.tools.build:gradle:4.0.1' // 使用项目实际的gradle版本
        }
    }

申请游戏依赖的 mPaaS 内核 key

申请游戏依赖的 mPaaS 内核 key 请参考 接入 mPaaS 内核

修改 app 下的 build.gradle

增加依赖和 configuration。

android {
    ...


    configurations {
        all*.exclude group: 'com.mpaas.mriver', module: 'mriveruc-build' // 移除
        all*.exclude module: 'nebulaucsdk-build'
    }

}

dependencies {
    ...
    implementation platform("com.mpaas.android:$mpaas_artifact:$mpaas_baseline")
    implementation 'com.mpaas.android:minigame' // 小游戏
}

基线版本

小程序小游戏支持自定义基线版本

ext.mpaas_artifact = "mpaas-baseline-cp_change_56100909"

ext.mpaas_baseline = "23"

在项目的 build.gradle 中配置 mPaaS 基线:

buildscript {
    ext.mpaas_artifact = "mpaas-baseline-cp_change_56100909"
    ext.mpaas_baseline = "23"
    ...
    ...
}

API

初始化

import android.app.Application;
import android.util.Log;
import com.mpaas.core.MP;
import com.mpaas.core.MPInitParam;
import com.mpaas.mas.adapter.api.MPLogger;
import com.mpaas.mriver.api.init.MriverInitParam;
import com.mpaas.mriver.nebula.api.uc.MRUCInitCallback;
import com.mpaas.mriver.nebula.api.uc.MRUCService;
import com.mpaas.mriver.xriver.XRiver;
import com.mpaas.uc.dynamic.api.MPUCDynamicInit;

public class MRiverApp extends Application implements MPInitParam.MPCallback{

    private static final String TAG = "MRiverApp";

    @Override
    public void onCreate() {
        super.onCreate();
        MP.init(this, createInitParams());
    }

    @Override
    public void onInit() {
        MPLogger.setUserId("xxxx"); // 设置userId,用来白名单灰度、IDE扫码预览使用
    }

    MPInitParam createInitParams() {
        final MriverInitParam mriverInitParam = MriverInitParam.getDefault();
        mriverInitParam.setMriverInitCallback(new MriverInitParam.MriverInitCallback() {
            @Override
            public void onInit() {
                XRiver.init();
            }

            @Override
            public void onError(Exception e) {
            }
        });
        return MPInitParam.obtain().setCallback(this).addComponentInitParam(mriverInitParam);
    }


}

配置拦截 RPC(广告依赖)

//初始化完成时
Mriver.setProxy(MRGameRpcProxy.class, new MRGameRpcProxy() {
            @Override
            public boolean rpc(String s, Object o, JSONObject jsonObject, App app, Page page, int i, String s1, boolean b, BridgeCallback bridgeCallback) {
                if (!TextUtils.isEmpty(s) && s.contains("querygamedefaultad")) {
                    JSONObject data = new JSONObject();
                    data.put("success", false);
                    bridgeCallback.sendJSONResponse(data);
                }

                return true;
            }
        });

启动游戏

XRiver.startApp("appId"); // appId表示后台发布的游戏id

账号授权

客户端注入 my.getAuthCode() 能力

初始化完成后设置 proxy。在客户端注入 my.getAuthCode() 能力,直接返回的 openId 即为游戏所需要的用户 ID。

Mriver.setProxy(RVOpenAuthProxy.class, new RVOpenAuthProxy() {
            @Override
            public void getAuthAccountInfo(Context context, List<String> list, String s, boolean b, Page page, IAuthCallback iAuthCallback) {
                // ignore
                iAuthCallback.onSuccess(BridgeResponse.SUCCESS.get());
            }

            @Override
            public void auth(Context context, Page page, String sessionId, List<String> scope, Map<String, String> map, boolean b, Bundle bundle, IAuthCallback iAuthCallback) {
                // handle authCode request
                // auth_base表示静默授权,不会弹申请窗;auth_user会弹出申请弹窗
                if (scope != null && (scope.contains("auth_user") || scope.contains("auth_base")) && page.getApp() != null) {
                    String appId = page.getApp().getAppId();
                    
                    // 从App服务端获取authCode/openId
                    String authCode = requestAuthCodeFromSuperAppServer(appId);
                    String openId = requestOpenIdFromSuperAppServer(appId);
                    
                    if (!TextUtils.isEmpty(authCode)) {
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("authCode", authCode);
                        jsonObject.put("openId", openId); // 返回openId
                        iAuthCallback.onSuccess(jsonObject); // callback to miniprogram
                    } else {
                        iAuthCallback.onFail(-1, "auth code request err");
                    }
                }
            }

            @Override
            public boolean appxRpc(JSONObject jsonObject, BridgeCallback bridgeCallback) {
                // ignore
                bridgeCallback.sendJSONResponse(BridgeResponse.SUCCESS.get());
                return true;
            }
        });

广告

方式一

内置穿山甲模式,只需配置广告位。注册获取广告信息的接口,注入广告数据。

Mriver.setProxy(MRGameAdProxy.class, new MRGameAdProxy() {
    /**
    * appId: 小游戏id
    * adType: 广告类型: 0 激励视频广告; 1 banner广告; 2 插屏/全屏广告
    **/
    @Override
    public void getGameAdInfo(String appId, App app, int adType, GameAdInfoCallback callback) {
        Map<String, String> adInfo = new HashMap();
        if (adType == 1) {
          adInfo.put("code", "xxx"); // 添加广告位信息
        } else {
        }
        if (callback != null) {
          callback.onCallback(adInfo);
        }
    }
});

方式二

自定义广告显示。

 Mriver.setProxy(MiniAdShowProxy.class, new MiniAdShowProxy() {
            @Override
            public void showAd(String s, Page page, int i, MiniGameAdShowCallback miniGameAdShowCallback) {
                
            }
        });

数据埋点监听

初始化时设置数据埋点监听。

Mriver.setProxy(PaladinGameTracker.class, new PaladinGameTracker() {

            @Override
            public void gamePageAppear(Activity activity, String appId, String subPageToken, String channelInfo) {
                // 游戏第一次打开或者页面从后台切换到前台
                Log.i(TAG, "gamePageAppear: " + appId);
            }

            @Override
            public void gamePageDisappear(Activity activity, String appId, String subPageToken, String channelInfo) {
                // 游戏退出或者切换到后台
                Log.i(TAG, "gamePageDisappear: " + appId);
            }
        });