zouyong 5 роки тому
коміт
1652695c59
71 змінених файлів з 3236 додано та 0 видалено
  1. 3 0
      .gitignore
  2. 53 0
      CMakeLists.txt
  3. BIN
      KeyStore/jjdzkey.jks
  4. 151 0
      app/AndroidManifest.xml
  5. 160 0
      app/build.gradle
  6. 17 0
      app/gradle.properties
  7. BIN
      app/libs/GDTSDK.unionNormal.4.351.1221.aar
  8. BIN
      app/libs/anythink_banner.aar
  9. BIN
      app/libs/anythink_china_core.aar
  10. BIN
      app/libs/anythink_core.aar
  11. BIN
      app/libs/anythink_interstitial.aar
  12. BIN
      app/libs/anythink_native.aar
  13. BIN
      app/libs/anythink_network_gdt.aar
  14. BIN
      app/libs/anythink_network_kuaishou.aar
  15. BIN
      app/libs/anythink_network_pangle_china.aar
  16. BIN
      app/libs/anythink_network_sigmob.aar
  17. BIN
      app/libs/anythink_rewardvideo.aar
  18. BIN
      app/libs/anythink_splash.aar
  19. BIN
      app/libs/dy-task-sdk-2.0.7.aar
  20. BIN
      app/libs/gson-2.8.4.jar
  21. BIN
      app/libs/kssdk-ad--3.3.9-publishRelease-4ea04e00c.aar
  22. BIN
      app/libs/miit_mdid_1.0.10.aar
  23. BIN
      app/libs/open_ad_sdk_3.6.1.4.aar
  24. BIN
      app/libs/tramini_sdk.aar
  25. BIN
      app/libs/umeng-abtest-v1.0.0.aar
  26. BIN
      app/libs/umeng-asms-armeabi-v1.2.2.aar
  27. BIN
      app/libs/umeng-common-9.3.8.jar
  28. BIN
      app/libs/windAd-3.0.1.aar
  29. 40 0
      app/proguard-rules.pro
  30. 98 0
      app/src/com/aries/jjdz/mz/ad/BannerAD.java
  31. 32 0
      app/src/com/aries/jjdz/mz/ad/Constants.java
  32. 100 0
      app/src/com/aries/jjdz/mz/ad/FullScreenAD.java
  33. 96 0
      app/src/com/aries/jjdz/mz/ad/InterstitalAD.java
  34. 145 0
      app/src/com/aries/jjdz/mz/ad/NativeExpressAD.java
  35. 213 0
      app/src/com/aries/jjdz/mz/ad/NativeRender.java
  36. 155 0
      app/src/com/aries/jjdz/mz/ad/RewardVideoAD.java
  37. 118 0
      app/src/com/aries/jjdz/mz/ad/SplashADActivity.java
  38. 43 0
      app/src/com/aries/jjdz/mz/receiver/DownloadObserver.java
  39. 23 0
      app/src/com/aries/jjdz/mz/receiver/DownloadReceiver.java
  40. 34 0
      app/src/com/aries/jjdz/mz/receiver/InstallReceiver.java
  41. 96 0
      app/src/com/aries/jjdz/mz/utils/CheckUtil.java
  42. 95 0
      app/src/com/aries/jjdz/mz/utils/DownloadUtil.java
  43. 93 0
      app/src/com/aries/jjdz/mz/utils/MiitHelper.java
  44. 116 0
      app/src/com/aries/jjdz/mz/utils/MobileInfoUtil.java
  45. 18 0
      app/src/com/aries/jjdz/mz/utils/ToastUtil.java
  46. 78 0
      app/src/com/aries/jjdz/mz/utils/WechatUtil.java
  47. 107 0
      app/src/com/aries/jjdz/mz/wxapi/WXEntryActivity.java
  48. 643 0
      app/src/com/cocos/game/MainActivity.java
  49. 167 0
      app/src/com/cocos/game/MainApplication.java
  50. 8 0
      build-cfg.json
  51. 30 0
      build.gradle
  52. 29 0
      jni/main.cpp
  53. BIN
      res/drawable/ad_close.png
  54. BIN
      res/drawable/ad_logo.png
  55. BIN
      res/drawable/loading_bg.jpg
  56. BIN
      res/drawable/share_icon.png
  57. 13 0
      res/layout/banner_ad.xml
  58. 17 0
      res/layout/native_ad.xml
  59. 142 0
      res/layout/native_ad_item.xml
  60. 15 0
      res/layout/splash.xml
  61. 20 0
      res/layout/splash_ad.xml
  62. BIN
      res/mipmap-hdpi/ic_launcher.png
  63. BIN
      res/mipmap-mdpi/ic_launcher.png
  64. BIN
      res/mipmap-xhdpi/ic_launcher.png
  65. BIN
      res/mipmap-xxhdpi/ic_launcher.png
  66. 3 0
      res/values/strings.xml
  67. 13 0
      res/values/style.xml
  68. 17 0
      res/xml/anythink_bk_gdt_file_path.xml
  69. 14 0
      res/xml/anythink_bk_sigmob_file_path.xml
  70. 16 0
      res/xml/anythink_bk_tt_file_path.xml
  71. 5 0
      res/xml/file_path.xml

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+instantapp/
+app/assets/
+app/release/

+ 53 - 0
CMakeLists.txt

@@ -0,0 +1,53 @@
+cmake_minimum_required(VERSION 3.8)
+
+option(APP_NAME "Project Name" "MOKA-TD-JJ-Client")
+project(${APP_NAME} CXX)
+
+include(${CMAKE_CURRENT_LIST_DIR}/../common/CMakeLists.txt)
+
+
+set(LIB_NAME cocos)
+
+set(PROJ_SOURCES
+    ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/Game.h
+    ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/Game.cpp
+    ${CMAKE_CURRENT_LIST_DIR}/jni/main.cpp
+)
+
+
+if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/jsb_module_register.cpp)
+    file(COPY "${COCOS_X_PATH}/cocos/bindings/manual/jsb_module_register.cpp"
+        DESTINATION ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/)
+endif()
+
+
+# -------------- SRART ---------------
+# USED BY COCOS SERVICE, DON'T REMOVE!
+if(EXISTS ${RES_DIR}/proj/service.cmake)
+    set(SERVICE_NATIVE_DIR ${CMAKE_CURRENT_LIST_DIR})
+    include(${RES_DIR}/proj/service.cmake)
+endif()
+# --------------  END ----------------
+
+list(APPEND PROJ_SOURCES
+    ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/jsb_module_register.cpp
+)
+
+add_library(${LIB_NAME} SHARED ${PROJ_SOURCES})
+
+
+# -------------- SRART ---------------
+# USED BY COCOS SERVICE, DON'T REMOVE!
+if(COMMAND service_insert_library)
+    service_insert_library()
+endif()
+# --------------  END ----------------
+
+target_link_libraries(${LIB_NAME}
+    "-Wl,--whole-archive" cocos2d_jni "-Wl,--no-whole-archive"
+    cocos2d
+)
+
+target_include_directories(${LIB_NAME} PRIVATE
+    ${CMAKE_CURRENT_LIST_DIR}/../common/Classes
+)

BIN
KeyStore/jjdzkey.jks


+ 151 - 0
app/AndroidManifest.xml

@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.aries.jjdz.mz"
+    android:installLocation="auto">
+
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+    <uses-permission android:name="android.permission.GET_TASKS" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+
+    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
+
+    <application
+        android:name="com.cocos.game.MainApplication"
+        android:allowBackup="true"
+        android:hardwareAccelerated="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:usesCleartextTraffic="true">
+
+        <!-- Tell CocosNativeActivity the name of our .so -->
+        <meta-data
+            android:name="android.app.lib_name"
+            android:value="cocos" />
+
+        <!--        下载完成广播注册-->
+        <receiver android:name="com.aries.jjdz.mz.receiver.DownloadReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
+                <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" />
+            </intent-filter>
+        </receiver>
+
+        <!--        安装完成广播-->
+        <receiver android:name="com.aries.jjdz.mz.receiver.InstallReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.PACKAGE_ADDED" />
+                <action android:name="android.intent.action.PACKAGE_REPLACED" />
+                <action android:name="android.intent.action.PACKAGE_REMOVED" />
+                <data android:scheme="package" />
+            </intent-filter>
+        </receiver>
+
+        <activity
+            android:name="com.cocos.game.MainActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
+            android:fitsSystemWindows="true"
+            android:label="@string/app_name"
+            android:launchMode="singleTop"
+            android:resizeableActivity="false"
+            android:screenOrientation="portrait"
+            android:taskAffinity="com.aries.jjdz.mz"
+            android:theme="@style/openTheme">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <!--        开屏广告布局-->
+        <activity
+            android:name="com.aries.jjdz.mz.ad.SplashADActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
+            android:fitsSystemWindows="true"
+            android:label="@string/app_name"
+            android:launchMode="singleTop"
+            android:screenOrientation="portrait"
+            android:taskAffinity="com.aries.jjdz.mz"
+            android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
+            <!--            <intent-filter>-->
+            <!--                <action android:name="android.intent.action.MAIN" />-->
+            <!--                <category android:name="android.intent.category.LAUNCHER" />-->
+            <!--            </intent-filter>-->
+        </activity>
+
+        <!--        微信回跳-->
+        <activity
+            android:name="com.aries.jjdz.mz.wxapi.WXEntryActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
+            android:exported="true"
+            android:fitsSystemWindows="true"
+            android:label="@string/app_name"
+            android:launchMode="singleTop"
+            android:screenOrientation="portrait"
+            android:taskAffinity="com.aries.jjdz.mz"
+            android:theme="@style/wxTheme" />
+
+        <activity
+            android:name="com.cocos.lib.CocosEditBoxActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
+            android:screenOrientation="behind"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
+
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="${applicationId}.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_path" />
+        </provider>
+
+
+        <uses-library
+            android:name="org.apache.http.legacy"
+            android:required="false" />
+        <!-- source file: china/network_sdk/pangle/AndroidManifest.xml -->
+        <provider
+            android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
+            android:authorities="${applicationId}.TTMultiProvider"
+            android:exported="false" />
+        <provider
+            android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
+            android:authorities="${applicationId}.TTFileProvider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/anythink_bk_tt_file_path" />
+        </provider>
+        <!-- source file: china/network_sdk/gdt/AndroidManifest.xml -->
+
+        <provider
+            android:name="com.qq.e.comm.GDTFileProvider"
+            android:authorities="${applicationId}.gdt.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/anythink_bk_gdt_file_path" />
+        </provider>
+
+        <provider
+            android:name="com.sigmob.sdk.SigmobFileProvider"
+            android:authorities="${applicationId}.sigprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/anythink_bk_sigmob_file_path"/>
+        </provider>
+    </application>
+
+</manifest>

+ 160 - 0
app/build.gradle

@@ -0,0 +1,160 @@
+import org.apache.tools.ant.taskdefs.condition.Os
+
+apply plugin: 'com.android.application'
+
+RES_PATH = RES_PATH.replace("\\", "/")
+COCOS_ENGINE_PATH = COCOS_ENGINE_PATH.replace("\\", "/")
+
+buildDir = "${RES_PATH}/proj/build/$project.name"
+android {
+    compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
+    buildToolsVersion PROP_BUILD_TOOLS_VERSION
+    ndkPath PROP_NDK_PATH
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    defaultConfig {
+        applicationId APPLICATION_ID
+        minSdkVersion PROP_MIN_SDK_VERSION
+        targetSdkVersion PROP_TARGET_SDK_VERSION
+        versionCode "${VERSION_CODE}".toInteger()
+        versionName "${VERSION_NAME}"
+        multiDexEnabled true
+
+        externalNativeBuild {
+            cmake {
+                targets "cocos"
+                arguments "-DRES_DIR=${RES_PATH}", "-DCOCOS_X_PATH=${COCOS_ENGINE_PATH}", "-DANDROID_STL=c++_static", "-DANDROID_TOOLCHAIN=clang", "-DANDROID_ARM_NEON=TRUE", "-DANDROID_LD=gold"
+                cppFlags "-frtti -fexceptions -fsigned-char"
+            }
+            ndk { abiFilters PROP_APP_ABI.split(':') }
+        }
+        manifestPlaceholders.put("APPLOG_SCHEME","rangersapplog.byAx6uYt".toLowerCase())
+
+    }
+
+    sourceSets.main {
+        java.srcDirs "../src", "src"
+        res.srcDirs "../res", 'res'
+        jniLibs.srcDirs "../libs", 'libs'
+        manifest.srcFile "AndroidManifest.xml"
+        assets.srcDir "assets"
+        jniLibs {
+            // Vulkan validation layer
+            // srcDir "${android.ndkDirectory}/sources/third_party/vulkan/src/build-android/jniLibs"
+        }
+    }
+
+    externalNativeBuild {
+        cmake {
+            path "../CMakeLists.txt"
+            buildStagingDirectory "${RES_PATH}/proj/build"
+        }
+    }
+
+    signingConfigs {
+
+       release {
+            if (project.hasProperty("RELEASE_STORE_FILE") && !RELEASE_STORE_FILE.isEmpty()) {
+                storeFile file(RELEASE_STORE_FILE)
+                storePassword RELEASE_STORE_PASSWORD
+                keyAlias RELEASE_KEY_ALIAS
+                keyPassword RELEASE_KEY_PASSWORD
+            }
+        }
+    }
+
+    buildTypes {
+        release {
+            if (project.hasProperty("RELEASE_STORE_FILE")) {
+                signingConfig signingConfigs.release
+            }
+            /**
+             * 配置BuildConfig自动获取字段
+             */
+            buildConfigField "String", "TF_CHANNEL", "${TF_CHANNEL}"
+            buildConfigField "String", "JL_AID", "${JL_AID}"
+            buildConfigField "String", "JL_CHANNEL", "${JL_CHANNEL}"
+            buildConfigField "String", "KS_AID", "${KS_AID}"
+            buildConfigField "String", "KS_ANAME", "${KS_ANAME}"
+            buildConfigField "String", "KS_CHANNEL", "${KS_CHANNEL}"
+            buildConfigField "String", "UM_AID", "${UM_AID}"
+            buildConfigField "String", "UM_CHANNEL", "${UM_CHANNEL}"
+            buildConfigField "String", "UM_SECRET", "${UM_SECRET}"
+            buildConfigField "String", "WX_APP_ID", "${WX_APP_ID}"
+            buildConfigField "String", "TOPON", "${TOPON}"
+        }
+
+        debug {
+            if (project.hasProperty("RELEASE_STORE_FILE")) {
+                signingConfig signingConfigs.release
+            }
+            /**
+             * 配置BuildConfig自动获取字段
+             */
+            buildConfigField "String", "TF_CHANNEL", "${TF_CHANNEL}"
+            buildConfigField "String", "JL_AID", "${JL_AID}"
+            buildConfigField "String", "JL_CHANNEL", "${JL_CHANNEL}"
+            buildConfigField "String", "KS_AID", "${KS_AID}"
+            buildConfigField "String", "KS_ANAME", "${KS_ANAME}"
+            buildConfigField "String", "KS_CHANNEL", "${KS_CHANNEL}"
+            buildConfigField "String", "UM_AID", "${UM_AID}"
+            buildConfigField "String", "UM_CHANNEL", "${UM_CHANNEL}"
+            buildConfigField "String", "UM_SECRET", "${UM_SECRET}"
+            buildConfigField "String", "WX_APP_ID", "${WX_APP_ID}"
+            buildConfigField "String", "TOPON", "${TOPON}"
+        }
+    }
+}
+
+android.applicationVariants.all { variant ->
+
+    def outputDir ="${projectDir}/assets"
+    def sourceDir = "${RES_PATH}/assets"
+
+    // assert file("${sourceDir}/res").exists()
+
+    delete "${outputDir}"
+    def targetName = variant.name.capitalize()
+    def copyTaskName = "copy${targetName}ResourcesToAssets"
+
+    tasks.register(copyTaskName) {
+
+        copy {
+            from sourceDir
+            into outputDir
+        }
+    }
+
+    tasks.getByName("pre${targetName}Build").dependsOn copyTaskName
+}
+
+dependencies {
+    implementation fileTree(dir: '../libs', include: ['*.jar','*.aar'])
+    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
+    implementation fileTree(dir: "${COCOS_ENGINE_PATH}/cocos/platform/android/java/libs", include: ['*.jar'])
+    implementation project(':libservice')
+    implementation project(':libcocos')
+
+    implementation "com.android.support:design:27.1.1"
+    implementation 'com.android.support:multidex:1.0.3'
+    implementation 'com.android.support:support-v4:27.1.1'
+    implementation "com.android.support:appcompat-v7:27.1.1"
+    implementation "com.android.support:recyclerview-v7:27.1.1"
+
+    implementation "com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+"
+
+    implementation "com.github.bumptech.glide:glide:4.8.0"
+    annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
+
+    implementation 'com.arialyy.aria:core:3.8.15'
+    annotationProcessor 'com.arialyy.aria:compiler:3.8.15'
+
+    implementation 'com.github.smarxpan:NotchScreenTool:0.0.1'//刘海适配
+
+    implementation 'cn.thinkingdata.android:ThinkingAnalyticsSDK:2.7.0'//数数SDK
+    implementation 'com.bytedance.applog:RangersAppLog-Lite-cn:5.5.1'
+}

+ 17 - 0
app/gradle.properties

@@ -0,0 +1,17 @@
+TF_CHANNEL="1"
+UM_AID="60d15dc98a102159db73442e"
+UM_CHANNEL="juliang_jiangjundingzhu"
+MY_APP_NAME=\u5f00\u5fc3\u519c\u4e50\u56ed
+WX_APP_ID="wxd90e9f448c4d179e"
+UM_SECRET="432e41656d8208c94c9a59c134a0b2cb"
+KS_ANAME=""
+VERSION_CODE=1
+#id,key,reward,interstitial,native,splash,banner,fullscreen
+TOPON="a60cd99bf8b3fb,66b742dd0e502b64d783d9c66a9d30c4,b60cd9a516fcd4,b60cd9a51bf017,b60cd9a52f3b29,b60cd9a526e104,b60cd9a52b931a,b60cd9a5207fd8"
+VERSION_NAME=1.0.2
+APP_CONFIG_CODE=""
+JL_CHANNEL="juliang"
+KS_CHANNEL=""
+PACKAGE_NAME=com.aries.jjdz.mz
+KS_AID=""
+JL_AID="215656"

BIN
app/libs/GDTSDK.unionNormal.4.351.1221.aar


BIN
app/libs/anythink_banner.aar


BIN
app/libs/anythink_china_core.aar


BIN
app/libs/anythink_core.aar


BIN
app/libs/anythink_interstitial.aar


BIN
app/libs/anythink_native.aar


BIN
app/libs/anythink_network_gdt.aar


BIN
app/libs/anythink_network_kuaishou.aar


BIN
app/libs/anythink_network_pangle_china.aar


BIN
app/libs/anythink_network_sigmob.aar


BIN
app/libs/anythink_rewardvideo.aar


BIN
app/libs/anythink_splash.aar


BIN
app/libs/dy-task-sdk-2.0.7.aar


BIN
app/libs/gson-2.8.4.jar


BIN
app/libs/kssdk-ad--3.3.9-publishRelease-4ea04e00c.aar


BIN
app/libs/miit_mdid_1.0.10.aar


BIN
app/libs/open_ad_sdk_3.6.1.4.aar


BIN
app/libs/tramini_sdk.aar


BIN
app/libs/umeng-abtest-v1.0.0.aar


BIN
app/libs/umeng-asms-armeabi-v1.2.2.aar


BIN
app/libs/umeng-common-9.3.8.jar


BIN
app/libs/windAd-3.0.1.aar


+ 40 - 0
app/proguard-rules.pro

@@ -0,0 +1,40 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in E:\developSoftware\Android\SDK/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Proguard Cocos2d-x-lite for release
+-keep public class com.cocos.** { *; }
+-dontwarn com.cocos.**
+
+# Proguard Apache HTTP for release
+-keep class org.apache.http.** { *; }
+-dontwarn org.apache.http.**
+
+# Proguard okhttp for release
+-keep class okhttp3.** { *; }
+-dontwarn okhttp3.**
+
+-keep class okio.** { *; }
+-dontwarn okio.**
+
+# Proguard Android Webivew for release. you can comment if you are not using a webview
+-keep public class android.net.http.SslError
+-keep public class android.webkit.WebViewClient
+
+-dontwarn android.webkit.WebView
+-dontwarn android.net.http.SslError
+-dontwarn android.webkit.WebViewClient

+ 98 - 0
app/src/com/aries/jjdz/mz/ad/BannerAD.java

@@ -0,0 +1,98 @@
+package com.aries.jjdz.mz.ad;
+
+import android.app.Activity;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.anythink.banner.api.ATBannerListener;
+import com.anythink.banner.api.ATBannerView;
+import com.anythink.core.api.ATAdInfo;
+import com.anythink.core.api.AdError;
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+
+public class BannerAD {
+    private ATBannerView atBannerView;
+    private Activity activity;
+    private ViewGroup viewGroup;
+
+    public BannerAD(Activity activity, ViewGroup viewGroup) {
+        this.activity = activity;
+        this.atBannerView = new ATBannerView(activity);
+        this.atBannerView.setPlacementId(Constants.BANNER_AD_ID);
+
+        float ratio = 320 / 70f;//必须跟TopOn后台配置的Banner广告源宽高比例一致,假设尺寸为320x50
+        int width = activity.getResources().getDisplayMetrics().widthPixels;//定一个宽度值,比如屏幕宽度
+        int height = (int) (width / ratio);
+        this.viewGroup = viewGroup;
+        ViewGroup.LayoutParams pp = this.viewGroup.getLayoutParams();
+        pp.height = height;
+        this.viewGroup.setLayoutParams(pp);
+        atBannerView.setLayoutParams(new ViewGroup.LayoutParams(width, height));
+        viewGroup.addView(atBannerView);
+
+        atBannerView.setBannerAdListener(new ATBannerListener() {
+            @Override
+            public void onBannerLoaded() {
+
+            }
+
+            @Override
+            public void onBannerFailed(AdError adError) {
+
+            }
+
+            @Override
+            public void onBannerClicked(ATAdInfo atAdInfo) {
+
+            }
+
+            @Override
+            public void onBannerShow(ATAdInfo atAdInfo) {
+                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("" +
+                        "g.adData.ad_type=7;" +
+                        "g.adData.destoon_ad_place='" + atAdInfo.getTopOnPlacementId() + "';" +
+                        "g.adData.adsource_id='" + atAdInfo.getAdsourceId() + "';" +
+                        "g.adData.network_firm_id=" + atAdInfo.getNetworkFirmId() + ";" +
+                        "g.adData.network_placement_id='" + atAdInfo.getNetworkPlacementId() + "';" +
+                        "g.adData.adsource_price=" + atAdInfo.getEcpm() + ";" +
+                        "g.adData.network_type='" + atAdInfo.getAdNetworkType() + "';" +
+                        "g.adData.adsource_index=" + atAdInfo.getAdsourceIndex() + ";" +
+                        "g.adData.adsource_isheaderbidding=" + atAdInfo.isHeaderBiddingAdsource() + ";" +
+                        "g.adData.adunit_format='" + atAdInfo.getTopOnAdFormat() + "';" +
+                        "g.adData.ecpm_level=" + atAdInfo.getEcpmLevel() + ";" +
+                        "g.adData.precision_ecpm='" + atAdInfo.getEcpmPrecision() + "';" +
+                        "g.adData.publisher_revenue='" + atAdInfo.getPublisherRevenue() + "';" +
+                        "g.onBannerADShow();"));
+            }
+
+            @Override
+            public void onBannerClose(ATAdInfo atAdInfo) {
+                viewGroup.setVisibility(View.GONE);
+            }
+
+            @Override
+            public void onBannerAutoRefreshed(ATAdInfo atAdInfo) {
+
+            }
+
+            @Override
+            public void onBannerAutoRefreshFail(AdError adError) {
+
+            }
+        });
+    }
+
+    /**
+     * 向外提供加载方法,以便快速反应
+     */
+    public void loadBannerAD() {
+        atBannerView.loadAd();
+    }
+
+    public void removeAD() {
+        if (atBannerView != null && atBannerView.getParent() != null) {
+            ((ViewGroup) atBannerView.getParent()).removeView(atBannerView);
+        }
+    }
+}

+ 32 - 0
app/src/com/aries/jjdz/mz/ad/Constants.java

@@ -0,0 +1,32 @@
+package com.aries.jjdz.mz.ad;
+
+import com.aries.jjdz.mz.BuildConfig;
+
+public class Constants {
+    private static String allParam = BuildConfig.TOPON;
+
+    public static String APP_KEY = splitString(allParam)[1];
+    public static String APP_ID = splitString(allParam)[0];
+    //广告位
+    public static String SPLASH_AD_ID = splitString(allParam)[5];
+    public static String REWARD_AD_ID = splitString(allParam)[2];
+    public static String INTERSTITIAL_AD_ID = splitString(allParam)[3];
+    public static String NATIVE_AD_ID = splitString(allParam)[4];
+    public static String BANNER_AD_ID = splitString(allParam)[6];
+    public static String FULLSCREEN_AD_ID = splitString(allParam)[7];
+
+    public static String VOLCANIC_APP_ID = "228942";
+    public static String LICENSE = "idTSI9BLw121a/LULsoaoC4EEBPex8hUG" +
+            "XhDCZ/lKtcEpwgVfPs03R+fv3Fwc0khepWlQMYuUESRt+9uM1wMDZrCyxzn" +
+            "rKiJeAH6Tl0N+FXlZWOB4pWZuyj387SmBpV9CSKMzMHlEvpt4GQWJshWsUexpt" +
+            "COgFdr17bUCDzOoKG2X8btjldCjHQJEaFS082deleEQTwak/L6wsyU8Pk8ZYm9Fl" +
+            "CYkKvHRxsiqNy4UrxTN0ApaGfz5msLfqVJ16/tukFgGAk9JKSymAkS7K6ptgmFYUxSXeLWfL9Cl3r2XZtHJvZy";
+
+    /**
+     * 字符串分割
+     */
+    public static String[] splitString(String string) {
+        String strArr[] = string.split(",");
+        return strArr;
+    }
+}

+ 100 - 0
app/src/com/aries/jjdz/mz/ad/FullScreenAD.java

@@ -0,0 +1,100 @@
+package com.aries.jjdz.mz.ad;
+
+import android.app.Activity;
+import android.util.Log;
+
+import com.anythink.core.api.ATAdInfo;
+import com.anythink.core.api.AdError;
+import com.anythink.interstitial.api.ATInterstitial;
+import com.anythink.interstitial.api.ATInterstitialListener;
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+
+public class FullScreenAD {
+
+    private Activity activity = null;
+    private ATInterstitial atInterstitial = null;
+
+    public FullScreenAD(Activity activity) {
+        this.atInterstitial = new ATInterstitial(activity, Constants.FULLSCREEN_AD_ID);
+        this.activity = activity;
+        resultListener();
+    }
+
+    private void resultListener() {
+        this.atInterstitial.setAdListener(new ATInterstitialListener() {
+            @Override
+            public void onInterstitialAdLoaded() {
+                Log.e("", "onInterstitialAdVideoError:success");
+            }
+
+            @Override
+            public void onInterstitialAdLoadFail(AdError adError) {
+                Log.e("", "onInterstitialAdVideoError:" + adError.getFullErrorInfo());
+            }
+
+            @Override
+            public void onInterstitialAdClicked(ATAdInfo atAdInfo) {
+            }
+
+            @Override
+            public void onInterstitialAdShow(ATAdInfo atAdInfo) {
+                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.onFullScreenADShow();"));
+            }
+
+            @Override
+            public void onInterstitialAdClose(ATAdInfo atAdInfo) {
+                atInterstitial.load();
+            }
+
+            @Override
+            public void onInterstitialAdVideoStart(ATAdInfo atAdInfo) {
+
+            }
+
+            @Override
+            public void onInterstitialAdVideoEnd(ATAdInfo atAdInfo) {
+                CocosHelper.runOnGameThread(() -> {
+                    CocosJavascriptJavaBridge.evalString("g.adData.ad_type=8;" +
+                            "g.adData.destoon_ad_place='" + atAdInfo.getTopOnPlacementId() + "';" +
+                            "g.adData.adsource_id='" + atAdInfo.getAdsourceId() + "';" +
+                            "g.adData.network_firm_id=" + atAdInfo.getNetworkFirmId() + ";" +
+                            "g.adData.network_placement_id='" + atAdInfo.getNetworkPlacementId() + "';" +
+                            "g.adData.adsource_price=" + atAdInfo.getEcpm() + ";" +
+                            "g.adData.network_type='" + atAdInfo.getAdNetworkType() + "';" +
+                            "g.adData.adsource_index=" + atAdInfo.getAdsourceIndex() + ";" +
+                            "g.adData.adsource_isheaderbidding=" + atAdInfo.isHeaderBiddingAdsource() + ";" +
+                            "g.adData.adunit_format='" + atAdInfo.getTopOnAdFormat() + "';" +
+                            "g.adData.ecpm_level=" + atAdInfo.getEcpmLevel() + ";" +
+                            "g.adData.precision_ecpm='" + atAdInfo.getEcpmPrecision() + "';" +
+                            "g.adData.publisher_revenue=" + atAdInfo.getPublisherRevenue() + ";" +
+                            "g.onFullScreenADComplete();");
+                });
+            }
+
+            @Override
+            public void onInterstitialAdVideoError(AdError adError) {
+                Log.e("", "onInterstitialAdVideoError:" + adError.getFullErrorInfo());
+                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.adData.fullScreenADError=true"));
+            }
+        });
+    }
+
+    /**
+     * 向外提供加载方法,以便快速反应
+     */
+    public void loadInterstitalAD() {
+        atInterstitial.load();
+    }
+
+    /**
+     * 展示插屏
+     */
+    public void showInterstitalAD() {
+        if (atInterstitial.isAdReady()) {
+            atInterstitial.show(activity);
+        } else {
+            atInterstitial.load();
+        }
+    }
+}

+ 96 - 0
app/src/com/aries/jjdz/mz/ad/InterstitalAD.java

@@ -0,0 +1,96 @@
+package com.aries.jjdz.mz.ad;
+
+import android.app.Activity;
+
+import com.anythink.core.api.ATAdInfo;
+import com.anythink.core.api.AdError;
+import com.anythink.interstitial.api.ATInterstitial;
+import com.anythink.interstitial.api.ATInterstitialListener;
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+
+public class InterstitalAD {
+    private Activity activity = null;
+    private ATInterstitial atInterstitial = null;
+
+    public InterstitalAD(Activity activity) {
+        this.atInterstitial = new ATInterstitial(activity, Constants.INTERSTITIAL_AD_ID);
+        this.activity = activity;
+        resultListener();
+    }
+
+    private void resultListener() {
+        this.atInterstitial.setAdListener(new ATInterstitialListener() {
+            @Override
+            public void onInterstitialAdLoaded() {
+
+            }
+
+            @Override
+            public void onInterstitialAdLoadFail(AdError adError) {
+                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.adData.interstitalADError=true"));
+            }
+
+            @Override
+            public void onInterstitialAdClicked(ATAdInfo atAdInfo) {
+            }
+
+            @Override
+            public void onInterstitialAdShow(ATAdInfo atAdInfo) {
+                CocosHelper.runOnGameThread(() -> {
+                    CocosJavascriptJavaBridge.evalString("g.adData.ad_type=2;" +
+                            "g.adData.destoon_ad_place='" + atAdInfo.getTopOnPlacementId() + "';" +
+                            "g.adData.adsource_id='" + atAdInfo.getAdsourceId() + "';" +
+                            "g.adData.network_firm_id=" + atAdInfo.getNetworkFirmId() + ";" +
+                            "g.adData.network_placement_id='" + atAdInfo.getNetworkPlacementId() + "';" +
+                            "g.adData.adsource_price=" + atAdInfo.getEcpm() + ";" +
+                            "g.adData.network_type='" + atAdInfo.getAdNetworkType() + "';" +
+                            "g.adData.adsource_index=" + atAdInfo.getAdsourceIndex() + ";" +
+                            "g.adData.adsource_isheaderbidding=" + atAdInfo.isHeaderBiddingAdsource() + ";" +
+                            "g.adData.adunit_format='" + atAdInfo.getTopOnAdFormat() + "';" +
+                            "g.adData.ecpm_level=" + atAdInfo.getEcpmLevel() + ";" +
+                            "g.adData.precision_ecpm='" + atAdInfo.getEcpmPrecision() + "';" +
+                            "g.adData.publisher_revenue=" + atAdInfo.getPublisherRevenue() + ";" +
+                            "g.onInterstitalADShow();");
+                });
+
+            }
+
+            @Override
+            public void onInterstitialAdClose(ATAdInfo atAdInfo) {
+                atInterstitial.load();
+            }
+
+            @Override
+            public void onInterstitialAdVideoStart(ATAdInfo atAdInfo) {
+
+            }
+
+            @Override
+            public void onInterstitialAdVideoEnd(ATAdInfo atAdInfo) {
+            }
+
+            @Override
+            public void onInterstitialAdVideoError(AdError adError) {
+            }
+        });
+    }
+
+    /**
+     * 向外提供加载方法,以便快速反应
+     */
+    public void loadInterstitalAD() {
+        atInterstitial.load();
+    }
+
+    /**
+     * 展示插屏
+     */
+    public void showInterstitalAD() {
+        if (atInterstitial.isAdReady()) {
+            atInterstitial.show(activity);
+        } else {
+            atInterstitial.load();
+        }
+    }
+}

+ 145 - 0
app/src/com/aries/jjdz/mz/ad/NativeExpressAD.java

@@ -0,0 +1,145 @@
+package com.aries.jjdz.mz.ad;
+
+import android.app.Activity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import com.anythink.core.api.ATAdConst;
+import com.anythink.core.api.ATAdInfo;
+import com.anythink.core.api.AdError;
+import com.anythink.nativead.api.ATNative;
+import com.anythink.nativead.api.ATNativeAdView;
+import com.anythink.nativead.api.ATNativeDislikeListener;
+import com.anythink.nativead.api.ATNativeEventExListener;
+import com.anythink.nativead.api.ATNativeNetworkListener;
+import com.anythink.nativead.api.NativeAd;
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 原生信息流广告
+ */
+public class NativeExpressAD {
+    ATNative atNative;
+    ATNativeAdView atNativeAdView;
+    NativeAd nativeAd;
+
+    ViewGroup viewGroup;
+    Activity activity;
+
+    public NativeExpressAD(ViewGroup viewGroup, Activity activity) {
+        this.viewGroup = viewGroup;
+        this.activity = activity;
+    }
+
+    public void initNativeAd() {
+        atNative = new ATNative(activity, Constants.NATIVE_AD_ID, new ATNativeNetworkListener() {
+            @Override
+            public void onNativeAdLoaded() {
+                showNativeAD();
+            }
+
+            @Override
+            public void onNativeAdLoadFail(AdError adError) {
+                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.adData.nativeExpressADError=true"));
+            }
+        });
+        if (atNativeAdView == null) {
+            atNativeAdView = new ATNativeAdView(activity);
+        }
+    }
+
+    public int adViewWidth, adViewHeight;
+
+    public void loadNativeAd() {
+        if (atNative != null) {
+            adViewWidth = activity.getResources().getDisplayMetrics().widthPixels;
+            adViewHeight = dip2px(300);
+            ViewGroup.LayoutParams pp = this.viewGroup.getLayoutParams();
+            pp.height = adViewHeight;
+            this.viewGroup.setLayoutParams(pp);
+
+            Map<String, Object> localMap = new HashMap<>();
+            localMap.put(ATAdConst.KEY.AD_WIDTH, adViewWidth);
+            localMap.put(ATAdConst.KEY.AD_HEIGHT, adViewHeight);
+
+            atNative.setLocalExtra(localMap);
+            atNative.makeAdRequest();
+        }
+    }
+
+    public void showNativeAD() {
+        NativeAd nativeAd = atNative.getNativeAd();
+        if (nativeAd != null && atNativeAdView != null) {
+            atNativeAdView.removeAllViews();
+            if (atNativeAdView.getParent() == null) {//添加进入容器
+                viewGroup.addView(atNativeAdView, new FrameLayout.LayoutParams(adViewWidth, adViewHeight));
+            }
+        }
+        this.nativeAd = nativeAd;
+        if (this.nativeAd == null ) {
+            return;
+        }
+        this.nativeAd.setNativeEventListener(new ATNativeEventExListener() {
+            @Override
+            public void onDeeplinkCallback(ATNativeAdView atNativeAdView, ATAdInfo atAdInfo, boolean b) {
+            }
+
+            @Override
+            public void onAdImpressed(ATNativeAdView atNativeAdView, ATAdInfo atAdInfo) {
+                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.adData.ad_type=3;" +
+                        "g.adData.destoon_ad_place='" + atAdInfo.getTopOnPlacementId() + "';" +
+                        "g.adData.adsource_id='" + atAdInfo.getAdsourceId() + "';" +
+                        "g.adData.network_firm_id=" + atAdInfo.getNetworkFirmId() + ";" +
+                        "g.adData.network_placement_id='" + atAdInfo.getNetworkPlacementId() + "';" +
+                        "g.adData.adsource_price=" + atAdInfo.getEcpm() + ";" +
+                        "g.adData.network_type='" + atAdInfo.getAdNetworkType() + "';" +
+                        "g.adData.adsource_index=" + atAdInfo.getAdsourceIndex() + ";" +
+                        "g.adData.adsource_isheaderbidding=" + atAdInfo.isHeaderBiddingAdsource() + ";" +
+                        "g.adData.adunit_format='" + atAdInfo.getTopOnAdFormat() + "';" +
+                        "g.adData.ecpm_level=" + atAdInfo.getEcpmLevel() + ";" +
+                        "g.adData.precision_ecpm='" + atAdInfo.getEcpmPrecision() + "';" +
+                        "g.adData.publisher_revenue=" + atAdInfo.getPublisherRevenue() + ";" +
+                        "g.onNativeExpressADShow();"));
+            }
+
+            @Override
+            public void onAdClicked(ATNativeAdView atNativeAdView, ATAdInfo atAdInfo) {
+            }
+
+            @Override
+            public void onAdVideoStart(ATNativeAdView atNativeAdView) {
+            }
+
+            @Override
+            public void onAdVideoEnd(ATNativeAdView atNativeAdView) {
+            }
+
+            @Override
+            public void onAdVideoProgress(ATNativeAdView atNativeAdView, int i) {
+            }
+        });
+        this.nativeAd.setDislikeCallbackListener(new ATNativeDislikeListener() {
+            @Override
+            public void onAdCloseButtonClick(ATNativeAdView atNativeAdView, ATAdInfo atAdInfo) {
+                viewGroup.setVisibility(View.GONE);
+            }
+        });
+        NativeRender render = new NativeRender(activity);
+        this.nativeAd.renderAdView(atNativeAdView, render);
+        this.nativeAd.prepare(atNativeAdView, render.getClickView(), null);
+    }
+
+    public int dip2px(float dipValue) {
+        float scale = activity.getResources().getDisplayMetrics().density;
+        return (int) (dipValue * scale + 0.5f);
+    }
+
+    public void changeAD() {
+        atNative.makeAdRequest();
+    }
+}

+ 213 - 0
app/src/com/aries/jjdz/mz/ad/NativeRender.java

@@ -0,0 +1,213 @@
+package com.aries.jjdz.mz.ad;
+
+import android.content.Context;
+import android.text.Html;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.anythink.nativead.api.ATNativeAdRenderer;
+import com.anythink.nativead.api.ATNativeImageView;
+import com.anythink.nativead.api.NativeAdInteractionType;
+import com.anythink.nativead.unitgroup.api.CustomNativeAd;
+import com.aries.jjdz.mz.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class NativeRender implements ATNativeAdRenderer<CustomNativeAd> {
+
+    Context mContext;
+    List<View> mClickView = new ArrayList<>();
+    List<View> mClickDownloadDirectViews = new ArrayList<>();
+    View mCloseView;
+
+    boolean isSelfHandleDownloadConfirm;
+
+    public NativeRender(Context context) {
+        mContext = context;
+    }
+
+    public void setWhetherSettingDownloadConfirmListener(boolean isSelfHandle) {
+        isSelfHandleDownloadConfirm = isSelfHandle;
+    }
+
+    View mDevelopView;
+
+    int mNetworkType;
+
+    @Override
+    public View createView(Context context, int networkType) {
+        if (mDevelopView == null) {
+            mDevelopView = LayoutInflater.from(context).inflate(R.layout.native_ad_item, null);
+        }
+        mNetworkType = networkType;
+        if (mDevelopView.getParent() != null) {
+            ((ViewGroup) mDevelopView.getParent()).removeView(mDevelopView);
+        }
+        return mDevelopView;
+    }
+
+    @Override
+    public void renderAdView(View view, CustomNativeAd ad) {
+        List<View> customDownloadViews = new ArrayList<>();
+        mClickView.clear();
+        TextView titleView = (TextView) view.findViewById(R.id.native_ad_title);
+        TextView descView = (TextView) view.findViewById(R.id.native_ad_desc);
+        TextView ctaView = (TextView) view.findViewById(R.id.native_ad_install_btn);
+        TextView adFromView = (TextView) view.findViewById(R.id.native_ad_from);
+        FrameLayout contentArea = (FrameLayout) view.findViewById(R.id.native_ad_content_image_area);
+        FrameLayout iconArea = (FrameLayout) view.findViewById(R.id.native_ad_image);
+        final ATNativeImageView logoView = (ATNativeImageView) view.findViewById(R.id.native_ad_logo);
+        View versionArea = view.findViewById(R.id.native_ad_version_area);
+        TextView versionTextView = view.findViewById(R.id.native_ad_version);
+        versionTextView.setText(Html.fromHtml("<u>" + "版本" + "</u>"));
+
+
+        if (mNetworkType == 8 && isSelfHandleDownloadConfirm) {
+            customDownloadViews.add(versionTextView);
+            versionTextView.setVisibility(View.VISIBLE);
+        } else {
+            versionTextView.setVisibility(View.GONE);
+        }
+        customDownloadViews.add(ctaView);
+
+        CustomNativeAd.ExtraInfo extraInfo = new CustomNativeAd.ExtraInfo.Builder()
+                .setCloseView(mCloseView)
+                .setCustomViewList(customDownloadViews)
+                .build();
+
+        ad.setExtraInfo(extraInfo);
+
+        mClickDownloadDirectViews = new ArrayList<>();
+        if (mNetworkType == 8 || mNetworkType == 22) {
+            mClickDownloadDirectViews.add(ctaView);
+        } else {
+            mClickView.add(ctaView);
+        }
+
+
+        titleView.setText("");
+        descView.setText("");
+        ctaView.setText("");
+        adFromView.setText("");
+        titleView.setText("");
+        contentArea.removeAllViews();
+        iconArea.removeAllViews();
+        logoView.setImageDrawable(null);
+
+        View mediaView = ad.getAdMediaView(contentArea, contentArea.getWidth());
+
+        Log.i("NativeDemoRender", "Ad Interaction type:" + (ad.getNativeAdInteractionType() == NativeAdInteractionType.APP_TYPE ? "Application" : "UNKNOW"));
+
+        if (ad.isNativeExpress()) {// 模板渲染(个性化模板、自动渲染)
+            titleView.setVisibility(View.GONE);
+            descView.setVisibility(View.GONE);
+            ctaView.setVisibility(View.GONE);
+            logoView.setVisibility(View.GONE);
+            iconArea.setVisibility(View.GONE);
+            if (mCloseView != null) {
+                mCloseView.setVisibility(View.GONE);
+            }
+            if (mediaView.getParent() != null) {
+                ((ViewGroup) mediaView.getParent()).removeView(mediaView);
+            }
+            versionArea.setVisibility(View.GONE);
+
+            contentArea.addView(mediaView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT));
+            return;
+        }
+
+        // 自渲染(自定义渲染)
+
+        titleView.setVisibility(View.VISIBLE);
+        descView.setVisibility(View.VISIBLE);
+        ctaView.setVisibility(View.VISIBLE);
+        logoView.setVisibility(View.VISIBLE);
+        iconArea.setVisibility(View.VISIBLE);
+        versionArea.setVisibility(View.VISIBLE);
+        if (mCloseView != null) {
+            mCloseView.setVisibility(View.VISIBLE);
+        }
+        View adiconView = ad.getAdIconView();
+
+
+        final ATNativeImageView iconView = new ATNativeImageView(mContext);
+        if (adiconView == null) {
+            iconArea.addView(iconView);
+            iconView.setImage(ad.getIconImageUrl());
+            mClickView.add(iconView);
+        } else {
+            iconArea.addView(adiconView);
+        }
+
+
+        if (!TextUtils.isEmpty(ad.getAdChoiceIconUrl())) {
+            logoView.setImage(ad.getAdChoiceIconUrl());
+        } else {
+//            logoView.setImageResource(R.drawable.ad_logo);
+        }
+
+
+        if (mediaView != null) {
+            if (mediaView.getParent() != null) {
+                ((ViewGroup) mediaView.getParent()).removeView(mediaView);
+            }
+
+            contentArea.addView(mediaView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
+
+        } else {
+
+            ATNativeImageView imageView = new ATNativeImageView(mContext);
+            imageView.setImage(ad.getMainImageUrl());
+
+            ViewGroup.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
+            imageView.setLayoutParams(params);
+            contentArea.addView(imageView, params);
+
+            mClickView.add(imageView);
+        }
+
+        titleView.setText(ad.getTitle());
+        descView.setText(ad.getDescriptionText());
+
+        if (!TextUtils.isEmpty(ad.getCallToActionText())) {
+            ctaView.setVisibility(View.VISIBLE);
+            ctaView.setText(ad.getCallToActionText());
+        } else {
+            ctaView.setVisibility(View.GONE);
+        }
+
+
+        if (!TextUtils.isEmpty(ad.getAdFrom())) {
+            adFromView.setText(ad.getAdFrom() != null ? ad.getAdFrom() : "");
+            adFromView.setVisibility(View.VISIBLE);
+        } else {
+            adFromView.setVisibility(View.GONE);
+        }
+
+        mClickView.add(titleView);
+        mClickView.add(descView);
+
+
+    }
+
+    public List<View> getClickView() {
+        return mClickView;
+    }
+
+    public void setCloseView(ImageView closeView) {
+        this.mCloseView = closeView;
+
+    }
+
+    public List<View> getDownloadDirectViews() {
+        return mClickDownloadDirectViews;
+    }
+}

+ 155 - 0
app/src/com/aries/jjdz/mz/ad/RewardVideoAD.java

@@ -0,0 +1,155 @@
+package com.aries.jjdz.mz.ad;
+
+import android.app.Activity;
+import android.util.Log;
+
+import com.anythink.core.api.ATAdInfo;
+import com.anythink.core.api.AdError;
+import com.anythink.rewardvideo.api.ATRewardVideoAd;
+import com.anythink.rewardvideo.api.ATRewardVideoExListener;
+import com.aries.jjdz.mz.utils.ToastUtil;
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+
+public class RewardVideoAD {
+    private ATRewardVideoAd atRewardVideoAd;
+    private Activity activity;
+
+    public RewardVideoAD(Activity activity) {
+        this.activity = activity;
+        this.atRewardVideoAd = new ATRewardVideoAd(activity, Constants.REWARD_AD_ID);
+        resultListener();
+    }
+
+    private void resultListener() {
+        atRewardVideoAd.setAdListener(new ATRewardVideoExListener() {
+            @Override
+            public void onDeeplinkCallback(ATAdInfo atAdInfo, boolean b) {
+                Log.e("com.aries.jjdz.mz","onDeeplinkCallback=================================");
+            }
+
+            @Override
+            public void onRewardedVideoAdLoaded() {
+                Log.e("com.aries.jjdz.mz","onRewardedVideoAdLoaded=================================");
+            }
+
+            @Override
+            public void onRewardedVideoAdFailed(AdError adError) {
+
+//                atRewardVideoAd.load();
+//                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.onRewardVideoADLoss()"));
+
+//                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.rewardVideoADLoss()"));
+//                Log.e("com.aries.jjdz.mz","onRewardedVideoAdFailed=================================");
+
+            }
+
+            @Override
+            public void onRewardedVideoAdPlayStart(ATAdInfo atAdInfo) {
+                Log.e("com.aries.jjdz.mz","onRewardedVideoAdPlayStart=================================");
+
+                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("" +
+                        "g.adData.ad_type=1;" +
+                        "g.adData.destoon_ad_place='" + atAdInfo.getTopOnPlacementId() + "';" +
+                        "g.adData.adsource_id='" + atAdInfo.getAdsourceId() + "';" +
+                        "g.adData.network_firm_id=" + atAdInfo.getNetworkFirmId() + ";" +
+                        "g.adData.network_placement_id='" + atAdInfo.getNetworkPlacementId() + "';" +
+                        "g.adData.adsource_price=" + atAdInfo.getEcpm() + ";" +
+                        "g.adData.network_type='" + atAdInfo.getAdNetworkType() + "';" +
+                        "g.adData.adsource_index=" + atAdInfo.getAdsourceIndex() + ";" +
+                        "g.adData.adsource_isheaderbidding=" + atAdInfo.isHeaderBiddingAdsource() + ";" +
+                        "g.adData.adunit_format='" + atAdInfo.getTopOnAdFormat() + "';" +
+                        "g.adData.ecpm_level=" + atAdInfo.getEcpmLevel() + ";" +
+                        "g.adData.precision_ecpm='" + atAdInfo.getEcpmPrecision() + "';" +
+                        "g.adData.publisher_revenue='" + atAdInfo.getPublisherRevenue() + "';" +
+                        "g.onRewardVideoADShow()"));
+                atRewardVideoAd.load();
+            }
+
+            @Override
+            public void onRewardedVideoAdPlayEnd(ATAdInfo atAdInfo) {
+                Log.e("com.aries.jjdz.mz","onRewardedVideoAdPlayEnd=================================");
+            }
+
+            @Override
+            public void onRewardedVideoAdPlayFailed(AdError adError, ATAdInfo atAdInfo) {
+                Log.e("com.aries.jjdz.mz","onRewardedVideoAdPlayFailed=================================");
+
+                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("" +
+                        "g.adData.ad_type=1;" +
+                        "g.adData.destoon_ad_place='" + atAdInfo.getTopOnPlacementId() + "';" +
+                        "g.adData.adsource_id='" + atAdInfo.getAdsourceId() + "';" +
+                        "g.adData.network_firm_id=" + atAdInfo.getNetworkFirmId() + ";" +
+                        "g.adData.network_placement_id='" + atAdInfo.getNetworkPlacementId() + "';" +
+                        "g.adData.adsource_price=" + atAdInfo.getEcpm() + ";" +
+                        "g.adData.network_type='" + atAdInfo.getAdNetworkType() + "';" +
+                        "g.adData.adsource_index=" + atAdInfo.getAdsourceIndex() + ";" +
+                        "g.adData.adsource_isheaderbidding=" + atAdInfo.isHeaderBiddingAdsource() + ";" +
+                        "g.adData.adunit_format='" + atAdInfo.getTopOnAdFormat() + "';" +
+                        "g.adData.ecpm_level=" + atAdInfo.getEcpmLevel() + ";" +
+                        "g.adData.precision_ecpm='" + atAdInfo.getEcpmPrecision() + "';" +
+                        "g.adData.publisher_revenue='" + atAdInfo.getPublisherRevenue() + "';" +
+                        "g.onRewardVideoADError()"));
+            }
+
+            @Override
+            public void onRewardedVideoAdClosed(ATAdInfo atAdInfo) {
+                Log.e("com.aries.jjdz.mz","onRewardedVideoAdClosed=================================");
+
+//                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.onRewardVideoADLoss()"));
+            }
+
+            @Override
+            public void onRewardedVideoAdPlayClicked(ATAdInfo atAdInfo) {
+                Log.e("com.aries.jjdz.mz","onRewardedVideoAdPlayClicked=================================");
+            }
+
+            /**
+             * 奖励下发
+             * ad_type无需修改,由游戏设值上传
+             * @param atAdInfo
+             */
+            @Override
+            public void onReward(ATAdInfo atAdInfo) {
+                Log.e("com.aries.jjdz.mz","onReward=================================");
+
+                CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("" +
+                        "g.adData.ad_type=1;" +
+                        "g.adData.destoon_ad_place='" + atAdInfo.getTopOnPlacementId() + "';" +
+                        "g.adData.adsource_id='" + atAdInfo.getAdsourceId() + "';" +
+                        "g.adData.network_firm_id=" + atAdInfo.getNetworkFirmId() + ";" +
+                        "g.adData.network_placement_id='" + atAdInfo.getNetworkPlacementId() + "';" +
+                        "g.adData.adsource_price=" + atAdInfo.getEcpm() + ";" +
+                        "g.adData.network_type='" + atAdInfo.getAdNetworkType() + "';" +
+                        "g.adData.adsource_index=" + atAdInfo.getAdsourceIndex() + ";" +
+                        "g.adData.adsource_isheaderbidding=" + atAdInfo.isHeaderBiddingAdsource() + ";" +
+                        "g.adData.adunit_format='" + atAdInfo.getTopOnAdFormat() + "';" +
+                        "g.adData.ecpm_level=" + atAdInfo.getEcpmLevel() + ";" +
+                        "g.adData.precision_ecpm='" + atAdInfo.getEcpmPrecision() + "';" +
+                        "g.adData.publisher_revenue='" + atAdInfo.getPublisherRevenue() + "';" +
+                        "g.onRewardVideoADComplete();"));
+            }
+        });
+    }
+
+    /**
+     * 向外提供加载方法,以便快速反应
+     */
+    public void loadRewardVideoAD() {
+        atRewardVideoAd.load();
+    }
+
+    /**
+     * 展示激励
+     */
+    public void showRewardVideoAD() {
+        if (atRewardVideoAd.isAdReady()) {
+            Log.e("", "tRewardVideoAd.isAdReady()=" + true);
+            atRewardVideoAd.show(activity);
+        } else {
+            atRewardVideoAd.load();
+//            CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.onRewardVideoADLoss()"));
+            ToastUtil.makeShortToast(activity, "视频加载中,请稍后重试");
+        }
+    }
+}

+ 118 - 0
app/src/com/aries/jjdz/mz/ad/SplashADActivity.java

@@ -0,0 +1,118 @@
+package com.aries.jjdz.mz.ad;//package com.aries.kxnly.mz.ad;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import com.anythink.core.api.ATAdInfo;
+import com.anythink.core.api.AdError;
+import com.anythink.splashad.api.ATSplashAd;
+import com.anythink.splashad.api.ATSplashAdListener;
+import com.aries.jjdz.mz.R;
+import com.cocos.game.MainApplication;
+
+public class SplashADActivity extends Activity implements ATSplashAdListener {
+    private static String VERSION_KEY = "version_key";
+
+    private FrameLayout content = null;
+
+    private ATSplashAd atSplashAd = null;
+
+    private String adInfo = "";
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.splash_ad);
+        hideBottomUIMenu();
+
+        this.content = findViewById(R.id.splash_content);
+        atSplashAd = new ATSplashAd(this, Constants.SPLASH_AD_ID, this);
+        if (atSplashAd.isAdReady()) {
+            atSplashAd.show(this, content);
+        } else {
+
+            atSplashAd.loadAd();
+        }
+    }
+
+
+    protected void hideBottomUIMenu() {
+        View decorView = getWindow().getDecorView();
+        int uiFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
+                | View.SYSTEM_UI_FLAG_FULLSCREEN; // hide status bar
+
+        if (android.os.Build.VERSION.SDK_INT >= 19) {
+            uiFlags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;    //View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY: hide navigation bars - compatibility: building API level is lower thatn 19, use magic number directly for higher API target level
+        } else {
+            uiFlags |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
+        }
+        decorView.setSystemUiVisibility(uiFlags);
+        //处理bar弹出生成后无法隐藏
+        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(arg0 -> {
+            hideBottomUIMenu();
+        });
+    }
+    @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        super.onWindowFocusChanged(hasFocus);
+        hideBottomUIMenu();
+    }
+    @Override
+    public void onAdLoaded() {
+        atSplashAd.show(this, content);
+    }
+
+    @Override
+    public void onNoAdError(AdError adError) {
+        jumpToMainActivity();
+    }
+
+    @Override
+    public void onAdShow(ATAdInfo atAdInfo) {
+        adInfo = "try{var adData = g?g.adData:{};}catch(error){adData={}}" +
+                "adData.isJSB=true;adData.destoon_ad_place='" + atAdInfo.getTopOnPlacementId() + "';" +
+                "adData.adsource_id='" + atAdInfo.getAdsourceId() + "';" +
+                "adData.network_firm_id=" + atAdInfo.getNetworkFirmId() + ";" +
+                "adData.network_placement_id='" + atAdInfo.getNetworkPlacementId() + "';" +
+                "adData.adsource_price=" + atAdInfo.getEcpm() + ";" +
+                "adData.network_type='" + atAdInfo.getAdNetworkType() + "';" +
+                "adData.adsource_index=" + atAdInfo.getAdsourceIndex() + ";" +
+                "adData.adsource_isheaderbidding=" + atAdInfo.isHeaderBiddingAdsource() + ";" +
+                "adData.adunit_format='" + atAdInfo.getTopOnAdFormat() + "';" +
+                "adData.ecpm_level=" + atAdInfo.getEcpmLevel() + ";" +
+                "adData.precision_ecpm='" + atAdInfo.getEcpmPrecision() + "';" +
+                "adData.publisher_revenue='" + atAdInfo.getPublisherRevenue() + "';" +
+                "adData.splashADShow=true;";
+        MainApplication.getInstance().splashAdInfo = adInfo;
+    }
+
+    @Override
+    public void onAdClick(ATAdInfo atAdInfo) {
+    }
+
+    @Override
+    public void onAdDismiss(ATAdInfo atAdInfo) {
+        jumpToMainActivity();
+    }
+
+    /**
+     * 跳转游戏
+     */
+    public void jumpToMainActivity() {
+        finish();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (atSplashAd != null) {
+            atSplashAd.onDestory();
+        }
+    }
+}

+ 43 - 0
app/src/com/aries/jjdz/mz/receiver/DownloadObserver.java

@@ -0,0 +1,43 @@
+package com.aries.jjdz.mz.receiver;
+
+import android.app.DownloadManager;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.os.Handler;
+import android.util.Log;
+
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+
+public class DownloadObserver extends ContentObserver {
+    private long downid;
+    private Handler handler;
+    private Context context;
+
+    public DownloadObserver(Handler handler, Context context, long downid) {
+        super(handler);
+        this.handler = handler;
+        this.downid = downid;
+        this.context = context;
+    }
+
+    @Override
+    public void onChange(boolean selfChange) {
+        super.onChange(selfChange);
+        DownloadManager.Query query = new DownloadManager.Query().setFilterById(downid);
+        DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
+        Cursor cursor = downloadManager.query(query);
+        while (cursor.moveToNext()) {
+            int downloadBytesIdx = cursor.getColumnIndexOrThrow(
+                    DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);
+            int totalBytesIdx = cursor.getColumnIndexOrThrow(
+                    DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
+            double totalBytes = (double) cursor.getLong(totalBytesIdx);
+            double downloadBytes = (double) cursor.getLong(downloadBytesIdx);
+            double mProgress = downloadBytes * 10 / totalBytes / 10;
+            Log.e("","下载进度======================="+mProgress);
+            CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.deviceData.downloadAPKProgress=" + mProgress));
+        }
+    }
+}

+ 23 - 0
app/src/com/aries/jjdz/mz/receiver/DownloadReceiver.java

@@ -0,0 +1,23 @@
+package com.aries.jjdz.mz.receiver;
+
+import android.app.DownloadManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import com.aries.jjdz.mz.utils.DownloadUtil;
+import com.aries.jjdz.mz.utils.ToastUtil;
+
+
+public class DownloadReceiver  extends BroadcastReceiver {
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        ToastUtil.makeLongToast(context, "下载完毕...");
+        Log.e("","222isOnForeground=================================");
+        DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
+        long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
+        DownloadUtil.apkList.add(DownloadUtil.apkMap.get(completeDownloadId));
+        DownloadUtil.installApk(context, DownloadUtil.apkList.get(0));
+    }
+}

+ 34 - 0
app/src/com/aries/jjdz/mz/receiver/InstallReceiver.java

@@ -0,0 +1,34 @@
+package com.aries.jjdz.mz.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.aries.jjdz.mz.utils.DownloadUtil;
+import com.cocos.game.MainActivity;
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+
+public class InstallReceiver extends BroadcastReceiver {
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())) {
+            CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.onRefreshComplete()"));
+            if (!MainActivity.installName.equals("")) {
+                DownloadUtil.getFilePath(MainActivity.installName).delete();
+            }
+        }
+
+        if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
+            if (!MainActivity.installName.equals("")) {
+                DownloadUtil.getFilePath(MainActivity.installName).delete();
+            }
+        }
+
+        if (Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) {
+            if (!MainActivity.installName.equals("")) {
+                DownloadUtil.getFilePath(MainActivity.installName).delete();
+            }
+        }
+    }
+}

+ 96 - 0
app/src/com/aries/jjdz/mz/utils/CheckUtil.java

@@ -0,0 +1,96 @@
+package com.aries.jjdz.mz.utils;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+
+import com.aries.jjdz.mz.BuildConfig;
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+
+import java.util.List;
+
+public class CheckUtil {
+    /**
+     * 检查版本,渠道号
+     */
+    public static void checkVersion(Context context) {
+        PackageManager packageManager = context.getPackageManager();
+        String appVersion = null;
+        try {
+            PackageInfo info = packageManager.getPackageInfo(context.getPackageName(), 0);
+            appVersion = info.versionName;
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+        }
+        if (appVersion != null) {
+            String finalAppVersion = appVersion;
+            CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.deviceData.version='" + finalAppVersion + "';g.deviceData.channel='" + BuildConfig.TF_CHANNEL + "';"));
+        }
+    }
+
+    /**
+     * 程序是否在前台
+     *
+     * @return
+     */
+    public static boolean isOnForeground(Context context) {
+        ActivityManager activityManager = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
+        String packageName = context.getApplicationContext().getPackageName();
+        List<ActivityManager.RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses();
+        if (appProcessInfos == null) {
+            return false;
+        }
+        for (ActivityManager.RunningAppProcessInfo appProcess : appProcessInfos) {
+            if (appProcess.processName.equals(packageName)
+                    && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 应用是否已安装
+     *
+     * @param context
+     * @param packageName
+     * @return
+     */
+    public static boolean isInstalled(Context context, String packageName) {
+        if (packageName == null || packageName.isEmpty()) {
+            return false;
+        }
+        PackageInfo packageInfo;
+        try {
+            packageInfo = context.getPackageManager().getPackageInfo(packageName, 0);
+        } catch (PackageManager.NameNotFoundException e) {
+            packageInfo = null;
+        }
+        return packageInfo != null;
+    }
+
+    /**
+     * 启动app
+     *
+     * @param packageName
+     */
+    public static void startApp(Context context, String packageName) {
+        PackageManager packageManager = context.getPackageManager();
+        Intent intent = packageManager.getLaunchIntentForPackage(packageName);
+        context.startActivity(intent);
+    }
+
+    public static String getUA(Context context) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+            return WebSettings.getDefaultUserAgent(context);
+        } else {
+            return new WebView(context).getSettings().getUserAgentString();
+        }
+    }
+}

+ 95 - 0
app/src/com/aries/jjdz/mz/utils/DownloadUtil.java

@@ -0,0 +1,95 @@
+package com.aries.jjdz.mz.utils;
+
+import android.annotation.SuppressLint;
+import android.app.DownloadManager;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.os.Handler;
+import android.support.v4.content.FileProvider;
+
+import com.aries.jjdz.mz.receiver.DownloadObserver;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 下载工具类
+ */
+public class DownloadUtil {
+    public static Map<Long, String> apkMap = new HashMap<>();
+
+    public static List<String> apkList = new ArrayList<>();
+
+
+    /**
+     * 下载APK
+     *
+     * @param url
+     * @param name
+     */
+    @SuppressLint("HandlerLeak")
+    public static void downloadApk(Context context, String url, String name, boolean visibility) {
+        com.aries.jjdz.mz.utils.DownloadUtil.getFilePath(name).delete();
+        DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
+        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
+        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);//允许下载的网络
+        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);//通知栏显示
+        request.setAllowedOverRoaming(false);//设置漫游
+        request.setVisibleInDownloadsUi(true);
+        File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), name);//下载至”下载“位置
+        request.setDestinationUri(Uri.fromFile(file));
+        long downloadId = manager.enqueue(request);//触发下载存储下载ID
+        apkMap.put(downloadId, name);
+        context.getContentResolver().registerContentObserver(Uri.parse("content://downloads/my_downloads"), true, new DownloadObserver(new Handler(), context, downloadId));
+    }
+
+    /**
+     * 安装应用
+     *
+     * @param context
+     * @param name
+     */
+    public static void installApk(Context context, String name) {
+        File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), name);
+        if (!file.exists()) {
+            return;
+        }
+        String[] command = {"chmod", "777", file.toString()};
+        ProcessBuilder builder = new ProcessBuilder(command);
+        try {
+            builder.start();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        // 由于没有在Activity环境下启动Activity,设置下面的标签
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//android 7.0
+            Uri apkUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file);
+            //添加这一句表示对目标应用临时授权该Uri所代表的文件
+            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
+        } else {
+            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
+        }
+        context.startActivity(intent);
+    }
+
+    /**
+     * 根据路径获取文件
+     *
+     * @return
+     */
+    public static File getFilePath(String path) {
+        File outputFile = new File(Environment.getExternalStoragePublicDirectory
+                (Environment.DIRECTORY_DOWNLOADS), path);
+        return outputFile;
+    }
+}

+ 93 - 0
app/src/com/aries/jjdz/mz/utils/MiitHelper.java

@@ -0,0 +1,93 @@
+package com.aries.jjdz.mz.utils;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.bun.miitmdid.core.ErrorCode;
+import com.bun.miitmdid.core.IIdentifierListener;
+import com.bun.miitmdid.core.MdidSdk;
+import com.bun.miitmdid.core.MdidSdkHelper;
+import com.bun.miitmdid.supplier.IdSupplier;
+import com.cocos.game.MainActivity;
+
+public class MiitHelper implements IIdentifierListener {
+
+    private AppIdsUpdater _listener;
+
+    public MiitHelper(AppIdsUpdater callback) {
+        _listener = callback;
+    }
+
+
+    public void getDeviceIds(Context cxt) {
+        long timeb = System.currentTimeMillis();
+        int nres = CallFromReflect(cxt);
+        //        int nres=DirectCall(cxt);
+        long timee = System.currentTimeMillis();
+        long offset = timee - timeb;
+        if (nres == ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT) {//1008612 不支持的设备
+            MainActivity.setIsSupportOaid(false, nres);
+        } else if (nres == ErrorCode.INIT_ERROR_LOAD_CONFIGFILE) {//1008613 加载配置文件出错
+            MainActivity.setIsSupportOaid(false, nres);
+        } else if (nres == ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT) {//1008611 不支持的设备厂商
+            MainActivity.setIsSupportOaid(false, nres);
+        } else if (nres == ErrorCode.INIT_ERROR_RESULT_DELAY) {//1008614 获取接口是异步的,结果会在回调中返回,回调执行的回调可能在工作线程
+            //TODO 这种情况,还不清楚怎么解决呢。暂且先返false
+            MainActivity.setIsSupportOaid(false, nres);
+        } else if (nres == ErrorCode.INIT_HELPER_CALL_ERROR) {//1008615 反射调用出错
+            MainActivity.setIsSupportOaid(false, nres);
+        }
+        Log.d(getClass().getSimpleName(), "return value: " + String.valueOf(nres));
+    }
+
+
+    /*
+     * 通过反射调用,解决android 9以后的类加载升级,导至找不到so中的方法
+     *
+     * */
+    private int CallFromReflect(Context cxt) {
+        return MdidSdkHelper.InitSdk(cxt, true, this);
+    }
+
+    /*
+     * 直接java调用,如果这样调用,在android 9以前没有题,在android 9以后会抛找不到so方法的异常
+     * 解决办法是和JLibrary.InitEntry(cxt),分开调用,比如在A类中调用JLibrary.InitEntry(cxt),在B类中调用MdidSdk的方法
+     * A和B不能存在直接和间接依赖关系,否则也会报错
+     *
+     * */
+    private int DirectCall(Context cxt) {
+        MdidSdk sdk = new MdidSdk();
+        return sdk.InitSdk(cxt, this);
+    }
+
+    @Override
+    public void OnSupport(boolean isSupport, IdSupplier _supplier) {
+        if (_supplier == null) {
+            return;
+        }
+       /* String oaid=_supplier.getOaid();
+        String vaid=_supplier.getVAID();
+        String aaid=_supplier.getAAID();
+        String udid=_supplier.getUDID();
+        StringBuilder builder=new StringBuilder();
+        builder.append("support: ").append(isSupport?"true":"false").append("\n");
+        builder.append("UDID: ").append(udid).append("\n");
+        builder.append("OAID: ").append(oaid).append("\n");
+        builder.append("VAID: ").append(vaid).append("\n");
+        builder.append("AAID: ").append(aaid).append("\n");
+        String idstext=builder.toString();*/
+
+        MainActivity.setIsSupportOaid(isSupport);
+
+        String oaid = _supplier.getOAID();
+        _supplier.shutDown();           //关闭接口
+        if (_listener != null) {
+            _listener.OnIdsAvalid(oaid);
+        }
+    }
+
+    public interface AppIdsUpdater {
+        void OnIdsAvalid(String ids);
+    }
+
+}

+ 116 - 0
app/src/com/aries/jjdz/mz/utils/MobileInfoUtil.java

@@ -0,0 +1,116 @@
+package com.aries.jjdz.mz.utils;
+
+import android.Manifest;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Build;
+import android.provider.Settings;
+import android.support.v4.app.ActivityCompat;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+
+/**
+ * 获取手机信息工具
+ */
+public class MobileInfoUtil {
+
+    /**
+     * 获取IMEI
+     */
+    @SuppressLint("HardwareIds")
+    public String getIMEI(Context context) {
+        String result = "";
+        Log.e("","444isOnForeground=================================");
+        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+        if (telephonyManager != null) {
+            //版本小于8
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+                if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
+                    result = telephonyManager.getDeviceId();
+                }
+            } else {
+                if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
+                    result = telephonyManager.getImei();
+                }
+            }
+        }
+        return result == null ? "" : result;
+    }
+
+    /**
+     * 获取AndroidID
+     */
+    public String getAndroidID(Context context) {
+        String result = "";
+        result = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
+        return result == null ? "" : result;
+    }
+
+    /**
+     * 获取MAC地址
+     *
+     */
+    public String getMac(Context context) {
+        String result = null;
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+            result = getLocalMacAddressFromWifiInfo(context);
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            result = getMac();
+        }
+        String[] str = result.split(",");
+        if (str.length > 0) {
+            result = str[0];
+        }
+        return result == null ? "" : result;
+    }
+
+    /**
+     * wifi信息获取本地mac
+     *
+     */
+    private String getLocalMacAddressFromWifiInfo(Context context) {
+        WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+        WifiInfo winfo = wifi.getConnectionInfo();
+        String result = winfo.getMacAddress();
+        return result == null ? "" : result;
+    }
+
+    /**
+     * mac地址
+     *
+     */
+    public String getMac() {
+        String macSerial = null;
+        String str = "";
+        String result = "";
+        try {
+            Process pp = Runtime.getRuntime().exec("ip addr");
+            InputStreamReader ir = new InputStreamReader(pp.getInputStream());
+            LineNumberReader input = new LineNumberReader(ir);
+            for (; null != str; ) {
+                str = input.readLine();
+                if (str != null) {
+                    macSerial = str.trim();// 去空格
+                    if (macSerial.indexOf("link/ether") != -1) {
+                        if (macSerial.split(" ").length >= 2) {
+                            if (result.equals("")) {
+                                result = macSerial.split(" ")[1];
+                            } else {
+                                result = result.concat(",").concat(macSerial.split(" ")[1]);
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (IOException ex) {
+        }
+        return result == null ? "" : result;
+    }
+}

+ 18 - 0
app/src/com/aries/jjdz/mz/utils/ToastUtil.java

@@ -0,0 +1,18 @@
+package com.aries.jjdz.mz.utils;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.widget.Toast;
+
+public class ToastUtil {
+    private static final Handler sHandler = new Handler(Looper.getMainLooper());
+
+    public synchronized static void makeShortToast(final Context context, final String msg) {
+        sHandler.post(() -> Toast.makeText(context, "" + msg, Toast.LENGTH_SHORT).show());
+    }
+
+    public synchronized static void makeLongToast(final Context context, final String msg) {
+        sHandler.post(() -> Toast.makeText(context, "" + msg, Toast.LENGTH_LONG).show());
+    }
+}

+ 78 - 0
app/src/com/aries/jjdz/mz/utils/WechatUtil.java

@@ -0,0 +1,78 @@
+package com.aries.jjdz.mz.utils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import com.aries.jjdz.mz.BuildConfig;
+import com.aries.jjdz.mz.R;
+import com.tencent.mm.opensdk.constants.ConstantsAPI;
+import com.tencent.mm.opensdk.modelmsg.SendAuth;
+import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
+import com.tencent.mm.opensdk.modelmsg.WXMediaMessage;
+import com.tencent.mm.opensdk.modelmsg.WXWebpageObject;
+import com.tencent.mm.opensdk.openapi.IWXAPI;
+import com.tencent.mm.opensdk.openapi.WXAPIFactory;
+
+/**
+ * 微信工具
+ */
+public class WechatUtil {
+    public static final String APP_ID = BuildConfig.WX_APP_ID;
+    public static IWXAPI api;
+
+    /**
+     * 将应用注册到微信
+     */
+    public static void regToWX(Context context) {
+        api = WXAPIFactory.createWXAPI(context, APP_ID, true);
+        api.registerApp(APP_ID);
+        context.registerReceiver(new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                api.registerApp(APP_ID);
+            }
+        }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
+    }
+
+    /**
+     * 微信登录
+     */
+    public static void wxLogin(Context context) {
+        if (!api.isWXAppInstalled()) {
+            ToastUtil.makeShortToast(context, "您还未安装微信!");
+            return;
+        }
+        SendAuth.Req req = new SendAuth.Req();
+        req.scope = "snsapi_userinfo";
+        req.state = "diandi_wx_login";
+        api.sendReq(req);
+    }
+
+    /**
+     * 分享到微信
+     * flag 0:分享到好友
+     * flag 1:分享到朋友圈
+     */
+    public static void shareLinkToWX(final int flag, Context context, String url, String title, String descroption) {
+        if (!api.isWXAppInstalled()) {
+            ToastUtil.makeShortToast(context, "您还未安装微信!");
+            return;
+        }
+        WXWebpageObject webPage = new WXWebpageObject();
+        webPage.webpageUrl = url;
+        WXMediaMessage msg = new WXMediaMessage(webPage);
+        msg.title = title;
+        msg.description = descroption;
+        Bitmap bitmao = BitmapFactory.decodeResource(context.getResources(), R.drawable.share_icon);
+        msg.setThumbImage(bitmao);
+        SendMessageToWX.Req req = new SendMessageToWX.Req();
+        req.transaction = String.valueOf(System.currentTimeMillis());
+        req.message = msg;
+        req.scene = flag == 0 ? SendMessageToWX.Req.WXSceneSession : SendMessageToWX.Req.WXSceneTimeline;
+        api.sendReq(req);
+    }
+}

+ 107 - 0
app/src/com/aries/jjdz/mz/wxapi/WXEntryActivity.java

@@ -0,0 +1,107 @@
+package com.aries.jjdz.mz.wxapi;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+
+import com.aries.jjdz.mz.utils.ToastUtil;
+import com.aries.jjdz.mz.utils.WechatUtil;
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+import com.tencent.mm.opensdk.modelbase.BaseReq;
+import com.tencent.mm.opensdk.modelbase.BaseResp;
+import com.tencent.mm.opensdk.modelmsg.SendAuth;
+import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
+import com.umeng.analytics.MobclickAgent;
+
+/**
+ * 该 Activity 为接收微信回跳 处理回调
+ */
+public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
+    private static final int RETURN_MSG_TYPE_LOGIN = 1;
+    private static final int RETURN_MSG_TYPE_SHARE = 2;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        WechatUtil.api.handleIntent(getIntent(), this);
+    }
+
+    @Override
+    public void onReq(BaseReq baseReq) {
+    }
+
+    protected void hideBottomUIMenu() {
+        View decorView = getWindow().getDecorView();
+        int uiFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
+                | View.SYSTEM_UI_FLAG_FULLSCREEN; // hide status bar
+
+        if (android.os.Build.VERSION.SDK_INT >= 19) {
+            uiFlags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;    //View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY: hide navigation bars - compatibility: building API level is lower thatn 19, use magic number directly for higher API target level
+        } else {
+            uiFlags |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
+        }
+        decorView.setSystemUiVisibility(uiFlags);
+        //处理bar弹出生成后无法隐藏
+        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(arg0 -> {
+            hideBottomUIMenu();
+        });
+    }
+    @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        super.onWindowFocusChanged(hasFocus);
+        hideBottomUIMenu();
+    }
+
+    @Override
+    public void onResp(BaseResp baseResp) {
+        switch (baseResp.errCode) {
+            case BaseResp.ErrCode.ERR_USER_CANCEL:
+            case BaseResp.ErrCode.ERR_AUTH_DENIED:
+                if (RETURN_MSG_TYPE_LOGIN == baseResp.getType()) {
+                    ToastUtil.makeShortToast(this, "登录失败");
+                } else {
+                    ToastUtil.makeShortToast(this, "分享失败");
+                }
+                finish();
+                break;
+            case BaseResp.ErrCode.ERR_OK:
+                switch (baseResp.getType()) {
+                    case RETURN_MSG_TYPE_SHARE:
+//                        ToastUtil.makeShortToast(this, "微信分享成功");
+                        finish();
+                        break;
+                    case RETURN_MSG_TYPE_LOGIN:
+                        //获取
+                        String code = ((SendAuth.Resp) baseResp).code;
+//                        ToastUtil.makeShortToast(this, "微信登录成功");
+                        CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.wechatData.code='" + code + "';"));
+                        finish();
+                        break;
+                }
+                break;
+            default:
+                finish();
+        }
+    }
+
+    @Override
+    public void onPointerCaptureChanged(boolean hasCapture) {
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        MobclickAgent.onResume(this);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        MobclickAgent.onPause(this);
+    }
+}

+ 643 - 0
app/src/com/cocos/game/MainActivity.java

@@ -0,0 +1,643 @@
+package com.cocos.game;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.Environment;
+import android.support.annotation.NonNull;
+import android.support.v4.app.ActivityCompat;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.RelativeLayout;
+
+import com.arialyy.annotations.Download;
+import com.arialyy.aria.core.Aria;
+import com.arialyy.aria.core.task.DownloadTask;
+import com.aries.jjdz.mz.R;
+import com.aries.jjdz.mz.ad.BannerAD;
+import com.aries.jjdz.mz.ad.Constants;
+import com.aries.jjdz.mz.ad.FullScreenAD;
+import com.aries.jjdz.mz.ad.InterstitalAD;
+import com.aries.jjdz.mz.ad.NativeExpressAD;
+import com.aries.jjdz.mz.ad.RewardVideoAD;
+import com.aries.jjdz.mz.ad.SplashADActivity;
+import com.aries.jjdz.mz.utils.CheckUtil;
+import com.aries.jjdz.mz.utils.DownloadUtil;
+import com.aries.jjdz.mz.utils.MiitHelper;
+import com.aries.jjdz.mz.utils.MobileInfoUtil;
+import com.aries.jjdz.mz.utils.ToastUtil;
+import com.aries.jjdz.mz.utils.WechatUtil;
+import com.bytedance.mobsec.metasec.ml.MSManager;
+import com.bytedance.mobsec.metasec.ml.MSManagerUtils;
+import com.cocos.lib.CocosActivity;
+import com.cocos.lib.CocosHelper;
+import com.cocos.lib.CocosJavascriptJavaBridge;
+import com.cocos.service.SDKWrapper;
+import com.duoyou.task.openapi.DyAdApi;
+import com.smarx.notchlib.NotchScreenManager;
+import com.smarx.notchlib.utils.ScreenUtil;
+import com.umeng.analytics.MobclickAgent;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import cn.thinkingdata.android.TDFirstEvent;
+
+public class MainActivity extends CocosActivity {
+    public static Activity app;
+    private static final int REQUEST_PERMISSIONS_CODE = 100;
+    private static MobileInfoUtil mobileInfoUtil;
+    private static int errorCode;
+    private static String OAID;
+    private static boolean isSupportOaid = true;
+
+    private View splash = null;//屏幕遮挡
+
+    private static RewardVideoAD rewardVideoAD;
+    private static InterstitalAD interstitalAD;
+    private static FullScreenAD fullScreenAD;
+    private static BannerAD bannerAD;
+    private static NativeExpressAD nativeExpressAD;
+
+    private static ViewGroup viewGroup;
+    private static RelativeLayout relativeLayout;
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (!isTaskRoot()) {
+            return;
+        }
+        SDKWrapper.shared().init(this);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//屏幕常亮
+        app = this;
+        Aria.download(app).register();
+        firstStart();
+        new MiitHelper(appIdsUpdater).getDeviceIds(this);//获取OAID
+
+        splash = LayoutInflater.from(this).inflate(R.layout.splash, null);
+        mFrameLayout.addView(splash);
+
+        initLoadAD();
+        registerInstallAppBroadcastReceiver();
+    }
+
+    public static boolean isSupportOaid() {
+        return isSupportOaid;
+    }
+
+    public static void setIsSupportOaid(boolean isSupportOaid) {
+        MainActivity.isSupportOaid = isSupportOaid;
+    }
+
+    public static void setIsSupportOaid(boolean isSupportOaid, int ErrorCode) {
+        MainActivity.isSupportOaid = isSupportOaid;
+        MainActivity.errorCode = ErrorCode;
+    }
+
+    private MiitHelper.AppIdsUpdater appIdsUpdater = ids -> MainActivity.OAID = ids;
+
+    /**
+     * 初始化预加载广告
+     */
+    public static void initLoadAD() {
+        rewardVideoAD = new RewardVideoAD(app);
+        rewardVideoAD.loadRewardVideoAD();
+        interstitalAD = new InterstitalAD(app);
+        interstitalAD.loadInterstitalAD();
+        fullScreenAD = new FullScreenAD(app);
+        fullScreenAD.loadInterstitalAD();
+
+        //横幅广告设置布局文件
+        View layoutBanner = LayoutInflater.from(app).inflate(R.layout.banner_ad, null);
+        mFrameLayout.addView(layoutBanner);
+        viewGroup = app.findViewById(R.id.banner_container);
+        bannerAD = new BannerAD(app, viewGroup);
+        bannerAD.loadBannerAD();
+        viewGroup.setVisibility(View.GONE);
+
+
+        //原生广告设置布局文件
+        View layoutNative = LayoutInflater.from(app).inflate(R.layout.native_ad, null);
+        mFrameLayout.addView(layoutNative);
+        relativeLayout = app.findViewById(R.id.container);
+        nativeExpressAD = new NativeExpressAD(relativeLayout, app);
+        nativeExpressAD.initNativeAd();
+        nativeExpressAD.loadNativeAd();
+        relativeLayout.setVisibility(View.GONE);
+
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        SDKWrapper.shared().onResume();
+        hideBottomUIMenu();
+        MobclickAgent.onResume(this);
+        /**
+         * 检测开屏数据
+         */
+        if (MainApplication.getInstance().splashAdInfo != null && !MainApplication.getInstance().splashAdInfo.equals("")) {
+            Log.e("", "上报开始。。。。。。。。。。。。。。。");
+            CocosHelper.runOnGameThread(() -> {
+                String splashAdInfo = MainApplication.getInstance().splashAdInfo + "";
+                Log.e("", "splashAdInfo-==-=-=-=-" + splashAdInfo);
+                CocosJavascriptJavaBridge.evalString(splashAdInfo);
+                MainApplication.getInstance().splashAdInfo = null;
+            });
+        }
+    }
+
+    @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        super.onWindowFocusChanged(hasFocus);
+        hideBottomUIMenu();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        SDKWrapper.shared().onPause();
+        MobclickAgent.onPause(this);
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (!isTaskRoot()) {
+            return;
+        }
+
+        SDKWrapper.shared().onDestroy();
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        SDKWrapper.shared().onActivityResult(requestCode, resultCode, data);
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        SDKWrapper.shared().onNewIntent(intent);
+    }
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+        SDKWrapper.shared().onRestart();
+        hideBottomUIMenu();
+        SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
+        long lastTime = pref.getLong("time", 0);
+        if (lastTime != -1 && (System.currentTimeMillis() - lastTime) > 40000) {
+            jumpToSplashActivity();
+        }
+        if (DownloadUtil.apkList.size() > 0) {
+            DownloadUtil.installApk(this, DownloadUtil.apkList.get(0));
+        }
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        SDKWrapper.shared().onStop();
+        SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
+        if (!CheckUtil.isOnForeground(this)) {
+            editor.putLong("time", System.currentTimeMillis());
+        } else {
+            editor.putLong("time", -1);
+        }
+        editor.commit();
+        if (!DownloadUtil.apkList.isEmpty()) {
+            DownloadUtil.apkList.remove(0);
+        }
+    }
+
+    @Override
+    public void onBackPressed() {
+        SDKWrapper.shared().onBackPressed();
+        super.onBackPressed();
+        hideBottomUIMenu();
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        SDKWrapper.shared().onConfigurationChanged(newConfig);
+        super.onConfigurationChanged(newConfig);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Bundle savedInstanceState) {
+        SDKWrapper.shared().onRestoreInstanceState(savedInstanceState);
+        super.onRestoreInstanceState(savedInstanceState);
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        SDKWrapper.shared().onSaveInstanceState(outState);
+        super.onSaveInstanceState(outState);
+    }
+
+    @Override
+    protected void onStart() {
+        SDKWrapper.shared().onStart();
+        super.onStart();
+        hideBottomUIMenu();
+    }
+
+    @Override
+    public void onLowMemory() {
+        SDKWrapper.shared().onLowMemory();
+        super.onLowMemory();
+    }
+
+    /**
+     * 检查是否具有权限
+     */
+    public static boolean hasPermissions() {
+        if (PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(app, Manifest.permission.READ_PHONE_STATE)) {
+            return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(app, Manifest.permission.WRITE_EXTERNAL_STORAGE);
+        }
+        return false;
+    }
+
+    /**
+     * 检查权限若不具有则申请
+     */
+    public static void checkCPermissions() {
+        List<String> listPermissions = new ArrayList<>();
+        if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(app, Manifest.permission.READ_PHONE_STATE)) {
+            listPermissions.add(Manifest.permission.READ_PHONE_STATE);
+        }
+        if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(app, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+            listPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
+        }
+        //权限申请
+        if (listPermissions.size() != 0) {
+            String[] temp = new String[listPermissions.size()];
+            listPermissions.toArray(temp);
+            ActivityCompat.requestPermissions(app, temp, REQUEST_PERMISSIONS_CODE);//请求权限
+        } else {
+            mobileInfoUtil = new MobileInfoUtil();
+            setDeviceInfo();
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        if (requestCode == REQUEST_PERMISSIONS_CODE) {
+            if (!hasPermissions()) {
+                finish();
+            } else {
+                mobileInfoUtil = new MobileInfoUtil();
+                setDeviceInfo();
+            }
+        }
+    }
+
+    /**
+     * 游戏运行成功请求
+     */
+    public static void setDeviceInfo() {
+        if (!hasPermissions()) {
+            return;
+        }
+        mobileInfoUtil = new MobileInfoUtil();
+        CheckUtil.checkVersion(app);
+        CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.deviceData.imei='" + mobileInfoUtil.getIMEI(app) + "';g.deviceData.oaid='" + OAID + "';g.deviceData.androId='" + mobileInfoUtil.getAndroidID(app) + "';g.deviceData.mac='" + mobileInfoUtil.getMac(app) + "';"));
+        //多玩接入
+//        DyAdApi.getDyAdApi().init(app, "dy_59635703", "2532b4f3339f046b45bebd601c1cbd6a", BuildConfig.TF_CHANNEL, false);
+//        DyAdApi.getDyAdApi().setOAID(OAID);
+        //刘海屏高度设置
+        setSafeArea();
+    }
+
+    /**
+     * 刘海屏高度设置
+     */
+    public static void setSafeArea() {
+        NotchScreenManager.getInstance().getNotchInfo(app, notchScreenInfo -> {
+            Log.i("MokaGame", "Is this screen notch? " + notchScreenInfo.hasNotch);
+            if (notchScreenInfo.hasNotch) {
+                for (Rect rect : notchScreenInfo.notchRects) {
+                    Log.i("MokaGame", "notch screen Rect = " + rect.toShortString());
+                    float screenHeight = ScreenUtil.getScreenSize(app)[1];
+                    float notchRatio = rect.bottom / screenHeight;
+                    CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("var notchRatio  = " + notchRatio));
+                }
+            }
+        });
+    }
+
+    /**
+     * 下载APK
+     */
+    public static void downloadAPK(String url, String apkName, boolean visibility) {
+        app.runOnUiThread(() -> DownloadUtil.downloadApk(app, url, apkName, visibility));
+    }
+
+    protected void hideBottomUIMenu() {
+        View decorView = getWindow().getDecorView();
+        int uiFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
+                | View.SYSTEM_UI_FLAG_FULLSCREEN; // hide status bar
+
+        if (android.os.Build.VERSION.SDK_INT >= 19) {
+            uiFlags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;    //View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY: hide navigation bars - compatibility: building API level is lower thatn 19, use magic number directly for higher API target level
+        } else {
+            uiFlags |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
+        }
+        decorView.setSystemUiVisibility(uiFlags);
+        //处理bar弹出生成后无法隐藏
+        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(arg0 -> hideBottomUIMenu());
+    }
+
+    /**
+     * 移除遮挡
+     */
+    public static void removeSplash() {
+        app.runOnUiThread(() -> {
+            mFrameLayout.removeView(((MainActivity) app).splash);
+        });
+    }
+
+    /**
+     * 展示激励视频
+     */
+    public static void showRewardVideoAD() {
+        rewardVideoAD.showRewardVideoAD();
+    }
+
+
+    /**
+     * 展示插屏广告
+     */
+    public static void showInterstutalAD() {
+        interstitalAD.showInterstitalAD();
+    }
+
+    /**
+     * 展示全屏广告
+     */
+    public static void showFullScreenAD() {
+        fullScreenAD.showInterstitalAD();
+    }
+
+    public static void showNativeAD() {
+        app.runOnUiThread(() -> {
+            relativeLayout.setVisibility(View.VISIBLE);
+        });
+    }
+
+    public static void removeNativeAD() {
+        app.runOnUiThread(() -> {
+            relativeLayout.setVisibility(View.GONE);
+            nativeExpressAD.changeAD();
+        });
+    }
+
+    /**
+     * 展示横幅广告
+     */
+    public static void showBannerAD() {
+        app.runOnUiThread(() -> {
+
+            viewGroup.setVisibility(View.VISIBLE);
+        });
+    }
+
+    public static void removeBannerAD() {
+
+        app.runOnUiThread(() -> {
+            viewGroup.setVisibility(View.GONE);
+            bannerAD.loadBannerAD();
+        });
+    }
+
+    /**
+     * 微信登录
+     */
+    public static void wxLogin() {
+        WechatUtil.wxLogin(app);
+    }
+
+    /**
+     * 微信分享
+     */
+    public static void wxShare(String url, String title, String descroption) {
+        WechatUtil.shareLinkToWX(0, app, url, title, descroption);
+    }
+
+    /**
+     * 进入游戏列表
+     */
+    public static void intoGameList(String userId) {
+        DyAdApi.getDyAdApi().jumpAdList(app, userId, 0);
+    }
+
+    /**
+     * 跳转广告
+     */
+    public void jumpToSplashActivity() {
+        Intent intent = new Intent(this, SplashADActivity.class);
+        startActivity(intent);
+        overridePendingTransition(0, 0);
+    }
+
+    public void firstStart() {
+        boolean isFirstRun = hasPermissions();
+        if (isFirstRun) {
+            jumpToSplashActivity();//拉开屏广告
+        }
+    }
+
+    private static Map<String, String> apkProgressMap = new HashMap<>();
+
+    //    //在这里处理任务执行中的状态,如进度进度条的刷新
+    @Download.onTaskRunning
+    protected void running(DownloadTask task) {
+        int p = task.getPercent();  //任务进度百分比
+        //通知cocos
+        CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString(apkProgressMap.get(task.getTaskName()) + "=" + p));
+    }
+
+    @Download.onTaskComplete
+    protected void taskComplete(DownloadTask task) {
+        ToastUtil.makeShortToast(app, task.getTaskName() + "下载完成");
+        String taskProgress = apkProgressMap.get(task.getTaskName());
+        CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString(taskProgress + "= 100"));
+
+        apkProgressMap.remove(task.getTaskName());//从移除map
+    }
+
+    public static void downloadFile(String url, String apkName, String progress) {
+        File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), apkName);//下载至”下载“位置
+//        File file = new File(app.getFilesDir(), apkName);
+        long taskId = Aria.download(app)
+                .load(url)     //读取下载地址
+                .setFilePath(file.getPath()) //设置文件保存的完整路径
+                .create();   //启动下载
+        ToastUtil.makeShortToast(app, apkName + "下载中...");
+        if (!progress.equals("")) {
+            apkProgressMap.put(apkName, progress);
+        }
+    }
+
+    public static boolean isInstalled(String packageName) {
+        return CheckUtil.isInstalled(app, packageName);
+    }
+
+    public static void startApp(String packageName) {
+        CheckUtil.startApp(app, packageName);
+    }
+
+    //当前安装apkName
+    public static String installName = "";
+
+    public static void installApp(String apkName) {
+        installName = apkName;
+        DownloadUtil.installApk(app, apkName);
+    }
+
+    /**
+     * 是否存在文件
+     *
+     * @param apkName
+     * @return
+     */
+    public static boolean isExistAPK(String apkName) {
+        try {
+            File file = DownloadUtil.getFilePath(apkName);
+            if (!file.exists()) {
+                return false;
+            }
+        } catch (Exception e) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 拷贝
+     */
+    public static void copyText(String text) {
+        //获取剪贴板管理器:
+        ClipboardManager cm = (ClipboardManager) app.getSystemService(app.CLIPBOARD_SERVICE);
+        // 创建普通字符型ClipData
+        ClipData mClipData = ClipData.newPlainText("Label", text);
+        // 将ClipData内容放到系统剪贴板里。
+        cm.setPrimaryClip(mClipData);
+    }
+
+    /**
+     * 上报数数
+     */
+    public static void reportThinking(String eventName, String jsonData) {
+        try {
+            if (jsonData.equals("")) {
+                MainApplication.instanceThinking.track(eventName);
+            } else {
+                JSONObject jsonObject = new JSONObject(jsonData);
+                MainApplication.instanceThinking.track(eventName, jsonObject);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 上报数数用户属性
+     */
+    public static void reportThinkingUserInfo(String userString) {
+        JSONObject jsonObject = null;
+        try {
+            jsonObject = new JSONObject(userString);
+            MainApplication.instanceThinking.user_set(jsonObject);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 首次上报
+     */
+    public static void reportThinkingOnce(String eventName, String data) {
+        JSONObject jsonObject = null;
+        try {
+            jsonObject = new JSONObject(data);
+            MainApplication.instanceThinking.track(new TDFirstEvent(eventName, jsonObject));
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 设置数数账户ID
+     */
+    public static void setThinkingID(String id) {
+        MainApplication.instanceThinking.login(id);
+    }
+
+    /**
+     * 注册软件安装监听
+     */
+    private void registerInstallAppBroadcastReceiver() {
+
+        IntentFilter intentFilter = new IntentFilter();
+
+        intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
+
+        intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+
+        intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+
+        intentFilter.addDataScheme("package");
+
+        this.registerReceiver(new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                if (Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())) {
+                    CocosHelper.runOnGameThread(() -> CocosJavascriptJavaBridge.evalString("g.onRefreshComplete()"));
+                    if (!MainActivity.installName.equals("")) {
+                        DownloadUtil.getFilePath(MainActivity.installName).delete();
+                    }
+                }
+            }
+        }, intentFilter);
+    }
+
+    /**
+     * 火山安全是上报
+     *
+     * @param sceneName 业务场景
+     */
+    public static void volcanicReport(String sceneName) {
+        MSManager msManager = MSManagerUtils.get(Constants.VOLCANIC_APP_ID);
+        msManager.report(sceneName);
+    }
+}

+ 167 - 0
app/src/com/cocos/game/MainApplication.java

@@ -0,0 +1,167 @@
+package com.cocos.game;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.anythink.core.api.ATSDK;
+import com.aries.jjdz.mz.BuildConfig;
+import com.aries.jjdz.mz.ad.Constants;
+import com.aries.jjdz.mz.utils.WechatUtil;
+import com.bun.miitmdid.core.JLibrary;
+import com.bytedance.applog.AppLog;
+import com.bytedance.applog.IDataObserver;
+import com.bytedance.applog.InitConfig;
+import com.bytedance.applog.util.UriConstants;
+import com.bytedance.mobsec.metasec.ml.MSConfig;
+import com.bytedance.mobsec.metasec.ml.MSManager;
+import com.bytedance.mobsec.metasec.ml.MSManagerUtils;
+import com.tencent.mm.opensdk.utils.Log;
+import com.umeng.analytics.MobclickAgent;
+import com.umeng.commonsdk.UMConfigure;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cn.thinkingdata.android.TDConfig;
+import cn.thinkingdata.android.ThinkingAnalyticsSDK;
+
+public class MainApplication extends Application {
+    private static MainApplication instance;
+    public static ThinkingAnalyticsSDK instanceThinking;
+
+
+    public static MainApplication getInstance() {
+        return instance;
+    }
+
+    public String splashAdInfo;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        instance = this;
+        WechatUtil.regToWX(this);
+
+        JLibrary.InitEntry(this);
+
+        /*TOPON开始*/
+//        ATSDK.setNetworkLogDebug(true);//需要关闭
+//        ATSDK.integrationChecking(getApplicationContext());
+//        Log.e("MainActivity", "TOPON SDK版本:" + ATSDK.getSDKVersionName());//SDK版本
+        ATSDK.init(getApplicationContext(), Constants.APP_ID, Constants.APP_KEY);
+        /*TOPON结束*/
+
+        /*数数开始*/
+        TDConfig tdConfig = TDConfig.getInstance(this, "3ca67c6dfc4e4419991be30ff2d042be", "https://taapi.mokagm.com/");// 获取 TDConfig 实例
+//        tdConfig.setMode(TDConfig.ModeEnum.DEBUG);//打开调试模式,配合控制台使用
+//        Log.e("", "数数设备id" + instanceThinking.getDeviceId());
+//        数数初始化
+        instanceThinking = ThinkingAnalyticsSDK.sharedInstance(tdConfig);
+        ThinkingAnalyticsSDK.enableTrackLog(true);
+        //数数公共属性
+        JSONObject superProperties = new JSONObject();
+        try {
+            superProperties.put("Channel", BuildConfig.TF_CHANNEL);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        instanceThinking.setSuperProperties(superProperties);
+        List<ThinkingAnalyticsSDK.AutoTrackEventType> eventTypeList = new ArrayList<>();
+        //APP安装事件
+        eventTypeList.add(ThinkingAnalyticsSDK.AutoTrackEventType.APP_INSTALL);
+        //APP启动事件
+        eventTypeList.add(ThinkingAnalyticsSDK.AutoTrackEventType.APP_START);
+        //APP关闭事件
+        eventTypeList.add(ThinkingAnalyticsSDK.AutoTrackEventType.APP_END);
+        //APP崩溃事件
+        eventTypeList.add(ThinkingAnalyticsSDK.AutoTrackEventType.APP_CRASH);
+        //开启自动采集事件
+        instanceThinking.enableAutoTrack(eventTypeList);
+//        /*数数结束*/
+//
+//        /*友盟开始*/
+        UMConfigure.init(this, BuildConfig.UM_AID, BuildConfig.TF_CHANNEL, UMConfigure.DEVICE_TYPE_PHONE, BuildConfig.UM_SECRET);
+//        UMConfigure.setLogEnabled(true);
+        MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);//AUTO模式页面采集
+//        /*友盟结束*/
+
+        /* 火山初始化开始 */
+//        final InitConfig config = new InitConfig(VOLCANIC_APP_ID, BuildConfig.TF_CHANNEL); // appid和渠道,appid如不清楚请联系客户成功经理
+//
+//        /* 数据采集地址*/
+//        config.setUriConfig(UriConstants.DEFAULT);
+//        config.setLogger((msg, t) -> Log.e("aaaa", msg)); // 是否在控制台输出日志,可用于观察用户行为日志上报情况,建议仅在调试时使用
+//        config.setAutoStart(true);
+//        AppLog.init(this, config);
+//        /* 初始化结束 */
+//        String BDDeviceID = AppLog.getDid();
+//        String installID = AppLog.getIid();
+//        Log.e("", "BDDeviceID:" + BDDeviceID + "installID:" + installID);
+//        initApplog(this);
+//        initMetaSec(this);
+    }
+
+    void initMetaSec(Context context) {
+        String BDDeviceID = AppLog.getDid();
+        String installID = AppLog.getIid();
+        Log.e("", "BDDeviceID:" + BDDeviceID + "installID:" + installID);
+        MSConfig.Builder builder = new MSConfig.Builder(Constants.VOLCANIC_APP_ID, Constants.LICENSE);
+        MSConfig config = builder
+                .setBDDeviceID(BDDeviceID)  //必须项,若为空,需要在获取到BDDeviceID时,重新设置进去。
+                .setClientType(MSConfig.CLIENT_TYPE_BUSINESS)    //必须项
+                .setChannel(BuildConfig.TF_CHANNEL)
+                .setInstallID(installID)
+                .build();
+        Log.e("", "BDDeviceID:" + BDDeviceID + "installID:" + installID + "testasfasfasf" + AppLog.getDid());
+
+        MSManagerUtils.init(context, config);
+    }
+
+    void onRegisterSuccess(String bdeviceID, String installID) {
+        Log.e("", "teBDDeviceIDst" + bdeviceID + " " + installID);
+        MSManager mgr = MSManagerUtils.get(Constants.VOLCANIC_APP_ID);
+        mgr.setBDDeviceID(bdeviceID);
+        mgr.setInstallID(installID);
+
+        //主动上报
+        String scene = "Application Init"; //场景名称,可任意填写。
+        mgr.report(scene);
+
+    }
+
+    void initApplog(Context context) {
+        final InitConfig applogConfig = new InitConfig(Constants.VOLCANIC_APP_ID, BuildConfig.TF_CHANNEL); // appid和渠道,appid如不清楚请联系客户成功经理
+        applogConfig.setUriConfig(UriConstants.DEFAULT);
+        applogConfig.setAutoStart(true);
+
+        AppLog.init(context, applogConfig);
+
+        AppLog.addDataObserver(new IDataObserver() {
+            @Override
+            public void onIdLoaded(String s, String s1, String s2) {
+                onRegisterSuccess(s, s1);
+            }
+
+            @Override
+            public void onRemoteIdGet(boolean b, String s, String s1, String s2, String s3, String s4, String s5) {
+                onRegisterSuccess(s1, s3);
+            }
+
+            @Override
+            public void onRemoteConfigGet(boolean b, JSONObject jsonObject) {
+            }
+
+            @Override
+            public void onRemoteAbConfigGet(boolean b, JSONObject jsonObject) {
+            }
+
+            @Override
+            public void onAbVidsChange(String s, String s1) {
+
+            }
+        });
+    }
+}

+ 8 - 0
build-cfg.json

@@ -0,0 +1,8 @@
+{
+    "ndk_module_path" :[
+        "${COCOS_ROOT}",
+        "${COCOS_ROOT}/cocos",
+        "${COCOS_ROOT}/external"
+    ],
+    "copy_resources": []
+}

+ 30 - 0
build.gradle

@@ -0,0 +1,30 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+
+    repositories {
+        google()
+        jcenter()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:4.1.0'
+
+        // 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://jitpack.io" } // 添加jitpack
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}

+ 29 - 0
jni/main.cpp

@@ -0,0 +1,29 @@
+/****************************************************************************
+ Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+#include "Game.h"
+
+cc::Application *cocos_main(int width, int height) {
+    return new Game(width, height);
+}

BIN
res/drawable/ad_close.png


BIN
res/drawable/ad_logo.png


BIN
res/drawable/loading_bg.jpg


BIN
res/drawable/share_icon.png


+ 13 - 0
res/layout/banner_ad.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:id="@+id/banner_container"
+        android:layout_width="match_parent"
+        android:layout_height="150dp"
+        android:layout_alignParentBottom="true"
+        android:orientation="horizontal" />
+</RelativeLayout>

+ 17 - 0
res/layout/native_ad.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright © 2018-2020 TopOn. All rights reserved.
+  ~ https://www.toponad.com
+  ~ Licensed under the TopOn SDK License Agreement
+  ~ https://github.com/toponteam/TopOn-Android-SDK/blob/master/LICENSE
+  -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <RelativeLayout
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="300dp"
+        android:layout_alignParentBottom="true" />
+</RelativeLayout>

+ 142 - 0
res/layout/native_ad_item.xml

@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright © 2018-2020 TopOn. All rights reserved.
+  ~ https://www.toponad.com
+  ~ Licensed under the TopOn SDK License Agreement
+  ~ https://github.com/toponteam/TopOn-Android-SDK/blob/master/LICENSE
+  -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="#ffffff"
+    android:orientation="vertical">
+
+
+    <!--<TextView-->
+    <!--android:id="@+id/native_ad_install_btn"-->
+    <!--android:layout_width="wrap_content"-->
+    <!--android:layout_height="wrap_content"-->
+    <!--android:layout_alignEnd="@+id/native_ad_content_image_area"-->
+    <!--android:layout_alignRight="@+id/native_ad_content_image_area"-->
+    <!--android:layout_below="@+id/native_ad_title"-->
+    <!--android:background="#888888"-->
+    <!--android:paddingBottom="5dp"-->
+    <!--android:paddingLeft="15dp"-->
+    <!--android:paddingRight="15dp"-->
+    <!--android:paddingTop="5dp"-->
+    <!--android:textColor="@android:color/white"-->
+    <!--android:textSize="11dp"-->
+    <!--android:visibility="gone"/>-->
+
+
+    <FrameLayout
+        android:id="@+id/native_ad_image"
+        android:layout_width="45dp"
+        android:layout_height="45dp"
+        android:layout_alignParentBottom="true"
+        android:layout_marginTop="10dp"
+        android:layout_marginRight="10dp"
+        android:scaleType="fitCenter"></FrameLayout>
+
+
+    <TextView
+        android:id="@+id/native_ad_install_btn"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignTop="@id/native_ad_image"
+        android:layout_alignBottom="@id/native_ad_image"
+        android:layout_alignParentRight="true"
+        android:layout_marginLeft="10dp"
+        android:background="#2095F1"
+        android:gravity="center"
+        android:paddingLeft="20dp"
+        android:paddingRight="20dp"
+        android:textColor="#ffffff" />
+
+    <TextView
+        android:id="@+id/native_ad_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignTop="@id/native_ad_image"
+        android:layout_toLeftOf="@id/native_ad_install_btn"
+        android:layout_toRightOf="@id/native_ad_image"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:textColor="#000000"
+        android:textSize="15dp"
+        android:textStyle="bold" />
+
+    <TextView
+        android:id="@+id/native_ad_desc"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignBottom="@id/native_ad_image"
+        android:layout_toLeftOf="@id/native_ad_install_btn"
+        android:layout_toRightOf="@id/native_ad_image"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:textColor="#777777"
+        android:textSize="12dp" />
+
+    <LinearLayout
+        android:id="@+id/native_ad_version_area"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_above="@id/native_ad_image"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/native_ad_version"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:autoLink="all"
+            android:ellipsize="end"
+            android:includeFontPadding="false"
+            android:maxLines="1"
+            android:padding="4dp"
+            android:text="Version"
+            android:textColor="#000000"
+            android:textSize="15dp"
+            android:textStyle="bold" />
+    </LinearLayout>
+
+
+    <FrameLayout
+        android:id="@+id/native_ad_content_image_area"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@id/native_ad_version_area"></FrameLayout>
+
+    <com.anythink.nativead.api.ATNativeImageView
+        android:id="@+id/native_ad_logo"
+        android:layout_width="40dp"
+        android:layout_height="20dp"
+        android:layout_alignParentRight="true"
+        android:layout_marginTop="2dp"
+        android:layout_marginRight="2dp"
+        android:visibility="gone" />
+
+
+    <ImageView
+        android:id="@+id/native_self_adlogo"
+        android:layout_width="10dp"
+        android:layout_height="10dp"
+        android:layout_marginLeft="2dp"
+        android:src="@drawable/ad_logo" />
+
+    <TextView
+        android:id="@+id/native_ad_from"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignTop="@id/native_ad_logo"
+        android:layout_marginLeft="2dp"
+        android:layout_marginRight="2dp"
+        android:layout_toLeftOf="@id/native_self_adlogo"
+        android:background="#888888"
+        android:gravity="center"
+        android:paddingLeft="2dp"
+        android:paddingRight="2dp"
+        android:textColor="#ffffff"
+        android:textSize="6dp" />
+
+</RelativeLayout>

+ 15 - 0
res/layout/splash.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/splashImage"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitXY"
+        android:src="@drawable/loading_bg"/>
+</RelativeLayout>

+ 20 - 0
res/layout/splash_ad.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#ffffff">
+
+    <ImageView
+        android:id="@+id/splashImage"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitXY"
+        android:src="@drawable/loading_bg"/>
+    <FrameLayout
+        android:id="@+id/splash_content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+</RelativeLayout>

BIN
res/mipmap-hdpi/ic_launcher.png


BIN
res/mipmap-mdpi/ic_launcher.png


BIN
res/mipmap-xhdpi/ic_launcher.png


BIN
res/mipmap-xxhdpi/ic_launcher.png


+ 3 - 0
res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name" translatable="false">将军顶住</string>
+</resources>

+ 13 - 0
res/values/style.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <style name="openTheme" parent="android:Theme.NoTitleBar.Fullscreen">
+        <item name="android:windowBackground">@drawable/loading_bg</item>
+    </style>
+
+    <style name="wxTheme" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="android:windowFullscreen">true</item>
+        <item name="android:windowIsTranslucent">false</item>
+        <item name="android:windowDisablePreview">true</item>
+    </style>
+</resources>

+ 17 - 0
res/xml/anythink_bk_gdt_file_path.xml

@@ -0,0 +1,17 @@
+<!--
+  ~ Copyright © 2018-2020 TopOn. All rights reserved.
+  ~ https://www.toponad.com
+  ~ Licensed under the TopOn SDK License Agreement
+  ~ https://github.com/toponteam/TopOn-Android-SDK/blob/master/LICENSE
+  -->
+
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+    <external-path name="gdt_sdk_download_path" path="GDTDOWNLOAD" />
+    <root-path name="root" path="" />
+    <external-cache-path
+        name="gdt_sdk_download_path1"
+        path="com_qq_e_download" />
+    <cache-path
+        name="gdt_sdk_download_path2"
+        path="com_qq_e_download" />
+</paths>

+ 14 - 0
res/xml/anythink_bk_sigmob_file_path.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright © 2018-2020 TopOn. All rights reserved.
+  ~ https://www.toponad.com
+  ~ Licensed under the TopOn SDK License Agreement
+  ~ https://github.com/toponteam/TopOn-Android-SDK/blob/master/LICENSE
+  -->
+
+<paths>
+    <!-- 这个下载路径不可以修改,SigDownload -->
+    <external-cache-path name="SigMob_root" path="SigDownload" />
+    <external-path name="SigMob_root_external" path="." />
+    <root-path name="SigMob_root" path="." />
+</paths>

+ 16 - 0
res/xml/anythink_bk_tt_file_path.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright © 2018-2020 TopOn. All rights reserved.
+  ~ https://www.toponad.com
+  ~ Licensed under the TopOn SDK License Agreement
+  ~ https://github.com/toponteam/TopOn-Android-SDK/blob/master/LICENSE
+  -->
+
+<paths>
+    <external-path name="tt_external_root" path="." />
+    <external-path name="tt_external_download" path="Download" />
+    <external-files-path name="tt_external_files_download" path="Download" />
+    <files-path name="tt_internal_file_download" path="Download" />
+    <cache-path name="tt_internal_cache_download" path="Download" />
+    <root-path name="root" path="" />
+</paths>

+ 5 - 0
res/xml/file_path.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+    <root-path name="down-path"
+        path="/storage/emulated/0/Download/"/>
+</paths>