vivoApi.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. import { Vec2, Node } from "cc";
  2. import { MiniGameApiBase, getUserInfoParams, toastParams, loadParams, ModalParams, authorizeParams, loginParams, recordedGameScreenParams } from "./MiniGameApiBase";
  3. import { GameCfg } from "../Config/GameCfg";
  4. export interface OnloadCB {
  5. adId: string;//广告标识,用来上报曝光与点击
  6. title: string;//广告标题
  7. desc: string;//广告描述
  8. icon: string;//推广应用的Icon图标
  9. imgUrlList: any[];//广告图片
  10. logoUrl: string;//广告标签图片
  11. clickBtnTxt: string;//点击按钮文本描述
  12. creativeType: number;//获取广告类型,取值说明:0:混合
  13. interactionType: number;//获取广告点击之后的交互类型,取值说明: 1:网址类 2:应用下载类 8:快应用生态应用
  14. }
  15. export interface VivoVideoAd {
  16. // 通过 load 方法主动预加载广告内容。
  17. // 此外,在显示广告出现问题时也可以尝试主动 load 一次。
  18. // 该方法返回一个 Promise,如果广告已经自动拉取成功,调用该方法返回一个 resolved Promise;
  19. load: () => Promise<any>;
  20. // 广告创建后默认是隐藏的,可以通过该方法显示广告。 该方法返回一个 Promise 对象。当广告组件正常获取素材时,该 Promise 对象会是一个 resolved Promise。当广告组件发生错误时,会是一个 rejected Promise,参数与error事件监听器获得的参数相同。
  21. show: () => Promise<any>;
  22. //绑定 load 事件的监听器,用户在手动调用 load 方法后,广告组件会预先加载。 广告组件成功拉取广告素材时会触发load事件的监听器。
  23. //确保监听此事件时,开发者主动调用过 load 方法。
  24. onLoad: (listener: Function) => void;
  25. // 解除绑定 load 事件的监听器。
  26. offLoad: (listener: Function) => void;
  27. //绑定 error 事件的监听器。 广告组件拉取广告素材和其他情况下如果发生错误,会触发error事件的监听器。监听器会获得一个包含errCode和errMsg属性的对象参数。
  28. // errCode 详情
  29. onError: (listener: (error: any) => void) => void;
  30. // 解除绑定 error 事件的监听器。
  31. offError: (listener: Function) => void;
  32. // 绑定 close 事件的监听器。 当用户点击了 Video 广告上的关闭按钮时,会触发close事件的监听器。监听器会获得一个包含isEnded属性的对象参数,表征用户是否完整观看了视频。
  33. onClose: (listener: (res: { isEnded: boolean }) => void) => void;
  34. //解除绑定 close 事件的监听器。
  35. offClose: (listener: Function) => void;
  36. //
  37. destroy();
  38. }
  39. const vivo: any = window['qg'];
  40. export default class VivoApi extends MiniGameApiBase {
  41. checkScene(successCB?: Function, errorCB?: Function) {
  42. throw new Error("Method not implemented.");
  43. }
  44. navigateToScene(successCB?: Function, errorCB?: Function) {
  45. throw new Error("Method not implemented.");
  46. }
  47. getStorageSync(key?: string) {
  48. throw new Error("Method not implemented.");
  49. }
  50. removeStorage(key?: string) {
  51. throw new Error("Method not implemented.");
  52. }
  53. getDeviceInfo() {
  54. throw new Error("Method not implemented.");
  55. }
  56. setUnlockAllTime(time: number) {
  57. throw new Error("Method not implemented.");
  58. }
  59. getUnlockAllTime(call: Function) {
  60. throw new Error("Method not implemented.");
  61. }
  62. setUnitState(state?: string) {
  63. throw new Error("Method not implemented.");
  64. }
  65. reportAnalytics(eventName: string, data?: { [key: string]: string | number | boolean; }) {
  66. throw new Error("Method not implemented.");
  67. }
  68. setSoundInfo(sound?: boolean, music?: boolean) {
  69. throw new Error("Method not implemented.");
  70. }
  71. protected m_AppId: string = "";
  72. protected m_Secret: string = "";
  73. protected m_VideoAdIdIndex: number = 0;
  74. protected m_VideoAdIdList: string[] = [];
  75. protected m_BannerAdIdIndex: number = 0;
  76. protected m_BannerAdId: string[] = [];
  77. protected m_InsertAdIdIndex: number = 0;
  78. protected m_InsertAdId: string[] = [];
  79. protected m_videoAd: VivoVideoAd = undefined;
  80. protected m_BannerAd: any = undefined;
  81. validAppId(): void {
  82. console.log("vivo-api-validAppId");
  83. }
  84. ready(): void {
  85. if (GameCfg.SYSTEM_LOG) console.log("vivo-api-ready");
  86. }
  87. getUserInfo(params: getUserInfoParams): void {
  88. vivo.getUserInfo(params);
  89. }
  90. showToast(params: toastParams): void {
  91. vivo.showToast(params);
  92. }
  93. showLoading(params: loadParams): void {
  94. vivo.showLoading(params);
  95. }
  96. hideLoading(): void {
  97. vivo.hideLoading();
  98. }
  99. showModal(params: ModalParams): void {
  100. }
  101. authorize(params: authorizeParams): void {
  102. params.success && params.success();
  103. }
  104. login(params: loginParams): void {
  105. vivo.login(params);
  106. }
  107. getVideoAdId(): string {
  108. const id: string = this.m_VideoAdIdList[this.m_VideoAdIdIndex];
  109. this.m_VideoAdIdIndex++;
  110. if (this.m_VideoAdIdIndex >= this.m_VideoAdIdList.length) {
  111. this.m_VideoAdIdIndex = 0;
  112. }
  113. return id;
  114. }
  115. loadAndShowVideoAd(successCB: () => void, errorCB: (error: any) => void, completeCB?: () => void, reportAnalyticsExplain?: string): void {
  116. if (this.m_videoAd == null) {
  117. this.m_videoAd = vivo.createRewardedVideoAd({ adUnitId: this.getVideoAdId() });
  118. }
  119. let onClose = (res) => {
  120. if (res && res.isEnded) {
  121. // 给予奖励
  122. successCB();
  123. // O1HD.getManagers().soundMgr.setSoundEnabled(true);
  124. } else {
  125. //
  126. errorCB('视频中途退出');
  127. // O1HD.getManagers().soundMgr.setSoundEnabled(true);
  128. }
  129. this.m_videoAd.offClose(onClose);
  130. completeCB && completeCB();
  131. };
  132. //
  133. this.m_videoAd.load().then(() => { //加载视频广告完成
  134. this.m_videoAd.show().then(() => { //播放视频广告完成
  135. this.m_videoAd.onClose(onClose);
  136. // O1HD.getManagers().soundMgr.setSoundEnabled(true);
  137. // O1HD.getManagers().soundMgr.playMusic("BGM1");
  138. }).catch((err) => { //播放视频广告错误
  139. errorCB('视频显示错误 :' + JSON.stringify(err));
  140. this.m_videoAd.offClose(onClose);
  141. completeCB && completeCB();
  142. })
  143. }).catch((err) => { //加载视频广告错误
  144. errorCB('视频加载错误 :' + JSON.stringify(err));
  145. this.m_videoAd.offClose(onClose);
  146. completeCB && completeCB();
  147. });
  148. }
  149. getInsertAdId(): string {
  150. const id: string = this.m_InsertAdId[this.m_InsertAdIdIndex];
  151. this.m_InsertAdIdIndex++;
  152. if (this.m_InsertAdIdIndex >= this.m_InsertAdId.length) {
  153. this.m_InsertAdIdIndex = 0;
  154. }
  155. return id;
  156. }
  157. showInsertAd(onAdClose: () => void, onFailed: () => void): void {
  158. console.log("加抖音 插屏 广告");
  159. const adId = this.getInsertAdId();
  160. let insertAd = vivo.createInterstitialAd({
  161. adUnitId: adId,
  162. });
  163. insertAd.load();
  164. insertAd.onLoad(() => {
  165. console.warn('插屏广告 加载完成');
  166. insertAd.show().catch((err) => {
  167. console.warn('插屏广告 显示失败 :' + JSON.stringify(err));
  168. insertAd.destroy();
  169. insertAd = null;
  170. if (onFailed) {
  171. onFailed();
  172. }
  173. });
  174. });
  175. insertAd.onError((err) => {
  176. console.warn('插屏广告 加载失败' + JSON.stringify(err));
  177. insertAd.destroy();
  178. insertAd = null;
  179. if (onFailed) {
  180. onFailed();
  181. }
  182. });
  183. insertAd.onClose(() => {
  184. console.warn('插屏广告 关闭');
  185. if (insertAd != null) {
  186. insertAd.destroy();
  187. insertAd = null;
  188. }
  189. if (onAdClose) {
  190. onAdClose();
  191. }
  192. });
  193. }
  194. protected bannerSuccese: boolean = false;
  195. getBannerAdId(): string {
  196. const id: string = this.m_BannerAdId[this.m_BannerAdIdIndex];
  197. this.m_BannerAdIdIndex++;
  198. if (this.m_BannerAdIdIndex >= this.m_BannerAdId.length) {
  199. this.m_BannerAdIdIndex = 0;
  200. }
  201. return id;
  202. }
  203. showBannerAD(node: Node, successCB?: () => void, errorCB?: (error: any) => void, onCloseCB?: () => void,
  204. setBannerPos?: ({ screenWidth, screenHeight }: { screenWidth: any; screenHeight: any; }) => Vec2): void {
  205. const { screenWidth, screenHeight } = vivo.getSystemInfoSync();
  206. let pos: Vec2 = setBannerPos && setBannerPos({ screenWidth, screenHeight }) || new Vec2(0, 0);
  207. // var targetBannerAdWidth = 200;
  208. if (this.m_BannerAd && !this.bannerSuccese) {
  209. this.m_BannerAd.destroy()
  210. this.m_BannerAd = null
  211. }
  212. if (this.m_BannerAd) {
  213. this.m_BannerAd.show()
  214. .then(() => {
  215. successCB && successCB();
  216. console.log("---------------------Banner广告直接显示成功");
  217. })
  218. .catch((err) => {
  219. errorCB && errorCB(err);
  220. console.log("---------------------Banner广告直接显示组件出现问题", JSON.stringify(err));
  221. });
  222. return
  223. }
  224. this.bannerSuccese = true;
  225. if (this.m_BannerAd == null) {
  226. this.m_BannerAd = vivo.createBannerAd({
  227. posId: this.getBannerAdId(),
  228. adIntervals: 30,
  229. style: {
  230. // width: targetBannerAdWidth,
  231. // top: screenHeight - (targetBannerAdWidth / 16) * 9, // 根据系统约定尺寸计算出广告高度
  232. left: pos.x,
  233. top: pos.y,
  234. },
  235. });//创建
  236. }
  237. this.m_BannerAd.onSize(size => {
  238. console.log(size.width, size.height, "------------banner长宽-----------");
  239. // this.m_BannerAd.style.top = size.height;//screenHeight - size.height;
  240. // this.m_BannerAd.style.left = size.width;//(screenWidth - size.width) / 2;
  241. // setBannerPosition && setBannerPosition({ x: this.m_BannerAd.style.left, y: this.m_BannerAd.style.top },
  242. // { width: size.width, height: size.height });
  243. });
  244. this.m_BannerAd.onLoad(() => {
  245. if (node == null || !node.active || !node.isValid) {
  246. console.log("---------------------------------------------------------");
  247. return
  248. }
  249. this.bannerSuccese = false;
  250. this.m_BannerAd
  251. .show()
  252. .then(() => {
  253. successCB && successCB();
  254. console.log("---------------------Banner广告显示成功");
  255. this.m_BannerAd.onClose(() => {
  256. onCloseCB && onCloseCB();
  257. });
  258. })
  259. .catch((err) => {
  260. errorCB && errorCB(err);
  261. console.log("---------------------Banner广告组件显示出现问题" + err.errCode + " :" + err.errMsg);
  262. });
  263. });
  264. this.m_BannerAd.onError((err) => {
  265. this.bannerSuccese = false;
  266. errorCB && errorCB(err);
  267. console.log("---------------------Banner广告加载错误,错误原因:" + err.errCode + " :" + err.errMsg);
  268. });
  269. }
  270. hideBanner() {
  271. // if (this.m_BannerAd != null) {
  272. // this.m_BannerAd.hide();
  273. // }
  274. }
  275. recordedGameScreenStart(params: recordedGameScreenParams, onStart?: (res: any) => void): void {
  276. console.log("vivo-api-recordedGameScreenStart");
  277. onStart && onStart(null);
  278. }
  279. recordedGameScreenStop() {
  280. console.log("vivo-api-recordedGameScreenStop");
  281. return true;
  282. }
  283. shareRecordedGameScreen(successCb?: () => void, failCb?: (e?: any) => void): void {
  284. console.log("vivo-api-shareRecordedGameScreen");
  285. successCb && successCb();
  286. }
  287. isHaveRecordedGameScreen(): boolean {
  288. return true;
  289. }
  290. }