926 lines
27 KiB
C#
926 lines
27 KiB
C#
// ***********************************************************************
|
||
// Assembly : Game
|
||
// Author : Kimch
|
||
// Created : 2021-05-02
|
||
// Description :
|
||
// Last Modified By :
|
||
// Last Modified On :
|
||
// ***********************************************************************
|
||
// <copyright file= "KPlatform.OneSDKPlatform" company="Kunpo"></copyright>
|
||
// <summary></summary>
|
||
// ***********************************************************************
|
||
#if SDK_ONESDK
|
||
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using ByteDance.OneSDK;
|
||
using UnityEngine;
|
||
|
||
namespace G
|
||
{
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
partial class KPlatform
|
||
{
|
||
/// <summary>
|
||
/// 平台实现
|
||
/// </summary>
|
||
public class OneSDKPlatform : MonoBehaviour, IPlatformWapper
|
||
{
|
||
#region 初始化
|
||
|
||
private void Start()
|
||
{
|
||
this.Init();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 游戏SDK初始化,仅Android端
|
||
/// Init for Android client.
|
||
/// </summary>
|
||
public void Init()
|
||
{
|
||
Log.D("OneSdk init start");
|
||
// 初始化sdk,必加
|
||
ZjSdkApi.Instance().Init(OnInitSuccess, OnInitFail);
|
||
// 监听返回键,调用退出,必加
|
||
ZjAndroidApi.Instance().listenerBackBtnPressed(OnBackBtnPressed);
|
||
}
|
||
|
||
private void OnBackBtnPressed()
|
||
{
|
||
// 监听返回键,调用退出
|
||
Log.D("OneSdk OnBackBtnPressed");
|
||
// 如果游戏有多级页面,游戏想返回到上一级页面,可以在这里返回到上一级页面(不然会直接调用exitSample接口,拉起退出ui)
|
||
// 如果游戏在这里,已经是顶层页面了,请务必调用exitSample接口
|
||
// 或者:游戏可以简单处理,直接调用exitSample
|
||
|
||
// 游戏有多级页面,并且成功处理掉返回键
|
||
//if (GamePageLevel.HandleBackSuccess())
|
||
//{
|
||
// Log.D("返回键被游戏的多级页面消耗掉了");
|
||
//}
|
||
//else
|
||
//{
|
||
// // 游戏不需要处理返回键了,调用退出
|
||
// Log.D("游戏在最顶层页面了,调用退出");
|
||
// ExitFunctionScript.Instance.exitSample();
|
||
//}
|
||
exitSample();
|
||
}
|
||
|
||
private void OnInitSuccess()
|
||
{
|
||
Log.D("OneSdk init success");
|
||
// 对于小米渠道
|
||
// 该接⼝必须在⽤⼾选择同意隐私协议(游戏⾃⼰的隐私协议)之后调⽤,否则⽆法正常登录;若⽤⼾拒绝隐私协议,不可调⽤该接⼝,且⽆法登录
|
||
// 注:SDK本⾝不会弹出任何隐私协议,隐私协议游戏内⾃⾏设计实现,并且在游戏隐私协议中附加⼩⽶SDK隐私协议:本游戏接⼊了⼩⽶游戏服务 SDK,提供登录和⽀付以及实名制服务,所收集信息请阅读《⼩⽶游戏服务隐私政策》
|
||
ZjSdkApi.Instance().onUserAgreed();
|
||
//UserProxy.DeviceID = lgInitSuccessInfo.DeviceID;
|
||
KPlatform.Instance.OnInitSuccess();
|
||
if ("xiaomi".Equals(GetChannelId()))
|
||
{
|
||
var privacyRoot = transform.Find("Privacy");
|
||
if (privacyRoot)
|
||
privacyRoot.gameObject.SetActive(true);
|
||
}
|
||
}
|
||
|
||
private void OnInitFail(string error)
|
||
{
|
||
Log.D("OneSdk init fail:" + error);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 登录
|
||
|
||
public void NormalLogin()
|
||
{
|
||
ZjSdkApi.Instance().Login(OnLoginSuccess, OnLoginFail, OnLoginCancel);
|
||
}
|
||
|
||
public void SwitchAccount()
|
||
{
|
||
}
|
||
|
||
public void VisitorBindAccount()
|
||
{
|
||
}
|
||
|
||
public bool IsVisitor()
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public void ClearToken()
|
||
{
|
||
}
|
||
|
||
// 登录成功
|
||
// loginResult 包含access_token,openId,serect
|
||
private void OnLoginSuccess(LoginResult loginResult)
|
||
{
|
||
Log.D("登录成功");
|
||
string accessToken = loginResult.access_token;
|
||
string secret = loginResult.secret;
|
||
string openId = loginResult.openId;
|
||
Log.D("登录openId:" + openId);
|
||
Log.D("登录secret:" + secret);
|
||
Log.D("登录accessToken:" + accessToken);
|
||
//ToastManager.Instance.ShowToast("登录openId:" + openId + "\n" + "登录secret:" + secret + "\n" +
|
||
//"登录accessToken:" + accessToken);
|
||
|
||
KPlatform.Instance.OnLoginSuccess(openId, accessToken, 100, 1);
|
||
// demo示例使用
|
||
//LoginState.SetLoginSuccess();
|
||
|
||
HuaweiGetUserGameDuration();
|
||
}
|
||
|
||
// 登录失败
|
||
private void OnLoginFail(int code, string msg)
|
||
{
|
||
Log.D("登录失败:code=" + code + ",msg:" + msg);
|
||
//ToastManager.Instance.ShowToast("登录失败:code=" + code + ",msg:" + msg);
|
||
KPlatform.Instance.OnLoginFail(code, msg, 1);
|
||
}
|
||
|
||
// 登录取消
|
||
private void OnLoginCancel(string error)
|
||
{
|
||
Log.D("登录取消:" + error);
|
||
//ToastManager.Instance.ShowToast("登录取消:" + error);
|
||
KPlatform.Instance.OnLoginCancel(error);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 广告
|
||
|
||
public class AdSlotConstant
|
||
{
|
||
public static string SPLASH_CODE_H = "splash_h";
|
||
public static string SPLASH_CODE_V = "splash_v";
|
||
|
||
public static string REWARD_CODE_H = "reward_h";
|
||
public static string REWARD_CODE_V = "reward_v";
|
||
|
||
public static string INTERSTITIAL_CODE_H = "interstitial_h";
|
||
public static string INTERSTITIAL_CODE_V = "interstitial_v";
|
||
|
||
public static string BANNER_CODE = "banner";
|
||
}
|
||
|
||
public class AdLoadHelper
|
||
{
|
||
private static bool _hasSdkInitSuccess = false;
|
||
private static Action _onSdkInitSuccess;
|
||
|
||
private static bool IsOppo()
|
||
{
|
||
return "oppo".Equals(ZjSdkApi.Instance().GetChannelId());
|
||
}
|
||
|
||
public static void EnsureAdPermissionRequestSuccess(Action onSdkInitSuccess)
|
||
{
|
||
if (_hasSdkInitSuccess)
|
||
{
|
||
onSdkInitSuccess.Invoke();
|
||
return;
|
||
}
|
||
|
||
EnsureInitSuccessInner(onSdkInitSuccess);
|
||
}
|
||
|
||
private static void EnsureInitSuccessInner(Action onSdkInitSuccess)
|
||
{
|
||
ReleaseStaticRef();
|
||
_onSdkInitSuccess = onSdkInitSuccess;
|
||
|
||
// 非oppo渠道不用强制要求 READ_PHONE_STATE 和 WRITE_EXTERNAL_STORAGE权限
|
||
// || ZjAdApi.Instance().isInitSuccess()
|
||
if (!IsOppo())
|
||
{
|
||
//Log.D("广告sdk必要权限申请成功了:return");
|
||
_hasSdkInitSuccess = true;
|
||
onSdkInitSuccess.Invoke();
|
||
return;
|
||
}
|
||
|
||
// oppo渠道要强制READ_PHONE_STATE和WRITE_EXTERNAL_STORAGE权限,不然广告sdk初始化不成功,这里需要检查广告sdk是否初始化成功了
|
||
// 初始化成功=================>直接加载广告
|
||
// 没有初始化成功,有权限========>初始化,加载广告
|
||
// 没有初始化成功,没权限========>申请权限,初始化,加载广告
|
||
|
||
// cp假如有必须权限,可以添加上,避免重复申请
|
||
// 用法如下:
|
||
// UnityPermissionHelper unityPermissionHelper = new UnityPermissionHelper();
|
||
// unityPermissionHelper
|
||
// .WithPermission("cp自己需要的必要权限,第二个参数传true",true)
|
||
// .WithPermission("cp自己需要的可选权限,第二个参数传false",false)
|
||
// .StartRequest(
|
||
// "必要权限申请成功",
|
||
// "必要权限申请失败,可以再次申请",
|
||
// "必要权限申请失败,用户点了不再提示,只能跳设置打开");
|
||
|
||
|
||
// 这里直接申请权限,假如已经有权限了,会立刻回调权限申请成功
|
||
UnityPermissionHelper unityPermissionHelper = new UnityPermissionHelper();
|
||
unityPermissionHelper.StartRequest(OnNecessaryPermissionAgree,
|
||
OnNecessaryPermissionDeny,
|
||
OnNecessaryPermissionOnlySetting);
|
||
}
|
||
|
||
// Action<List<string>> onNecessaryPermissionOnlySetting,
|
||
// Action onNecessaryPermissionAgree, Action<List<string>> onNecessaryPermissionDeny
|
||
|
||
// ######################权限处理开始########################
|
||
|
||
// 必要权限申请成功
|
||
private static void OnNecessaryPermissionAgree()
|
||
{
|
||
_hasSdkInitSuccess = true;
|
||
// 再次初始化sdk
|
||
ReInitAdSdk();
|
||
}
|
||
|
||
// 必要权限申请拒绝,用户没有点不再提示,可以再次申请
|
||
private static void OnNecessaryPermissionDeny(List<string> permissions)
|
||
{
|
||
if (_onSdkInitSuccess == null)
|
||
{
|
||
Log.D("非法状态异常: _onSdkInitSuccess=null");
|
||
return;
|
||
}
|
||
|
||
// 这里只是demo简单展示,实际情况,cp需要做自己的逻辑处理(是直接申请,还是提示用户后再申请)
|
||
EnsureInitSuccessInner(_onSdkInitSuccess);
|
||
}
|
||
|
||
|
||
// 必要权限,用户点了,不再提示,只能跳设置打开
|
||
private static void OnNecessaryPermissionOnlySetting(List<string> permissions)
|
||
{
|
||
// 这里只是demo简单展示,实际情况,cp需要解释说明,引导用户在设置开启权限
|
||
Log.D("请在设置打开READ_PHONE_STATE和WRITE_EXTERNAL_STORAGE权限,否则可能会导致广告功能异常");
|
||
//ToastManager.Instance.ShowToast("请在设置打开READ_PHONE_STATE和WRITE_EXTERNAL_STORAGE权限,否则可能会导致广告功能异常");
|
||
UnityPermissionHelper.JumpSetting();
|
||
ReleaseStaticRef();
|
||
}
|
||
// ######################权限处理结束########################
|
||
|
||
|
||
// ######################广告再次初始化开始########################
|
||
|
||
//
|
||
private static void ReInitAdSdk()
|
||
{
|
||
ZjAdApi.Instance().init(OnAdSdkInitSuccess, OnAdSdkInitFail);
|
||
}
|
||
|
||
private static void OnAdSdkInitSuccess()
|
||
{
|
||
Log.D("--->获取到必要权限,初始化广告sdk成功");
|
||
_onSdkInitSuccess?.Invoke();
|
||
|
||
ReleaseStaticRef();
|
||
}
|
||
|
||
private static void OnAdSdkInitFail(int code, string msg)
|
||
{
|
||
Log.D("--->获取到必要权限,初始化广告sdk失败,错误码code=" + code + ",msg=" + msg);
|
||
|
||
ReleaseStaticRef();
|
||
}
|
||
|
||
// 释放资源,避免内存泄露
|
||
private static void ReleaseStaticRef()
|
||
{
|
||
_onSdkInitSuccess = null;
|
||
}
|
||
|
||
// ######################广告再次初始化结束########################
|
||
}
|
||
|
||
private ZjRewardVideoAd _rewardAd;
|
||
// 是否正在加载广告
|
||
private bool isLoadingAd;
|
||
|
||
public void LoadRewardVideoAd_V()
|
||
{
|
||
// 确保sdk的广告权限申请成功
|
||
AdLoadHelper.EnsureAdPermissionRequestSuccess(() =>
|
||
{
|
||
Log.D("权限申请成功LOAD_REWARD_AD_VER");
|
||
LoadRewardVideoAd(ZjBaseAdParams.ORIENTATION_VERTICAL, AdSlotConstant.REWARD_CODE_V);
|
||
});
|
||
}
|
||
|
||
public int ShowRewardAd(string scene)
|
||
{
|
||
if (this.isLoadingAd)
|
||
{
|
||
//ToastManager.Instance.ShowToast("广告正在加载中...");
|
||
return 1;
|
||
}
|
||
|
||
if (this._rewardAd == null)
|
||
{
|
||
//Log.E("请先加载广告");
|
||
//ToastManager.Instance.ShowToast("请先加载广告");
|
||
return 2;
|
||
}
|
||
|
||
// 注册监听
|
||
RegisterRewardVideoAdInteractionListener();
|
||
|
||
this._rewardAd.show();
|
||
|
||
return 0;
|
||
}
|
||
|
||
// 加载激励视频广告
|
||
private void LoadRewardVideoAd(int orientation, string codeId)
|
||
{
|
||
if (this.isLoadingAd)
|
||
{
|
||
//ToastManager.Instance.ShowToast("广告正在加载中...");
|
||
return;
|
||
}
|
||
|
||
if (this._rewardAd != null)
|
||
{
|
||
PrintD("广告已经加载");
|
||
//ToastManager.Instance.ShowToast("广告已经加载");
|
||
return;
|
||
}
|
||
|
||
// 激励视频加载错误监听
|
||
ZjAdApi.RewardVideoAd_OnError = (code, message) =>
|
||
{
|
||
this.isLoadingAd = false;
|
||
KPlatform.Instance.OnRewardVideoAdLoadError(code, message);
|
||
var lastMsg = "激励视频加载失败-- code : " + code + "--message : " + message;
|
||
this.PrintD(lastMsg);
|
||
//ToastManager.Instance.ShowToast(lastMsg);
|
||
};
|
||
|
||
// 激励视频加载成功
|
||
ZjAdApi.RewardVideoAd_OnRewardVideoAdLoad = (rewardVideoAd) =>
|
||
{
|
||
this.isLoadingAd = false;
|
||
this._rewardAd = rewardVideoAd;
|
||
KPlatform.Instance.OnRewardVideoAdLoad();
|
||
|
||
//this.PrintD("激励视频加载成功");
|
||
//ToastManager.Instance.ShowToast("激励视频加载成功");
|
||
};
|
||
|
||
var rewardVideoAdDto = new ZjRewardVideoAdParams();
|
||
|
||
rewardVideoAdDto.codeId = codeId;
|
||
// 视频方向
|
||
rewardVideoAdDto.videoPlayOrientation = orientation;
|
||
|
||
rewardVideoAdDto.userId = "user123"; // necessary param .用户id,必传参数
|
||
rewardVideoAdDto.rewardName = "金币"; // 奖励的名称
|
||
rewardVideoAdDto.rewardAmount = 5; // 奖励的数量
|
||
rewardVideoAdDto.mediaExtra = "media_extra"; // 附加参数,可选
|
||
|
||
ZjAdApi.Instance().LoadRewardVideoAd(rewardVideoAdDto);
|
||
this.isLoadingAd = true;
|
||
}
|
||
|
||
// 注册激励视频广告交互监听
|
||
private void RegisterRewardVideoAdInteractionListener()
|
||
{
|
||
ZjRewardVideoAd.OnReward = this.OnRewardVerify;
|
||
ZjRewardVideoAd.OnAdShow = this.OnAdShow;
|
||
ZjRewardVideoAd.OnAdClick = this.OnRewardClick;
|
||
|
||
|
||
ZjRewardVideoAd.OnVideoPlayStart = this.OnVideoPlayStart;
|
||
ZjRewardVideoAd.OnVideoPlayComplete = this.OnVideoPlayComplete;
|
||
ZjRewardVideoAd.OnVideoPlayError = this.OnVideoPlayError;
|
||
ZjRewardVideoAd.OnVideoPlaySkip = this.OnVideoPlaySkip;
|
||
ZjRewardVideoAd.OnVideoPlayClose = this.OnVideoPlayClose;
|
||
|
||
ZjRewardVideoAd.OnLandingPageOpen = this.OnLandingPageOpen;
|
||
ZjRewardVideoAd.OnLandingPageClose = this.OnLandingPageClose;
|
||
}
|
||
|
||
private void OnLandingPageClose()
|
||
{
|
||
ReleaseAdObject();
|
||
this.PrintD("OnLandingPageClose");
|
||
}
|
||
|
||
private void OnLandingPageOpen()
|
||
{
|
||
ReleaseAdObject();
|
||
this.PrintD("OnLandingPageOpen");
|
||
}
|
||
|
||
private void OnVideoPlayClose(long var)
|
||
{
|
||
this.ReleaseAdObject();
|
||
KPlatform.Instance.OnRewardedAdClosed();
|
||
this.PrintD("onRewardedAdClosed");
|
||
}
|
||
|
||
private void OnVideoPlaySkip()
|
||
{
|
||
this.ReleaseAdObject();
|
||
KPlatform.Instance.OnSkippedVideo();
|
||
this.PrintD("onSkippedVideo");
|
||
}
|
||
|
||
private void OnVideoPlayError(int code, string msg)
|
||
{
|
||
this.ReleaseAdObject();
|
||
KPlatform.Instance.OnVideoError();
|
||
this.PrintD("onVideoError");
|
||
}
|
||
|
||
private void OnVideoPlayComplete()
|
||
{
|
||
this.ReleaseAdObject();
|
||
KPlatform.Instance.OnVideoComplete();
|
||
KPlatform.Instance.OnRewardVerify(true, 1, "");
|
||
KPlatform.Instance.OnRewardedAdClosed();
|
||
this.PrintD("onVideoComplete");
|
||
}
|
||
|
||
private void OnVideoPlayStart()
|
||
{
|
||
this.PrintD("OnVideoPlayStart");
|
||
}
|
||
|
||
private void OnAdShow()
|
||
{
|
||
KPlatform.Instance.OnRewardedAdShow();
|
||
this.PrintD("onRewardedAdShow");
|
||
}
|
||
|
||
private void OnRewardClick(long var)
|
||
{
|
||
this.ReleaseAdObject();
|
||
KPlatform.Instance.OnRewardClick();
|
||
this.PrintD("onRewardClick");
|
||
}
|
||
|
||
private void OnRewardVerify()
|
||
{
|
||
this.ReleaseAdObject();
|
||
KPlatform.Instance.OnRewardVerify(true, 1, "");
|
||
this.PrintD("onRewardVerify");
|
||
}
|
||
|
||
// 释放广告对象
|
||
public void ReleaseAdObject()
|
||
{
|
||
this._rewardAd?.destroy();
|
||
this._rewardAd = null;
|
||
}
|
||
|
||
private void PrintD(string msg)
|
||
{
|
||
Log.D("LG_MediationAdTAG" + msg);
|
||
}
|
||
|
||
private void PrintE(string msg)
|
||
{
|
||
//Log.E(AdFunctionScript.LG_MediationAdTAG + msg);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 支付
|
||
|
||
string currentCpOrderId;
|
||
// 支付强烈要求cp根据服务端回调来发货,客户端回调存在不准和一定的安全性风险
|
||
// 假如一定只是依靠客户端发货的话:
|
||
// 1.游戏客户端自行记录订单和发货状态;
|
||
// 2.针对状态未知的订单,在每次启动并登录成功后,调SDK服务端的[查询订单状态接口]查询订单是否成功支付;
|
||
// 3.若订单已成功支付了,并且没有发货,就执行发货,更新CP自己记录的订单状态,防止重复发货,并调用「4.7.3 上报订单完成」。
|
||
public void paySample()
|
||
{
|
||
string cpOrderId = DateTime.Now.Millisecond + "";
|
||
currentCpOrderId = cpOrderId;
|
||
PayParam payParam = new PayParam()
|
||
.setCpOrderId(cpOrderId)
|
||
.setCount(1) //购买数量,默认为1
|
||
.setPrice(1) //商品单价,单位分 // 小米支付最低1元起
|
||
.setServerName("世外桃源") //服务器名称
|
||
.setServerID("1") //服务器id
|
||
.setRoleName("小智") //角色名称
|
||
.setRoleID("1") //角色id
|
||
.setProductDesc("充值1毛,赠送10钻石") //商品描述
|
||
.setProductName("60晶石") //商品名称
|
||
.setProductId("1") //商品id
|
||
.setCpNotifyUrl("https://baidu.com")
|
||
.setExtend("cpOrderId"); //透传字段,回原样返回通知游戏服务器
|
||
|
||
// Action onPaySuccess, Action<int, string> onPayFail,
|
||
// Action<string> onPayCancel
|
||
ZjSdkApi.Instance().Pay(payParam, onPaySuccess, onPayFail, onPayCancel);
|
||
}
|
||
|
||
//#######################支付的回调开始#######################
|
||
|
||
// 支付成功
|
||
private void onPaySuccess()
|
||
{
|
||
Log.D("支付成功");
|
||
//ToastManager.Instance.ShowToast("支付成功");
|
||
|
||
List<string> success = new List<string>();
|
||
success.Add(currentCpOrderId);
|
||
// cp发货后,正常支付成功、或者补单成功的都需要上报订单完成。
|
||
ZjSdkApi.Instance().ReportOrderComplete(success);
|
||
}
|
||
|
||
// 支付失败
|
||
private void onPayFail(int code, string msg)
|
||
{
|
||
Log.D("支付失败:code=" + code + ",msg:" + msg);
|
||
//ToastManager.Instance.ShowToast("支付失败:code=" + code + ",msg:" + msg);
|
||
}
|
||
|
||
// 支付取消
|
||
private void onPayCancel(string error)
|
||
{
|
||
Log.D("支付取消:" + error);
|
||
//ToastManager.Instance.ShowToast("支付取消:" + error);
|
||
}
|
||
|
||
//#######################支付的回调结束#######################
|
||
|
||
#endregion
|
||
|
||
#region 兑换码
|
||
|
||
//输入的兑换码
|
||
public void Redeem(string redeemCode)
|
||
{
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Event && ABTest
|
||
|
||
/// <summary>
|
||
/// 获取AB测试的配置
|
||
/// Gets the ab config.
|
||
/// </summary>
|
||
/// <returns>The ab config.</returns>
|
||
/// <param name="key">Key.</param>
|
||
/// <param name="defaultValue">Default value.</param>
|
||
/// <typeparam name="T">The 1st type parameter 类型,需是JSON兼容的数据类型.</typeparam>
|
||
public string GetAbConfig(string key, string defaultValue)
|
||
{
|
||
return AppLogCommonApi.Instance().GetAbConfig(key, defaultValue);
|
||
}
|
||
|
||
public void SetEventCommonHeader(string key, string value)
|
||
{
|
||
AppLogCommonApi.Instance().SetHeader(key, value);
|
||
}
|
||
|
||
/// <summary>
|
||
/// only for Android.
|
||
/// 埋点上报
|
||
/// report event.
|
||
/// </summary>
|
||
public void ReportEvent(string label, string paramJson)
|
||
{
|
||
// 第二个参数必须是JSONObject格式,不支持JSONArray
|
||
AppLogCommonApi.Instance().OnEventV3(label, paramJson);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Mail
|
||
|
||
/// <summary>
|
||
/// 获取邮件.
|
||
/// </summary>
|
||
public void FetchMail()
|
||
{
|
||
}
|
||
|
||
/// <summary>
|
||
/// 确认邮件.
|
||
/// </summary>
|
||
/// <param name="mailIds">需要确认的邮件id.</param>
|
||
public void AckMail(int[] mailIds)
|
||
{
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Other
|
||
|
||
/// <summary>
|
||
/// 应用内引导评分
|
||
/// </summary>
|
||
public void InAppRating()
|
||
{
|
||
}
|
||
|
||
/// <summary>
|
||
/// 验证敏感词.
|
||
/// </summary>
|
||
/// <param name="sensitiveWords">输入的敏感词信息.</param>
|
||
/// <param name="verifyResult">返回的敏感词结果.</param>
|
||
public void VerifySensitiveWords(string sensitiveWords, System.Action<int> verifyResult)
|
||
{
|
||
if (string.IsNullOrEmpty(sensitiveWords))
|
||
{
|
||
return;
|
||
//ToastManager.Instance.ShowToast("敏感词不能为空");
|
||
}
|
||
var result = ZjSdkApi.Instance().VerifySensitiveWords(sensitiveWords);
|
||
verifyResult?.Invoke(result == 2 ? 1 : 0);
|
||
//string msg;
|
||
//switch (result)
|
||
//{
|
||
// case 1:
|
||
// msg = "校验通过";
|
||
// break;
|
||
// case 2:
|
||
// msg = "校验不通过";
|
||
// break;
|
||
// default:
|
||
// msg = "结果未知";
|
||
// break;
|
||
//}
|
||
|
||
//ToastManager.Instance.ShowToast("敏感词检测结果:" + msg);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 播放品牌特效.
|
||
/// </summary>
|
||
/// <param name="portrait">游戏是否竖屏,竖屏游戏填true,横屏游戏填false.</param>
|
||
/// <param name="splashBrandEffectListener">品牌特效完成回调.</param>
|
||
public void PlaySplashBrandEffect(bool portrait, System.Action splashBrandEffectAction)
|
||
{
|
||
}
|
||
|
||
/// <summary>
|
||
/// openwebview
|
||
/// </summary>
|
||
/// <param name="url"></param>
|
||
public void OpenWebView(string url)
|
||
{
|
||
Application.OpenURL(url);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 退出
|
||
|
||
// 退出场景
|
||
// 1.游戏自己有提供退出按钮,需要掉用
|
||
// 2.见初始化阶段的监听返回键,ZjAndroidApi.Instance().listenerBackBtnPressed(OnBackBtnPressed);
|
||
public void exitSample()
|
||
{
|
||
// 两种实现方式
|
||
// 1.直接用sdk的简单退出逻辑
|
||
// LGSdkApi.Instance().SimpleExit();
|
||
|
||
// 2.游戏自行处理渠道退出和游戏退出的逻辑
|
||
ZjSdkApi.Instance().Exit(onChannelExit, onGameExit);
|
||
}
|
||
|
||
//#######################退出的回调开始#######################
|
||
|
||
// 渠道有退出页面,游戏直接退出即可
|
||
private void onChannelExit()
|
||
{
|
||
Log.D("onChannelExit:渠道退出");
|
||
//ToastManager.Instance.ShowToast("渠道退出,游戏直接退出即可");
|
||
|
||
// 游戏退出逻辑开始
|
||
// 游戏有数据保存的话,保存数据
|
||
// 游戏退出逻辑结束
|
||
|
||
|
||
// 销毁app
|
||
ZjAndroidApi.Instance().killApp();
|
||
}
|
||
|
||
// 渠道没有退出页面,游戏自行处理退出逻辑
|
||
private void onGameExit()
|
||
{
|
||
Log.D("onGameExit:游戏自行处理退出逻辑");
|
||
//ToastManager.Instance.ShowToast("游戏自行处理退出逻辑");
|
||
|
||
|
||
// 游戏自己显示弹框,提醒用户是否要退出游戏
|
||
// 游戏自己显示弹框,提醒用户是否要退出游戏
|
||
// 游戏自己显示弹框,提醒用户是否要退出游戏
|
||
// 假如游戏有上线华为渠道,务必在这里显示弹框,提醒用户是否要退出游戏
|
||
|
||
// demo这里简单演示,显示了个简单的退出弹框
|
||
ZjAndroidApi.Instance().SimpleExitDialog();
|
||
|
||
|
||
// 游戏的逻辑应该是:
|
||
// 显示提示弹框:
|
||
// 用户取消===========》不做处理
|
||
// 用户确认===========》游戏有数据保存的话,保存数据======》退出app
|
||
// ZjAndroidApi.Instance().killApp();
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 渠道相关
|
||
|
||
public string GetChannelId()
|
||
{
|
||
return ZjSdkApi.Instance().GetChannelId();
|
||
}
|
||
|
||
public bool IsOppoLeisureChannel()
|
||
{
|
||
return ZjSdkApi.Instance().IsOppoLeisureChannel();
|
||
}
|
||
|
||
// oppo超休闲跳转,必接
|
||
public void OppoLeisureJump()
|
||
{
|
||
if (!ZjSdkApi.Instance().IsOppoLeisureChannel())
|
||
{
|
||
string content =
|
||
"cp需要判断当前是否oppo超休闲渠道\n假如是的话,在游戏界面添加一个更多精彩按钮,点击更多精彩按钮,调用jumpOppoLeisureSubject\n具体请联系商务";
|
||
Log.D("不是oppo超休闲渠道,返回");
|
||
Log.D(content);
|
||
//ToastManager.Instance.ShowToast("不是oppo超休闲渠道,返回");
|
||
return;
|
||
}
|
||
|
||
ZjSdkApi.Instance().JumpOppoLeisureSubject();
|
||
}
|
||
|
||
//#######################华为查询用户时长开始#######################
|
||
|
||
|
||
// 只有华为需要cp自己处理防沉迷策略,华为防沉迷策略见:
|
||
// 华为文档:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/game-anti-indulgence-0000001050123479-V5
|
||
// 查询华为未成年游戏时长
|
||
// 没有上华为渠道的,请忽略这段
|
||
public void HuaweiGetUserGameDuration()
|
||
{
|
||
string channelId = ZjSdkApi.Instance().GetChannelId();
|
||
if (!"huawei".Equals(channelId))
|
||
{
|
||
// 不是华为渠道,直接返回
|
||
return;
|
||
}
|
||
|
||
// 华为渠道,查询用户时长
|
||
// 回调处理见华为文档:
|
||
// https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/game-anti-indulgence-0000001050123479-V5
|
||
ZjSdkApi.Instance()
|
||
.HuaweiGetPlayerExtraInfo(HuaweiGetPlayerExtraInfoOnSuccess, HuaweiGetPlayerExtraInfoOnFail);
|
||
}
|
||
|
||
private void HuaweiGetPlayerExtraInfoOnSuccess(HuaweiPlayerExtraInfo extra)
|
||
{
|
||
if (extra != null)
|
||
{
|
||
string content = "IsRealName: " + extra.getIsRealName() + ", IsAdult: " + extra.getIsAdult()
|
||
+ ", PlayerId: " + extra.getPlayerId() + ", PlayerDuration: " +
|
||
extra.getPlayerDuration();
|
||
Log.D(content);
|
||
//ToastManager.Instance.ShowToast(content);
|
||
if (!extra.getIsAdult())
|
||
{
|
||
//玩家未成年,进行后续处理
|
||
Log.D("The player is underage");
|
||
StartCoroutine(Calendar.CalendarUtil.CheckIsHoliday(DateTime.Now, (result) =>
|
||
{
|
||
if (result && DateTime.Now.Hour == 20)
|
||
{
|
||
}
|
||
else
|
||
{
|
||
UI.MessageBox.ShowMessageWithoutButton("防沉迷提示", "未成年玩家,按照国家要求,在周五、周六、周日和法定节假日每日20时至21时允许玩家游戏,其余时间段不得游戏。");
|
||
}
|
||
}));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Log.D("Player extra info is empty.");
|
||
}
|
||
}
|
||
|
||
private void HuaweiGetPlayerExtraInfoOnFail(int rtnCode, string error)
|
||
{
|
||
Log.D("onFail: " + rtnCode + "," + error);
|
||
//ToastManager.Instance.ShowToast("onFail: " + rtnCode + "," + error);
|
||
|
||
|
||
//返回7022时,表示该玩家已经成年或者未实名认证,此时可以放通处理。
|
||
if (rtnCode == 7022)
|
||
{
|
||
Log.D("The player is an adult or has not been authenticated by real name");
|
||
return;
|
||
}
|
||
|
||
//返回7002且当前网络正常,或者直接返回7006,均表示该帐号未在中国大陆注册,请直接放通。
|
||
if ((rtnCode == 7002 && ZjAndroidApi.Instance().IsNetworkAvailable()) || rtnCode == 7006)
|
||
{
|
||
Log.D("Allow the player to enter the game without checking the remaining time");
|
||
return;
|
||
}
|
||
|
||
// ignore 华为描述,假如不是以上两种情况,直接忽略,cp继续在自己希望查询用户时长的节点时候执行逻辑即可
|
||
}
|
||
|
||
//#######################华为查询用户时长结束#######################
|
||
|
||
|
||
#endregion
|
||
|
||
#region 实名
|
||
|
||
//#######################拉起实名认证开始#######################
|
||
|
||
private void DoRealName()
|
||
{
|
||
ZjSdkApi.Instance().DoRealNameVerified(OnVerifiedSuccess, OnVerifiedFail);
|
||
}
|
||
|
||
// state -1 未实名认证,0 实名认证未成年,1实名认证成年
|
||
private void OnVerifiedSuccess(int state)
|
||
{
|
||
string realNameState = "";
|
||
if (state < 0)
|
||
{
|
||
realNameState = "未实名认证";
|
||
}
|
||
else if (state == 0)
|
||
{
|
||
realNameState = "实名未成年";
|
||
}
|
||
else if (state == 1)
|
||
{
|
||
realNameState = "实名成年";
|
||
}
|
||
|
||
Log.D("实名认证成功,状态:" + realNameState);
|
||
//ToastManager.Instance.ShowToast("实名状态:" + realNameState);
|
||
}
|
||
|
||
private void OnVerifiedFail(int code, string message, bool stopGame)
|
||
{
|
||
string content = "实名认证失败:" + message + "code:" + code + ",stopGame:" + stopGame;
|
||
Log.D(content);
|
||
//ToastManager.Instance.ShowToast(content);
|
||
}
|
||
//#######################拉起实名认证结束#######################
|
||
|
||
//#######################检查用户实名认证状态开始#######################
|
||
|
||
private void CheckRealName()
|
||
{
|
||
ZjSdkApi.Instance().CheckRealNameVerified(OnState);
|
||
}
|
||
|
||
private void OnState(int state)
|
||
{
|
||
string realNameState = "";
|
||
if (state < 0)
|
||
{
|
||
realNameState = "未实名认证";
|
||
}
|
||
else if (state == 0)
|
||
{
|
||
realNameState = "实名未成年";
|
||
}
|
||
else if (state == 1)
|
||
{
|
||
realNameState = "实名成年";
|
||
}
|
||
|
||
string content = "检查实名状态:" + realNameState;
|
||
Log.D(content);
|
||
//ToastManager.Instance.ShowToast(content);
|
||
}
|
||
|
||
//#######################检查用户实名认证状态结束#######################
|
||
|
||
#endregion
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|