CososCreator 2.2.4
Android Studio :4.2.1
接入SDK有:接max聚合及中介平台(Admob,FB, applovin,pangle,mintegral,vungle,unity),和Firebase 统计
1、构建Android工程
2、升级gradle版本
升级完后可能出现如下问题:
a)A problem occurred evaluating project ':game'.
> Plugin with id 'com.android.feature' not found.
解决参考链接:
Cocos Creator Android原生项目升级gradle版本 - Creator 2.x - Cocos中文社区gradle 版本原来版本 :4.10.3(插件3.2.0) 升级后版本: 5.6.4(插件3.6.3) gradle路径:jsb-default/frameworks/runtime-src/proj.android-studi…https://forum.cocos.org/t/topic/103837
b)Execution failed for task ':food:mergeDebugAssets'.
> Could not copy file 'F:\Hopemobi\food_B\build\jsb-link\assets\internal' to 'F:\Hopemobi\food_B\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\task ':food:mergeDebugAssets' property 'outputDir'\assets\internal'.
> Failed to create parent directory 'F:\Hopemobi\food_B\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\task ':food:mergeDebugAssets' property 'outputDir'' when creating directory 'F:\Hopemobi\food_B\build\jsb-link\frameworks\runtime-src\proj.android-studio\app\task ':food:mergeDebugAssets' property 'outputDir'\assets\internal'
app/build.gradle(资源复制丢失)
原因:构建失败
路径:jsb-default/frameworks/runtime-src/proj.android-studio/app/build.gradle
android.applicationVariants.all { variant ->
// delete previous files first
delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"
//修改 报警错误 API 'variant.getMergeAssets()' is obsolete and has been replaced with 'variant.getMergeAssetsProvider()'.It will be removed at the end of 2019.
// variant.mergeAssets.doLast {
variant.mergeAssetsProvider.get().doLast{
def sourceDir = "${buildDir}/../../../../.."
copy {
from "${sourceDir}/assets"
into outputDir.dir("assets")
into outputDir.dir("assets")
}
copy {
from "${sourceDir}/src"
into "${outputDir}/src"
into outputDir.dir("src")
}
copy {
from "${sourceDir}/jsb-adapter"
into "${outputDir}/jsb-adapter"
into outputDir.dir("jsb-adapter")
}
copy {
from "${sourceDir}/main.js"
from "${sourceDir}/project.json"
into outputDir
}
}
}
c) 将项目选择为游戏项目,运行
3、AppLovin Max聚合接入(具体接入根据官方来,本文提供一些接入问题)
官方文档:
MAX Mediation Documentationhttps://dash.applovin.com/documentation/mediation/android/getting-started/integration添加到应用程序级 build.gradle中加入:
repositories {
google()
mavenCentral()
⋮
}
dependencies {
implementation 'com.applovin:applovin-sdk:+'
}
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
添加 SDK 密钥:<meta-data>元素到你的AndroidManifest.xml
<meta-data android:name="applovin.sdk.key"
android:value="YOUR_SDK_KEY_HERE"/>
添加到应用程序级 build.gradle 文件
apply plugin: 'applovin-quality-service'
applovin {
apiKey "YOUR_AD_REVIEW_KEY_HERE"
}
添加到根级 build.gradle 文件
buildscript {
repositories {
maven { url 'https://artifacts.applovin.com/android' }
}
dependencies {
classpath "com.applovin.quality:AppLovinQualityServiceGradlePlugin:+"
}
}
d)This project uses AndroidX dependencies, but the android.useAndroidX property is not enabled
This project uses AndroidX dependencies, but the android.useAndroidX property is not enabled的解决_7DO的博客-CSDN博客
gradle.properties中加入:
android.useAndroidX=true android.enableJetifier=true
e)Execution failed for task ':food:processReleaseMainManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [com.google.android.gms:play-services-ads:21.3.0]
PROP_MIN_SDK_VERSION=21
f)Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit v
Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit v_lplj717的博客-CSDN博客
g)Expiring Daemon because JVM heap space is exhausted
Expiring Daemon because JVM heap space is exhausted_auccy的博客-CSDN博客_expiring daemon
在 gradle.properties 文件中添加
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m
f)Could not determine the dependencies of task ':food:lintVitalRelease'.
> Could not resolve all artifacts for configuration ':food:debugCompileClasspath'.
> Could not find com.pangle.global:ads-sdk:4.8.1.0.
buildscript和allprojects和subprojects的区别.Android Studio_厚积而薄发ing的博客-CSDN博客_android subprojects
在buildscript,allprojects 中都添加上
最终根级 build.gradle 文件
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
maven { url 'https://artifacts.applovin.com/android' }
maven { url "https://artifact.bytedance.com/repository/pangle" }
maven { url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea" }
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.1'
classpath 'com.applovin.quality:AppLovinQualityServiceGradlePlugin:+'
classpath 'com.google.gms:google-services:4.3.14' //firebase
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
flatDir {
dirs 'libs'
}
maven { url "https://artifact.bytedance.com/repository/pangle" }
maven { url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
最终根级 build.gradle 文件
import org.apache.tools.ant.taskdefs.condition.Os
apply plugin: 'com.android.application'
apply plugin: 'applovin-quality-service'
apply plugin: 'com.google.gms.google-services'
applovin {
// NOTE: DO NOT CHANGE - this is NOT your AppLovin MAX SDK key - this is a derived key.
apiKey 'e8dPgaJuOF6-3xeoEizRgzB34eU-yLeAmiXTMhPFLstzUTpTF20SaWC8y3n0wbxVCXoHhdet1wyp9-MUBs__iy'
}
android {
compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
buildToolsVersion '30.0.2'
defaultConfig {
applicationId "com.starqbaby.FastFood"
minSdkVersion PROP_MIN_SDK_VERSION
targetSdkVersion PROP_TARGET_SDK_VERSION
versionCode 12
versionName "1.0.12"
externalNativeBuild {
ndkBuild {
if (!project.hasProperty("PROP_NDK_MODE") || PROP_NDK_MODE.compareTo('none') != 0) {
// skip the NDK Build step if PROP_NDK_MODE is none
targets 'cocos2djs'
arguments 'NDK_TOOLCHAIN_VERSION=clang'
def module_paths = [project.file("D:/CocosDashboard_1.0.14/resources/.editors/Creator/2.4.4/resources/cocos2d-x"),
project.file("D:/CocosDashboard_1.0.14/resources/.editors/Creator/2.4.4/resources/cocos2d-x/cocos"),
project.file("D:/CocosDashboard_1.0.14/resources/.editors/Creator/2.4.4/resources/cocos2d-x/external")]
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
arguments 'NDK_MODULE_PATH=' + module_paths.join(";")
}
else {
arguments 'NDK_MODULE_PATH=' + module_paths.join(':')
}
arguments '-j' + Runtime.runtime.availableProcessors()
abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})
}
}
}
}
sourceSets.main {
java.srcDirs "../src", "src"
res.srcDirs "../res", 'res'
jniLibs.srcDirs "../libs", 'libs'
manifest.srcFile "AndroidManifest.xml"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
externalNativeBuild {
ndkBuild {
if (!project.hasProperty("PROP_NDK_MODE") || PROP_NDK_MODE.compareTo('none') != 0) {
// skip the NDK Build step if PROP_NDK_MODE is none
path "jni/Android.mk"
}
}
}
signingConfigs {
release {
if (project.hasProperty("RELEASE_STORE_FILE")) {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
}
}
buildTypes {
release {
debuggable false
jniDebuggable false
renderscriptDebuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
if (project.hasProperty("RELEASE_STORE_FILE")) {
signingConfig signingConfigs.release
}
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=0'
}
}
}
debug {
debuggable true
jniDebuggable true
renderscriptDebuggable true
externalNativeBuild {
ndkBuild {
arguments 'NDK_DEBUG=1'
}
}
}
}
}
android.applicationVariants.all { variant ->
// delete previous files first
delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"
//修改 报警错误 API 'variant.getMergeAssets()' is obsolete and has been replaced with 'variant.getMergeAssetsProvider()'.It will be removed at the end of 2019.
// variant.mergeAssets.doLast {
variant.mergeAssetsProvider.get().doLast{
def sourceDir = "${buildDir}/../../../../.."
copy {
from "${sourceDir}/assets"
into outputDir.dir("assets")
into outputDir.dir("assets")
}
copy {
from "${sourceDir}/src"
into "${outputDir}/src"
into outputDir.dir("src")
}
copy {
from "${sourceDir}/jsb-adapter"
into "${outputDir}/jsb-adapter"
into outputDir.dir("jsb-adapter")
}
copy {
from "${sourceDir}/main.js"
from "${sourceDir}/project.json"
into outputDir
}
}
}
dependencies {
implementation fileTree(dir: '../libs', include: ['*.jar','*.aar'])
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
implementation fileTree(dir: "D:/CocosDashboard_1.0.14/resources/.editors/Creator/2.4.4/resources/cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])
implementation project(':libcocos2dx')
implementation 'com.applovin:applovin-sdk:+'
// Import the Firebase BoM
implementation platform('com.google.firebase:firebase-bom:31.1.1')
// Declare the dependency for the Firebase SDK for Google Analytics
implementation 'com.google.firebase:firebase-analytics'
//Admob
implementation 'com.applovin.mediation:google-adapter:+'
//FB
implementation 'com.applovin.mediation:facebook-adapter:+'
//vungle
implementation 'com.applovin.mediation:vungle-adapter:+'
//unity
implementation 'com.applovin.mediation:unityads-adapter:+'
//pangle
implementation 'com.applovin.mediation:bytedance-adapter:+'
//mintegral
implementation 'com.applovin.mediation:mintegral-adapter:+'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
}
AdsBanner.java
package org.cocos2dx.javascript.ads;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.applovin.mediation.MaxAd;
import com.applovin.mediation.MaxAdViewAdListener;
import com.applovin.mediation.MaxError;
import com.applovin.mediation.ads.MaxAdView;
import com.starqbaby.FastFood.R;
import org.cocos2dx.javascript.AdManage;
import org.cocos2dx.javascript.AppActivity;
public class AdsBanner {
private Context mainActive = null;
private ViewGroup rootView;
private MaxAdView mAdView;
private String adPos;
private int screenWidth;
//-----------类型常量-------------
private static String BANNER_TYPE = "0";
//获得广告位id
private static String AD_Banner_ID;
public void init(Context context,int wid){
this.mainActive = context;
this.screenWidth = wid;
AD_Banner_ID = AdManage.getInstance().getUnitID(BANNER_TYPE);
}
/*
加载banner广告
*/
public void loadBannerAd() {
//请求banner
AdManage.getInstance().FAEventSuccess("Mobi_40101",AD_Banner_ID,BANNER_TYPE);
mAdView = new MaxAdView(AD_Banner_ID,this.mainActive );
// Stretch to the width of the screen for banners to be fully functional
int width = ViewGroup.LayoutParams.WRAP_CONTENT;
// Banner height on phones and tablets is 50 and 90, respectively
int heightPx = this.mainActive.getResources().getDimensionPixelSize( R.dimen.banner_height );
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( width, heightPx ) ;
params.gravity=Gravity.TOP;
//params.leftMargin = this.screenWidth /2;
Log.d(AdManage.getInstance().TAG, "screenWidth"+this.screenWidth);
mAdView.setLayoutParams(params);
//Set background or background color for banners to be fully functional
//adView.setBackgroundColor( ... );
rootView= (ViewGroup)((Activity) this.mainActive).findViewById(android.R.id.content);
rootView.addView( mAdView );
mAdView.setVisibility(View.VISIBLE);
// Load the ad
mAdView.loadAd();
//banner监听
mAdView.setListener(new MaxAdViewAdListener() {
// MAX Ad Listener
@Override
public void onAdLoaded(final MaxAd maxAd)
{
Log.d(AdManage.getInstance().TAG, "onAdLoaded: (banner)");
//successFAEvent("loadBannerAd");
AdManage.getInstance().FAEventSuccess("Mobi_40201",AD_Banner_ID,BANNER_TYPE);
}
@Override
public void onAdLoadFailed(final String adUnitId, final MaxError error)
{
Log.d(AdManage.getInstance().TAG, "onAdFailedToLoad: (banner)"+error);
String errorMessage = error.getMessage();
//加载错误事件
int errorCode = error.getCode();
//failFAEvent(errorCode,"banner");
//-----
//广告填充失败
AdManage.getInstance().FAEventFail("Mobi_40201",AD_Banner_ID,BANNER_TYPE,String.valueOf(errorCode),errorMessage);
}
@Override
public void onAdDisplayFailed(final MaxAd maxAd, final MaxError error) {}
@Override
public void onAdClicked(final MaxAd maxAd)
{
//广告点击
AdManage.getInstance().FAEventSuccess("Mobi_40401",AD_Banner_ID,BANNER_TYPE);
}
@Override
public void onAdExpanded(final MaxAd maxAd) {}
@Override
public void onAdCollapsed(final MaxAd maxAd) {}
@Override
public void onAdDisplayed(final MaxAd maxAd) { /* DO NOT USE - THIS IS RESERVED FOR FULLSCREEN ADS ONLY AND WILL BE REMOVED IN A FUTURE SDK RELEASE */ }
@Override
public void onAdHidden(final MaxAd maxAd) { /* DO NOT USE - THIS IS RESERVED FOR FULLSCREEN ADS ONLY AND WILL BE REMOVED IN A FUTURE SDK RELEASE */ }
});
}
/*
banner广告
*/
public void showBannerAd(String pos){
AppActivity mActivity = (AppActivity)this.mainActive;
this.adPos = pos;
int mWidth = this.screenWidth;
//一定要确保在UI线程操作
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(AdManage.getInstance().TAG, "showBannerAd: adPos "+adPos);
FrameLayout.LayoutParams params=(FrameLayout.LayoutParams )mAdView.getLayoutParams();
if(adPos.equals("top")){
params.gravity=Gravity.TOP;
params.leftMargin = 0;
}else if(adPos.equals("top-left")){
params.gravity=Gravity.TOP;
params.leftMargin = -mWidth /2;
}else if(adPos.equals("bottom")){
params.gravity=Gravity.BOTTOM;
params.leftMargin = 0;
}else if(adPos.equals("bottom-left")){
params.gravity=Gravity.BOTTOM;
params.leftMargin = -mWidth /2;
}
mAdView.setLayoutParams(params);
mAdView.setVisibility(View.VISIBLE);
}
});
}
/*
隐藏 banner广告
*/
public void hideBannerAd(){
//有用接口,先注释,取消隐藏banner
AppActivity mActivity = (AppActivity)this.mainActive;
//一定要确保在UI线程操作
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(AdManage.getInstance().TAG, "hideBannerAd");
mAdView.setVisibility(View.INVISIBLE);
}
});
}
}
AdsInterstitial.java
package org.cocos2dx.javascript.ads;
import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.applovin.mediation.MaxAd;
import com.applovin.mediation.MaxAdListener;
import com.applovin.mediation.MaxError;
import com.applovin.mediation.ads.MaxInterstitialAd;
import org.cocos2dx.javascript.AdManage;
import org.cocos2dx.javascript.AppActivity;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;
import java.util.concurrent.TimeUnit;
public class AdsInterstitial implements MaxAdListener {
private static String INTERSTITIAL_TYPE = "1"; //类型常量
private static String AD_INTERSTITIAL_ID;//正式插屏
private static MaxInterstitialAd interstitialAd;
private int insUnitIdIdex = 0;
private int insReLoadTime = 1; //插屏加载失败时,允许重新加载几次插屏
private int curInsReloadTime = 0; //当前插屏重新加载次数
private Context mainActive = null;
public void init(Context context){
this.mainActive = context;
AD_INTERSTITIAL_ID = AdManage.getInstance().getUnitID(INTERSTITIAL_TYPE);
}
private int retryAttempt;
public void loadInterstitalAd(){
AppActivity mActivity = (AppActivity)this.mainActive;
AdsInterstitial mUser=this;
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(AdManage.getInstance().TAG, "loadInterstitalAd....: "+AdsInterstitial.AD_INTERSTITIAL_ID);
//successFAEvent("LoadInterstitalAd");
//插屏广告请求
AdManage.getInstance().FAEventSuccess("Mobi_40101",AdsInterstitial.AD_INTERSTITIAL_ID,INTERSTITIAL_TYPE);
MaxInterstitialAd interstitialAd = new MaxInterstitialAd( AdsInterstitial.AD_INTERSTITIAL_ID, mActivity );
// Load the first ad
AdsInterstitial.interstitialAd=interstitialAd;
interstitialAd.setListener(mUser);
interstitialAd.loadAd();
}
});
}
public void showInterstitialAd() {
// Show the ad if it's ready. Otherwise toast and restart the game.
Log.d(AdManage.getInstance().TAG, "showInterstitial: ");
AppActivity mActivity = (AppActivity)this.mainActive;
//一定要确保在UI线程操作
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (AdsInterstitial.interstitialAd != null && interstitialAd.isReady()) {
interstitialAd.showAd();
} else {
Toast.makeText((Activity) mActivity, "Ad did not load", Toast.LENGTH_SHORT).show();
}
AdManage.getInstance().FAEventSuccess("Mobi_40301", AdsInterstitial.AD_INTERSTITIAL_ID, INTERSTITIAL_TYPE);
}
});
}
@Override
public void onAdLoaded(MaxAd ad) {
Log.i(AdManage.getInstance().TAG, "onAdLoaded(AdsInterstitial)");
//加载插屏广告成功
AdManage.getInstance().FAEventSuccess("Mobi_40201",AdsInterstitial.AD_INTERSTITIAL_ID,INTERSTITIAL_TYPE);
retryAttempt = 0;
}
@Override
public void onAdLoadFailed(String adUnitId, MaxError error) {
String error1 =String.format("code: %d, message: %s",error.getCode(), error.getMessage());
Log.d(AdManage.getInstance().TAG, "AdsInterstitial Failed : " + error1);
String errorMessage = error.getMessage();
//加载错误事件
int errorCode = error.getCode();
//failFAEvent(errorCode,"InterstitalAd");
//-----
//广告填充失败
AdManage.getInstance().FAEventFail("Mobi_40201",AdsInterstitial.AD_INTERSTITIAL_ID,INTERSTITIAL_TYPE,String.valueOf(errorCode),errorMessage);
//Toast.makeText((Activity) mActivity, "onAdFailedToLoad() with error: " + error1, Toast.LENGTH_SHORT).show();
retryAttempt++;
long delayMillis = TimeUnit.SECONDS.toMillis( (long) Math.pow( 2, Math.min( 6, retryAttempt ) ) );
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
interstitialAd.loadAd();
}
}, delayMillis );
}
@Override
public void onAdDisplayFailed(MaxAd ad, MaxError error) {
Log.d(AdManage.getInstance().TAG, "onAdDisplayFailed");
interstitialAd.loadAd();
}
@Override
public void onAdDisplayed(MaxAd ad) {
Log.d(AdManage.getInstance().TAG, "onAdDisplayed");
}
@Override
public void onAdClicked(MaxAd ad) {
Log.d(AdManage.getInstance().TAG, "onAdClicked");
}
@Override
public void onAdHidden(MaxAd ad) {
Log.d(AdManage.getInstance().TAG, "onAdHidden");
interstitialAd.loadAd();
AppActivity app = (AppActivity) this.mainActive;
app.runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString("window.PlatformApi.getInterstitalHidden()");
Log.d(AdManage.getInstance().TAG, "AdsInterstitial call onAdHidden");
}
});
}
}
AdsRewarded.java
package org.cocos2dx.javascript.ads;
import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.applovin.mediation.MaxAd;
import com.applovin.mediation.MaxError;
import com.applovin.mediation.MaxReward;
import com.applovin.mediation.MaxRewardedAdListener;
import com.applovin.mediation.ads.MaxRewardedAd;
import org.cocos2dx.javascript.AdManage;
import org.cocos2dx.javascript.AppActivity;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;
import java.util.concurrent.TimeUnit;
public class AdsRewarded {
private Context mainActive = null;
private static MaxRewardedAd mRewardedAd;
private static String REWARDED_TYPE = "8"; //类型常量
private static String AD_VIDEO_ID;//激励视频广告ID(正式)
public void init(Context context){
this.mainActive = context;
AD_VIDEO_ID = AdManage.getInstance().getUnitID(REWARDED_TYPE);
}
private static int retryAttempt;
public void initVideoAd(){
AppActivity mActivity = (AppActivity) this.mainActive;
//一定要确保在UI线程操作
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
AdManage.getInstance().FAEventSuccess("Mobi_40101",AdsRewarded.AD_VIDEO_ID,REWARDED_TYPE);
MaxRewardedAd rewardedAd = MaxRewardedAd.getInstance( AdsRewarded.AD_VIDEO_ID,mActivity );
rewardedAd.setListener(new MaxRewardedAdListener() {
@Override
public void onAdLoaded(MaxAd ad) {
Log.d(AdManage.getInstance().TAG, "onAdLoaded.(AdsRewarded)");
AdManage.getInstance().FAEventSuccess("Mobi_40201",AdsRewarded.AD_VIDEO_ID,REWARDED_TYPE);
AdsRewarded.retryAttempt=0;
}
@Override
public void onAdLoadFailed(String adUnitId, MaxError error) {
String error1 =String.format("code: %d, message: %s",error.getCode(), error.getMessage());
Log.d(AdManage.getInstance().TAG, "AdsInterstitial Failed : " + error1);
String errorMessage = error.getMessage();
int errorCode = error.getCode();
AdManage.getInstance().FAEventFail("Mobi_40202",AdsRewarded.AD_VIDEO_ID,REWARDED_TYPE,String.valueOf(errorCode),errorMessage);
AdsRewarded.retryAttempt++;
long delayMillis = TimeUnit.SECONDS.toMillis( (long) Math.pow( 2, Math.min( 6, retryAttempt ) ) );
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
AdsRewarded.mRewardedAd.loadAd();
}
}, delayMillis );
}
@Override
public void onAdDisplayFailed(MaxAd ad, MaxError error) {
AdsRewarded.mRewardedAd.loadAd();
}
@Override
public void onAdClicked(MaxAd ad) {
}
@Override
public void onAdDisplayed(MaxAd ad) {
}
@Override
public void onAdHidden(MaxAd ad) {
AdsRewarded.mRewardedAd.loadAd();
AppActivity app = mActivity;
app.runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString("window.PlatformApi.getVideoHidden()");
Log.d(AdManage.getInstance().TAG, "AdsRewarded call onAdHidden");
}
});
}
@Override
public void onRewardedVideoStarted(MaxAd ad) {
}
@Override
public void onRewardedVideoCompleted(MaxAd ad) {
}
@Override
public void onUserRewarded(MaxAd ad, MaxReward reward) {
Log.d(AdManage.getInstance().TAG, "The user earned the reward.");
int rewardAmount = reward.getAmount();
String rewardType = reward.getLabel();
Log.d(AdManage.getInstance().TAG, "call before");
AppActivity app = mActivity;
app.runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString("window.PlatformApi.getVideoReward()");
Log.d(AdManage.getInstance().TAG, "call Rewarded");
}
});
//successFAEvent("EarnedReward");
AdManage.getInstance().FAEventSuccess("Mobi_40301",AdsRewarded.AD_VIDEO_ID,REWARDED_TYPE);
}
});
AdsRewarded.mRewardedAd = rewardedAd;
rewardedAd.loadAd();
}
});
}
//展示广告
public void showRewardVideoAd(){
AppActivity mActivity = (AppActivity) this.mainActive;
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (AdsRewarded.mRewardedAd != null&&AdsRewarded.mRewardedAd.isReady()) {
AdsRewarded.mRewardedAd.showAd();
} else {
Log.d(AdManage.getInstance().TAG, "The rewarded ad wasn't ready yet.");
Toast.makeText((Activity) mActivity, "Ad did not load", Toast.LENGTH_SHORT).show();
}
}
});
}
}
AdManage.java(广告管理)
package org.cocos2dx.javascript;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.applovin.mediation.MaxAd;
import com.applovin.mediation.MaxAdListener;
import com.applovin.mediation.MaxAdViewAdListener;
import com.applovin.mediation.MaxError;
import com.applovin.mediation.MaxReward;
import com.applovin.mediation.MaxRewardedAdListener;
import com.applovin.mediation.ads.MaxAdView;
import com.applovin.mediation.ads.MaxInterstitialAd;
import com.applovin.mediation.ads.MaxRewardedAd;
import com.applovin.sdk.AppLovinSdk;
import com.applovin.sdk.AppLovinSdkConfiguration;
import org.cocos2dx.javascript.ads.AdsBanner;
import org.cocos2dx.javascript.ads.AdsInterstitial;
import org.cocos2dx.javascript.ads.AdsRewarded;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.RequestConfiguration;
import static com.google.android.gms.ads.RequestConfiguration.MAX_AD_CONTENT_RATING_G;
import static com.google.android.gms.ads.RequestConfiguration.TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE;
public class AdManage {
private static final String AD_BANNER_UNIT_ID = "id";//横幅广告ID
private static final String AD_UNIT_ID = "id"; //插页广告
private static final String AD_VIDEO_ID = "id";//激励视频广告ID
private Context mainActive = null;
private static AdManage mInstace = null;
private MaxAdView adView;
private LinearLayout bannerLayout;
private String adPos;
public final String TAG = "ADManage";
private int screenWidth;
private AdsBanner admobBanner = new AdsBanner();
private AdsInterstitial admobInterstitial = new AdsInterstitial();
private AdsRewarded admobRewarded = new AdsRewarded();
//-----------类型常量-------------
private static String BANNER_TYPE = "0";
private static String INTERSTITIAL_TYPE = "1";
private static String NATIVE_TYPE = "2";
private static String SPLASH_TYPE = "5";
private static String REWARDED_TYPE = "8";
//----------------------
private static boolean isVideoRewarded = false;
private static boolean isVideoClose = false;
public static AdManage getInstance() {
if (null == mInstace) {
mInstace = new AdManage();
}
return mInstace;
}
public void init(Context context, int wid) {
this.mainActive = context;
this.screenWidth = wid;
//初始化广告 SDK.
// Make sure to set the mediation provider value to "max" to ensure proper functionality
AppLovinSdk.getInstance( context ).setMediationProvider( "max" );
AppLovinSdk.initializeSdk( context, new AppLovinSdk.SdkInitializationListener() {
@Override
public void onSdkInitialized(final AppLovinSdkConfiguration configuration)
{
// AppLovin SDK is initialized, start loading ads
Log.d(AdManage.getInstance().TAG, "onInitializationComplete: ");
FAEvent("Mobi_10001"); //广告初始化事件
}
} );
//亲子同乐计划
// RequestConfiguration requestConfiguration = MobileAds.getRequestConfiguration()
// .toBuilder()
// .setMaxAdContentRating(MAX_AD_CONTENT_RATING_G)
// .setTagForChildDirectedTreatment(TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE)
// .build();
// MobileAds.setRequestConfiguration(requestConfiguration);
admobBanner.init(this.mainActive,this.screenWidth);
admobInterstitial.init(this.mainActive);
admobRewarded.init(this.mainActive);
loadBannerAd();
loadInterstitalAd();
initVideoAd();
}
public String getUnitID(String type){
if(type.equals(BANNER_TYPE)){
return AD_BANNER_UNIT_ID;
}else if(type.equals(REWARDED_TYPE)){
return AD_VIDEO_ID;
}else if(type.equals(INTERSTITIAL_TYPE)){
return AD_UNIT_ID;
}else{
return "";
}
}
//---------旧版本失败打点------------
public static void failFAEvent(int errorCode,String type){
String eventName = type;
if(errorCode == 3){
eventName = eventName +"_NoFill";
}else{
eventName = eventName +"_CallFailed";
}
FireBaseAnalyticsManager.getInstance().FAEvent(eventName);
Log.d(AdManage.getInstance().TAG, "errcode = "+errorCode);
Log.d(AdManage.getInstance().TAG, "eventName = "+eventName);
}
// //--------------------
//--------------新版本失败打点-----------
public static void FAEventFail(String eventId,String unitId,String adType,String errorCode,String errorMessage){
String[] key = {"unit_id","ad_type","error_code","error_msg"};
String[] value = {unitId,adType,errorCode,errorMessage};
FireBaseAnalyticsManager.getInstance().FAEventWithParFAEventam(eventId,key,value);
Log.d(AdManage.getInstance().TAG, "eventID : "+eventId+"call Fail");
}
//------------------
//---旧版本打点---------
public static void successFAEvent(String type){
String eventName = type;
eventName = type+"_Success";
FireBaseAnalyticsManager.getInstance().FAEvent(eventName);
Log.d(AdManage.getInstance().TAG, "eventName = "+eventName);
}
//----------新版本打点------------------
public static void FAEventSuccess(String eventID,String unitId,String adType){
String[] key = {"unit_id","ad_type"};
String[] value = {unitId,adType};
// AdManage.getInstance().FAEventWithParam(eventID,key,value);
FireBaseAnalyticsManager.getInstance().FAEventWithParFAEventam(eventID,key,value);
Log.d(AdManage.getInstance().TAG, "eventID : "+eventID+"call success "+unitId);
}
//---------------------------
public void FAEvent(String eventName){
FireBaseAnalyticsManager.getInstance().FAEvent(eventName);
}
public void FAEventWithParam(String eventName , String[] key , String[] value){
FireBaseAnalyticsManager.getInstance().FAEventWithParFAEventam(eventName,key,value);
}
/*
加载google banner广告
*/
public void loadBannerAd() {
admobBanner.loadBannerAd();
}
/*
显示google banner广告
*/
public static void showBannerAd(String pos){
AdManage.getInstance().admobBanner.showBannerAd(pos);
}
/*
隐藏google banner广告
*/
public static void hideBannerAd(){
AdManage.getInstance().admobBanner.hideBannerAd();
}
public static void loadInterstitalAd(){
AdManage.getInstance().admobInterstitial.loadInterstitalAd();
}
public static void showInterstitialAd() {
AdManage.getInstance().admobInterstitial.showInterstitialAd();
}
public static void initVideoAd(){
AdManage.getInstance().admobRewarded.initVideoAd();
}
//展示广告
public static void showRewardVideoAd(){
AdManage.getInstance().admobRewarded.showRewardVideoAd();
}
//用于cocos监听视频广告播放完成
public static boolean videoRewardedListener(){
return AdManage.getInstance().isVideoRewarded;
}
//用于cocos监听视频广告播放关闭
public static boolean videoCloseListener(){
return AdManage.getInstance().isVideoClose;
}
public boolean networkConnect() {
return true;
}
}
AppActivity
package org.cocos2dx.javascript;
import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import android.app.Service;
import android.os.Bundle;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Vibrator;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
public class AppActivity extends Cocos2dxActivity {
private static AppActivity app = null;
private int screenWidth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Workaround in
// https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
if (!isTaskRoot()) {
// Android launched another instance of the root activity into an existing task
// so just quietly finish and go away, dropping the user back into the activity
// at the top of the stack (ie: the last state of this task)
// Don't need to finish it again since it's finished in super.onCreate .
return;
}
// DO OTHER INITIALIZATION BELOW
SDKWrapper.getInstance().init(this);
//屏幕常亮
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//管理初始化
initManager();
}
public void initManager(){
app = this;
//初始化firebase
FireBaseAnalyticsManager.getInstance().init(this);
//初始化app跳转
JumpToApp.getInstance().init(this);
getSize();
//初始化广告管理
AdManage.getInstance().init(this,this.screenWidth);
}
public void getSize() {
// Step 2 - Determine the screen width (less decorations) to use for the ad width.
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
int widthPixels = outMetrics.widthPixels;
int heightPixels = outMetrics.heightPixels;
float density = outMetrics.density;
int adWidth = (int) (widthPixels / density)/2;
this.screenWidth = widthPixels;
Log.d(AdManage.getInstance().TAG, "widthPixels: "+widthPixels);
Log.d(AdManage.getInstance().TAG, "heightPixels: "+heightPixels);
Log.d(AdManage.getInstance().TAG, "density: "+density);
Log.d(AdManage.getInstance().TAG, "adWidth: "+adWidth);
}
//跳谷歌商城下的游戏页面=============================
// public static void getAppByGooglePlay(String appPkg){
// JumpToApp.getInstance().getAppByGooglePlay(appPkg);
// }
public static void vibrate(int time){
// Log.d("vibrate", "shakeeeee: ");
Vibrator vib=(Vibrator)app.getSystemService(Service.VIBRATOR_SERVICE);
vib.vibrate(time);
}
@Override
public Cocos2dxGLSurfaceView onCreateView() {
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
// TestCpp should create stencil buffer
glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
SDKWrapper.getInstance().setGLSurfaceView(glSurfaceView, this);
return glSurfaceView;
}
@Override
protected void onResume() {
super.onResume();
SDKWrapper.getInstance().onResume();
}
@Override
protected void onPause() {
super.onPause();
SDKWrapper.getInstance().onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
// Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
if (!isTaskRoot()) {
return;
}
SDKWrapper.getInstance().onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
SDKWrapper.getInstance().onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
SDKWrapper.getInstance().onNewIntent(intent);
}
@Override
protected void onRestart() {
super.onRestart();
SDKWrapper.getInstance().onRestart();
}
@Override
protected void onStop() {
super.onStop();
SDKWrapper.getInstance().onStop();
}
@Override
public void onBackPressed() {
SDKWrapper.getInstance().onBackPressed();
super.onBackPressed();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
SDKWrapper.getInstance().onConfigurationChanged(newConfig);
super.onConfigurationChanged(newConfig);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
SDKWrapper.getInstance().onRestoreInstanceState(savedInstanceState);
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
SDKWrapper.getInstance().onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@Override
protected void onStart() {
SDKWrapper.getInstance().onStart();
super.onStart();
}
}
JumpToApp.java
package org.cocos2dx.javascript;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.List;
//从商城获取app,或者打开本地
public class JumpToApp {
private static JumpToApp mInstace = null;
//得到版本号
public static String versionName;
private Context mainActive = null;
public static JumpToApp getInstance() {
if (null == mInstace) {
mInstace = new JumpToApp();
}
return mInstace;
}
public void init(Context context){
mainActive = context;
}
//跳谷歌商城下的游戏页面=============================
public static void getAppByGooglePlay(String appPkg){
mInstace.appUpdate(JumpToApp.getInstance().mainActive,appPkg,"com.android.vending");
}
/**
* 判断应用市场是否存在的方法
* @param context
* @param packageName
* 主流应用商店对应的包名
* com.android.vending -----Google Play
* com.tencent.android.qqdownloader -----应用宝
* com.qihoo.appstore -----360手机助手
* com.baidu.appsearch -----百度手机助
* com.xiaomi.market -----小米应用商店
* com.wandoujia.phoenix2 -----豌豆荚
* com.huawei.appmarket -----华为应用市场
* com.taobao.appcenter -----淘宝手机助手
* com.hiapk.marketpho -----安卓市场
* cn.goapk.market -----安智市场
* @return
*/
public static boolean isAvilible(Context context, String packageName){
// 获取packagemanager
final PackageManager packageManager = context.getPackageManager();
// 获取所有已安装程序的包信息
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
// 用于存储所有已安装程序的包名
List<String> pName = new ArrayList<String>();
// 从pinfo中将包名字取出
if (pinfo != null){
for (int i = 0; i < pinfo.size(); i++){
String pf = pinfo.get(i).packageName;
pName.add(pf);
}
}
// 判断pName中是否有目标程序的包名,有true,没有false
return pName.contains(packageName);
}
//得到版本号
public static void getVersionName(Context context){
PackageManager manager = context.getPackageManager();
try{
PackageInfo info = manager.getPackageInfo(context.getPackageName(),0);
versionName = info.versionName;
}catch (PackageManager.NameNotFoundException e){
e.printStackTrace();
}
}
private void appUpdate(Context context,String appPkg, String marketPkg){
//判断应用市场是否有包名
if(isAvilible(context,appPkg)){
Intent intent = context.getPackageManager().getLaunchIntentForPackage(appPkg);
context.startActivity(intent);
}else if(isAvilible(context,marketPkg)){
launchAppDetail(context,appPkg,marketPkg);
}else { //没有,用浏览器打开地址进行下载
//安装市场应用,那么根据后台返回的地址,用浏览器打开地址进行下载
//Uri uri = Uri.parse(url);
//Intent intent =new Intent(Intent.ACTION_VIEW, uri);
//startActivity(intent);
}
//Toast.makeText(this,"立即更新",Toast.LENGTH_LONG).show();
}
/**
* 启动到应用商店app详情界面
* @param mContext
* @param appPkg 目标App的包名
* @param marketPkg 应用商店包名 ,如果为""则由系统弹出应用商店列表供用户选择,否则调转到目标市场的应用详情界面
*/
//跳转更新
public static void launchAppDetail(Context mContext, String appPkg, String marketPkg){
try{
if (TextUtils.isEmpty(appPkg)){
return;
}
Uri uri = Uri.parse("market://details?id=" + appPkg);
Intent intent =new Intent(Intent.ACTION_VIEW, uri);
if (!TextUtils.isEmpty(marketPkg)){
intent.setPackage(marketPkg);
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}catch (Exception e){
e.printStackTrace();
}
}
}
FireBaseAnalyticsManager.java(打点统计)
package org.cocos2dx.javascript;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import com.google.firebase.analytics.FirebaseAnalytics;
public class FireBaseAnalyticsManager {
private static FireBaseAnalyticsManager mInstace = null;
private FirebaseAnalytics mFirebaseAnalytics;
private Context mainActive = null;
private static final String Tag = "firebase";
//private Map<String, Integer> eventCount =null;
private static long beginTime ;
private static long endTime ;
public static FireBaseAnalyticsManager getInstance() {
if (null == mInstace) {
mInstace = new FireBaseAnalyticsManager();
}
return mInstace;
}
public void init(Context context){
this.mainActive = context;
mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
}
public static void FAEvent(String eventName){
Log.d(Tag, "FAEvent"+eventName);
Bundle params = new Bundle();
// params.putString("value","nul");
FireBaseAnalyticsManager.getInstance().mFirebaseAnalytics.logEvent(eventName, params);
}
public static void FAEventWithParFAEventam(String eventName , String[] key , String[] value){
Log.d(Tag, "FAEventWithParFAEventam = "+eventName);
int paramLength = key.length;
Log.d(Tag, "paramLength"+paramLength);
Bundle params = new Bundle();
for(int i = 0;i<paramLength;i++){
params.putString(key[i],value[i]);
}
FireBaseAnalyticsManager.getInstance().mFirebaseAnalytics.logEvent(eventName, params);
}
public static void FAEventWithParFAEventam(String eventName , String key , String value){
Log.d(Tag, "FAEventWithParFAEventam = "+eventName);
Bundle params = new Bundle();
params.putString(key,value);
FireBaseAnalyticsManager.getInstance().mFirebaseAnalytics.logEvent(eventName, params);
}
public static void FAEventBegin(String eventName){
Log.d(Tag, "FAEventBegin = "+eventName);
beginTime = System.currentTimeMillis();
Bundle params = new Bundle();
// params.putString("value","nul");
FireBaseAnalyticsManager.getInstance().mFirebaseAnalytics.logEvent(eventName, params);
}
public static void FAEventEnd(String eventName){
Log.d(Tag, "FAEventEnd = "+eventName);
endTime = System.currentTimeMillis();
double betweenTime = (endTime - beginTime)/1000.0;
Bundle params = new Bundle();
String.valueOf(betweenTime);
params.putString("time", String.valueOf(betweenTime));
FireBaseAnalyticsManager.getInstance().mFirebaseAnalytics.logEvent(eventName, params);
Log.d(Tag, "eventTime = "+betweenTime);
}
}
cocos Android 互相调用
import GameManager from "./GameManager";
const { ccclass, property } = cc._decorator;
@ccclass
export default class PlatformApi {
private static _instance: PlatformApi | null = null;
public static get Instance() {
if (!PlatformApi._instance) {
window["PlatformApi"] = new PlatformApi();
PlatformApi._instance = new PlatformApi()
}
// return PlatformApi._instance || (PlatformApi._instance = new PlatformApi());
return PlatformApi._instance;
}
// 是否预加载激励广告
public isLoadRewardAd: boolean = false;
// 申请激励广告时间
public showRewardVideoADTime: number = 0;
public vibrateNum: number = 0;
// 震动时间
public VibrateTime: number = 0;
// 是否ios平台
public isPlatformIos() {
let bIos = false;
if (cc.sys.os == cc.sys.OS_IOS) {
bIos = true;
}
return bIos;
}
/**
*
* @param dir bottom-lefte 左下 top 顶部居中 bottom 底部居中 top-lefte
*/
public showBanner(dir: string) {
cc.log("广告 showBanner");
//eg
//jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AdManage", "showBannerAd", "(Ljava/lang/String;)V", "bottom-left");
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AdManage", "showBannerAd", "(Ljava/lang/String;)V", dir);
}
/**隐藏banner */
public hideBanner() {
cc.log("广告 hideBanner");
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AdManage", "hideBannerAd", "()V");
}
timeCount=120;
//这个计时得在其他常驻节点上调用
public UpdateInterstitialAd()
{
PlatformApi.Instance.timeCount++;
//cc.log("timeCount "+PlatformApi.Instance.timeCount);
}
//展示插屏广告
public showInterstitialAd(time=35) {
cc.log("广告 插屏广告");
//35秒内触发一次,不需要的话可以注释掉
if (this.timeCount<time) {
cc.log("广告 "+this.timeCount+" 短时间内重复触发");
return;
}
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AdManage", "showInterstitialAd", "()V");
}
//展示激励广告
public showRewardVideoAD() {
// =================================
let newTime = new Date().getTime();
if ((newTime - PlatformApi.Instance.showRewardVideoADTime) < 5000) {
cc.game.emit("_no_5_seconds_");
// console.log("5秒内不能重复请求");
return;
}
PlatformApi.Instance.showRewardVideoADTime = newTime;
// =================================
console.log("广告 激励广告");
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AdManage", "showRewardVideoAd", "()V");
}
//
public jumpToApp(appPkg: string) {
if (cc.sys.os == cc.sys.OS_ANDROID) {
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/JumpToApp", "getAppByGooglePlay", "(Ljava/lang/String;)V", appPkg);
} else if (cc.sys.os == cc.sys.OS_IOS) {
jsb.reflection.callStaticMethod("CommonManager", "jumpToApp:", appPkg);
}
}
// 打点
public FAEvent(eventName: string) {
cc.log("FAEvent 打点 = " + eventName);
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/FireBaseAnalyticsManager", "FAEvent", "(Ljava/lang/String;)V", eventName);
}
public FAEventWithStringParam(eventName: string, key: string, value: string) {
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/FireBaseAnalyticsManager", "FAEventWithParFAEventam", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", eventName, key, value);
}
public FAEventBegin(eventName: string) {
cc.log("FAEventBegin 打点 = " + eventName);
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/FireBaseAnalyticsManager", "FAEventBegin", "(Ljava/lang/String;)V", eventName);
}
public FAEventEnd(eventName: string) {
cc.log("FAEventEnd 打点 = " + eventName);
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/FireBaseAnalyticsManager", "FAEventEnd", "(Ljava/lang/String;)V", eventName);
}
// 回调=================================================================================
// 安卓广告播放成功回调
// 安卓广告播放成功回调
public getVideoReward() {
console.log("ADManage getVideoReward");
cc.game.emit("_get_video_reward_");
}
// 广告回调失败是因为缺少库存,显示本地广告
public showRewardVideoADFailByAndroid() {
console.log("ADManage showRewardVideoADFailByAndroid");
cc.game.emit("_show_reward_video_AD_fail_");
}
// 插屏广告关闭
public getInterstitalHidden() {
console.log("ADManage getInterstitalHidden");
PlatformApi.Instance.timeCount=0;
}
//视频广告关闭
public getVideoHidden() {
console.log("ADManage getVideoHidden");
PlatformApi.Instance.timeCount=0;
}
}