Преглед изворни кода

[new]增加广告事件监听回调功能

zk пре 1 година
родитељ
комит
cc7ec62ecc
27 измењених фајлова са 337 додато и 50 уклоњено
  1. 4 0
      CHANGELOG.md
  2. 1 1
      README.md
  3. 5 0
      android/src/main/java/com/atmob/flutter_ad/FlutterAdPlugin.java
  4. 4 4
      android/src/main/java/com/atmob/flutter_ad/FlutterAdViewPlugin.java
  5. 73 0
      android/src/main/java/com/atmob/flutter_ad/adevent/AtmobAdEventHelper.java
  6. 3 2
      android/src/main/java/com/atmob/flutter_ad/bannerad/BannerAdView.java
  7. 13 0
      android/src/main/java/com/atmob/flutter_ad/constants/CommonParams.java
  8. 9 0
      android/src/main/java/com/atmob/flutter_ad/constants/FlutterAdMethod.java
  9. 5 2
      android/src/main/java/com/atmob/flutter_ad/constants/FlutterViewConfig.java
  10. 8 9
      android/src/main/java/com/atmob/flutter_ad/interstitial/InterstitialAdCall.java
  11. 3 2
      android/src/main/java/com/atmob/flutter_ad/nativead/NativeAdView.java
  12. 3 8
      android/src/main/java/com/atmob/flutter_ad/splash/SplashAdView.java
  13. 27 2
      android/src/main/java/com/atmob/flutter_ad/utils/FlutterParamsUtils.java
  14. 5 7
      android/src/main/java/com/atmob/flutter_ad/video/RewardVideoAdCall.java
  15. 1 0
      lib/flutter_ad.dart
  16. 13 0
      lib/src/constants/ad_constant.dart
  17. 49 0
      lib/src/constants/flutter_method.dart
  18. 3 2
      lib/src/constants/view_type.dart
  19. 13 5
      lib/src/core/flutter_ad_method_channel.dart
  20. 5 0
      lib/src/core/flutter_ad_platform.dart
  21. 6 1
      lib/src/core/flutter_atmob_ad.dart
  22. 17 0
      lib/src/listener/on_ad_event_listener.dart
  23. 62 0
      lib/src/utils/flutter_ad_event_listener_method_handler.dart
  24. 2 2
      lib/src/utils/flutter_ad_listener_method_channel_helper.dart
  25. 1 1
      lib/src/widget/flutter_banner_ad_view.dart
  26. 1 1
      lib/src/widget/flutter_native_ad_view.dart
  27. 1 1
      lib/src/widget/flutter_splash_ad_view.dart

+ 4 - 0
CHANGELOG.md

@@ -2,3 +2,7 @@
 
 * 新增Android端广告插件
 * sdk:plus.ad:ad:2.9.6-SNAPSHOT
+
+## 0.0.2
+
+* 新增Android端广告事件回调

+ 1 - 1
README.md

@@ -4,7 +4,7 @@
 
 ## Getting Started
 
-FlutterAtmobAd 调用初始化、激励视频、插屏、插全屏 <br>
+FlutterAtmobAd 调用初始化、激励视频、插屏、插全屏、注册广告事件监听 <br>
 FlutterSplashAdView 调用开屏广告 <br>
 FlutterBannerAdView 调用Banner广告 <br>
 FlutterNativeAdView 调用原生广告 <br>

+ 5 - 0
android/src/main/java/com/atmob/flutter_ad/FlutterAdPlugin.java

@@ -6,8 +6,10 @@ import android.util.Log;
 
 import androidx.annotation.NonNull;
 
+import com.atmob.flutter_ad.adevent.AtmobAdEventHelper;
 import com.atmob.flutter_ad.config.FlutterAtmobAdConfig;
 import com.atmob.flutter_ad.constants.FlutterAdMethod;
+import com.atmob.flutter_ad.constants.FlutterNameConfig;
 import com.atmob.flutter_ad.interstitial.InterstitialAdCall;
 import com.atmob.flutter_ad.video.RewardVideoAdCall;
 import com.atmob.logging.AtmobLog;
@@ -64,6 +66,9 @@ public class FlutterAdPlugin implements FlutterPlugin, MethodCallHandler, Activi
                 case FlutterAdMethod.loadRewardVideo:
                     RewardVideoAdCall.loadRewardVideo(applicationContext, channel, call, result);
                     break;
+                case FlutterAdMethod.setAdEventCallback:
+                    AtmobAdEventHelper.setAdEventCallback(flutterPluginBinding, result);
+                    break;
                 default:
                     result.notImplemented();
                     break;

+ 4 - 4
android/src/main/java/com/atmob/flutter_ad/FlutterAdViewPlugin.java

@@ -4,7 +4,7 @@ package com.atmob.flutter_ad;
 import android.app.Activity;
 
 import com.atmob.flutter_ad.bannerad.BannerAdViewFactory;
-import com.atmob.flutter_ad.constants.FlutterViewConfig;
+import com.atmob.flutter_ad.constants.FlutterNameConfig;
 import com.atmob.flutter_ad.nativead.NativeAdViewFactory;
 import com.atmob.flutter_ad.splash.SplashAdViewFactory;
 
@@ -15,11 +15,11 @@ public class FlutterAdViewPlugin {
 
     public static void registerWith(FlutterPlugin.FlutterPluginBinding flutterPluginBinding, Activity mActivity) {
 
-        flutterPluginBinding.getPlatformViewRegistry().registerViewFactory(FlutterViewConfig.splashAdView, new SplashAdViewFactory(mActivity, flutterPluginBinding.getBinaryMessenger()));
+        flutterPluginBinding.getPlatformViewRegistry().registerViewFactory(FlutterNameConfig.splashAdView, new SplashAdViewFactory(mActivity, flutterPluginBinding.getBinaryMessenger()));
 
-        flutterPluginBinding.getPlatformViewRegistry().registerViewFactory(FlutterViewConfig.nativeAdView, new NativeAdViewFactory(mActivity, flutterPluginBinding.getBinaryMessenger()));
+        flutterPluginBinding.getPlatformViewRegistry().registerViewFactory(FlutterNameConfig.nativeAdView, new NativeAdViewFactory(mActivity, flutterPluginBinding.getBinaryMessenger()));
 
-        flutterPluginBinding.getPlatformViewRegistry().registerViewFactory(FlutterViewConfig.bannerAdView, new BannerAdViewFactory(mActivity, flutterPluginBinding.getBinaryMessenger()));
+        flutterPluginBinding.getPlatformViewRegistry().registerViewFactory(FlutterNameConfig.bannerAdView, new BannerAdViewFactory(mActivity, flutterPluginBinding.getBinaryMessenger()));
 
 
     }

+ 73 - 0
android/src/main/java/com/atmob/flutter_ad/adevent/AtmobAdEventHelper.java

@@ -0,0 +1,73 @@
+package com.atmob.flutter_ad.adevent;
+
+import com.atmob.ad.callback.OnAdEventCallback;
+import com.atmob.flutter_ad.constants.FlutterAdMethod;
+import com.atmob.flutter_ad.constants.FlutterNameConfig;
+import com.atmob.flutter_ad.utils.FlutterParamsUtils;
+import com.atmob.logging.AtmobLog;
+import com.atmob.sdk.AtmobAdSdk;
+
+import io.flutter.embedding.engine.plugins.FlutterPlugin;
+import io.flutter.plugin.common.MethodChannel;
+
+public class AtmobAdEventHelper {
+
+    private static final String TAG = "AtmobAdEventHelper";
+    private static volatile MethodChannel eventChannel;
+
+    private AtmobAdEventHelper() {
+    }
+
+
+    public static void setAdEventCallback(FlutterPlugin.FlutterPluginBinding flutterPluginBinding, MethodChannel.Result result) {
+        try {
+            if (eventChannel == null) {
+                synchronized (AtmobAdEventHelper.class) {
+                    if (eventChannel == null) {
+                        eventChannel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), FlutterNameConfig.adEvent);
+                    }
+                }
+            }
+            AtmobAdSdk.getInstance().setAdEventCallback(new OnAdEventCallback() {
+                @Override
+                public void onAdLoad(String adUnionType, String adPlacementId, String adSourceId, String adType, String adnType) {
+                    AtmobLog.d(TAG, "onAdLoad: adUnionType = " + adUnionType + ", adPlacementId = " + adPlacementId + ", adSourceId = " + adSourceId + ", adType = " + adType + ", adnType = " + adnType);
+                    if (eventChannel != null)
+                        eventChannel.invokeMethod(FlutterAdMethod.onAdLoadEvent, FlutterParamsUtils.createAdEventParams(adUnionType, adPlacementId, adSourceId, adType, adnType));
+                }
+
+                @Override
+                public void onAdShow(String adUnionType, String adPlacementId, String adSourceId, String adType, String adnType, float ecpm) {
+                    AtmobLog.d(TAG, "onAdShow: adUnionType = " + adUnionType + ", adPlacementId = " + adPlacementId + ", adSourceId = " + adSourceId + ", adType = " + adType + ", adnType = " + adnType + ", ecpm = " + ecpm);
+                    if (eventChannel != null)
+                        eventChannel.invokeMethod(FlutterAdMethod.onAdShowEvent, FlutterParamsUtils.createAdEventParams(adUnionType, adPlacementId, adSourceId, adType, adnType, ecpm));
+                }
+
+                @Override
+                public void onAdClick(String adUnionType, String adPlacementId, String adSourceId, String adType, String adnType, float ecpm) {
+                    AtmobLog.d(TAG, "onAdClick: adUnionType = " + adUnionType + ", adPlacementId = " + adPlacementId + ", adSourceId = " + adSourceId + ", adType = " + adType + ", adnType = " + adnType + ", ecpm = " + ecpm);
+                    if (eventChannel != null)
+                        eventChannel.invokeMethod(FlutterAdMethod.onAdClickEvent, FlutterParamsUtils.createAdEventParams(adUnionType, adPlacementId, adSourceId, adType, adnType, ecpm));
+                }
+
+                @Override
+                public void onAdPlayStart(String adUnionType, String adPlacementId, String adSourceId, String adType, String adnType, float ecpm) {
+                    AtmobLog.d(TAG, "onAdPlayStart: adUnionType = " + adUnionType + ", adPlacementId = " + adPlacementId + ", adSourceId = " + adSourceId + ", adType = " + adType + ", adnType = " + adnType + ", ecpm = " + ecpm);
+                    if (eventChannel != null)
+                        eventChannel.invokeMethod(FlutterAdMethod.onAdPlayStartEvent, FlutterParamsUtils.createAdEventParams(adUnionType, adPlacementId, adSourceId, adType, adnType, ecpm));
+                }
+
+                @Override
+                public void onAdPlayEnd(String adUnionType, String adPlacementId, String adSourceId, String adType, String adnType, float ecpm, int duration, boolean isPlayOver) {
+                    AtmobLog.d(TAG, "onAdPlayEnd: adUnionType = " + adUnionType + ", adPlacementId = " + adPlacementId + ", adSourceId = " + adSourceId + ", adType = " + adType + ", adnType = " + adnType + ", ecpm = " + ecpm + ", duration = " + duration + ", isPlayOver = " + isPlayOver);
+                    if (eventChannel != null)
+                        eventChannel.invokeMethod(FlutterAdMethod.onAdPlayEndEvent, FlutterParamsUtils.createAdEventParams(adUnionType, adPlacementId, adSourceId, adType, adnType, ecpm, duration, isPlayOver));
+                }
+            });
+            result.success(null);
+        } catch (Exception e) {
+            result.error("setAdEventCallback error", e.getMessage(), null);
+        }
+    }
+
+}

+ 3 - 2
android/src/main/java/com/atmob/flutter_ad/bannerad/BannerAdView.java

@@ -9,7 +9,7 @@ import androidx.annotation.Nullable;
 
 import com.atmob.ad.listener.BannerListener;
 import com.atmob.flutter_ad.constants.FlutterListenerMethod;
-import com.atmob.flutter_ad.constants.FlutterViewConfig;
+import com.atmob.flutter_ad.constants.FlutterNameConfig;
 import com.atmob.flutter_ad.utils.FlutterParamsUtils;
 import com.atmob.flutter_ad.utils.SizeUtils;
 import com.atmob.flutter_ad.widget.AdLoadContainer;
@@ -83,7 +83,7 @@ public class BannerAdView implements PlatformView {
         }
         adFuncId = FlutterParamsUtils.getInt(args, "adFuncId", -1);
         AtmobLog.d(TAG, "adFuncId:" + adFuncId);
-        channel = new MethodChannel(messenger, FlutterViewConfig.bannerAdView + "_" + viewId);
+        channel = new MethodChannel(messenger, FlutterNameConfig.bannerAdView + "_" + viewId);
     }
 
 
@@ -143,6 +143,7 @@ public class BannerAdView implements PlatformView {
         if (mContainer != null) {
             mContainer.removeAllViews();
         }
+        channel.setMethodCallHandler(null);
     }
 
 

+ 13 - 0
android/src/main/java/com/atmob/flutter_ad/constants/CommonParams.java

@@ -4,4 +4,17 @@ public class CommonParams {
 
 
     public static final String AdFuncId = "adFuncId";
+
+
+    //广告事件参数
+    public static final String AdUnionType = "adUnionType";
+    public static final String AdPlacementId = "adPlacementId";
+    public static final String AdSourceId = "adSourceId";
+    public static final String AdType = "adType";
+    public static final String AdnType = "adnType";
+    public static final String Ecpm = "ecpm";
+    public static final String Duration = "duration";
+    public static final String IsPlayOver = "isPlayOver";
+
+
 }

+ 9 - 0
android/src/main/java/com/atmob/flutter_ad/constants/FlutterAdMethod.java

@@ -14,4 +14,13 @@ public class FlutterAdMethod {
     public static final String loadInterstitialFull = "loadInterstitialFull";
 
     public static final String loadRewardVideo = "loadRewardVideo";
+
+    public static final String setAdEventCallback = "setAdEventCallback";
+
+
+    public static final String onAdLoadEvent = "onAdLoad";
+    public static final String onAdShowEvent = "onAdShow";
+    public static final String onAdClickEvent = "onAdClick";
+    public static final String onAdPlayStartEvent = "onAdPlayStart";
+    public static final String onAdPlayEndEvent = "onAdPlayEnd";
 }

+ 5 - 2
android/src/main/java/com/atmob/flutter_ad/constants/FlutterViewConfig.java

@@ -1,8 +1,8 @@
 package com.atmob.flutter_ad.constants;
 
-public class FlutterViewConfig {
+public class FlutterNameConfig {
 
-    private FlutterViewConfig() {
+    private FlutterNameConfig() {
     }
 
 
@@ -10,4 +10,7 @@ public class FlutterViewConfig {
     public static final String nativeAdView = "com.atmob.flutter_ad/nativeAdView";
     public static final String bannerAdView = "com.atmob.flutter_ad/bannerAdView";
 
+
+    public static final String adEvent = "com.atmob.flutter_ad/adEvent";
+
 }

+ 8 - 9
android/src/main/java/com/atmob/flutter_ad/interstitial/InterstitialAdCall.java

@@ -1,7 +1,6 @@
 package com.atmob.flutter_ad.interstitial;
 
 import android.content.Context;
-import android.text.TextUtils;
 
 import com.atmob.ad.listener.InterstitialFullListener;
 import com.atmob.ad.listener.InterstitialListener;
@@ -39,27 +38,27 @@ public class InterstitialAdCall {
             @Override
             public void onShow() {
                 AtmobLog.d(TAG, "loadInterstitial..onShow");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onShow));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onShow));
             }
 
             @Override
             public void onClose() {
                 AtmobLog.d(TAG, "loadInterstitial..onClose");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onClose));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onClose));
 
             }
 
             @Override
             public void onFail(String s) {
                 AtmobLog.d(TAG, "loadInterstitial..onFail: " + s);
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onFail, s));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onFail, s));
 
             }
 
             @Override
             public void onClick() {
                 AtmobLog.d(TAG, "loadInterstitial..onClick");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onClick));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onClick));
 
             }
         });
@@ -82,27 +81,27 @@ public class InterstitialAdCall {
             @Override
             public void onShow() {
                 AtmobLog.d(TAG, "loadInterstitialFull..onShow");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onShow));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onShow));
             }
 
             @Override
             public void onClose() {
                 AtmobLog.d(TAG, "loadInterstitialFull..onClose");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onClose));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onClose));
 
             }
 
             @Override
             public void onFail(String s) {
                 AtmobLog.d(TAG, "loadInterstitialFull..onFail: " + s);
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onFail, s));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onFail, s));
 
             }
 
             @Override
             public void onClick() {
                 AtmobLog.d(TAG, "loadInterstitialFull..onClick");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onClick));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onClick));
             }
         });
     }

+ 3 - 2
android/src/main/java/com/atmob/flutter_ad/nativead/NativeAdView.java

@@ -9,7 +9,7 @@ import androidx.annotation.Nullable;
 
 import com.atmob.ad.listener.NativeExpressListener;
 import com.atmob.flutter_ad.constants.FlutterListenerMethod;
-import com.atmob.flutter_ad.constants.FlutterViewConfig;
+import com.atmob.flutter_ad.constants.FlutterNameConfig;
 import com.atmob.flutter_ad.utils.FlutterParamsUtils;
 import com.atmob.flutter_ad.utils.SizeUtils;
 import com.atmob.flutter_ad.widget.AdLoadContainer;
@@ -83,7 +83,7 @@ public class NativeAdView implements PlatformView {
         }
         adFuncId = FlutterParamsUtils.getInt(args, "adFuncId", -1);
         AtmobLog.d(TAG, "adFuncId:" + adFuncId);
-        channel = new MethodChannel(messenger, FlutterViewConfig.nativeAdView + "_" + viewId);
+        channel = new MethodChannel(messenger, FlutterNameConfig.nativeAdView + "_" + viewId);
     }
 
 
@@ -146,6 +146,7 @@ public class NativeAdView implements PlatformView {
         if (adNative != null) {
             adNative.removeNativeExpress();
         }
+        channel.setMethodCallHandler(null);
     }
 
 

+ 3 - 8
android/src/main/java/com/atmob/flutter_ad/splash/SplashAdView.java

@@ -4,22 +4,16 @@ import android.app.Activity;
 import android.content.Context;
 import android.view.Gravity;
 import android.view.View;
-import android.widget.FrameLayout;
 import android.widget.LinearLayout;
-
 import androidx.annotation.Nullable;
-
 import com.atmob.ad.listener.SplashListener;
 import com.atmob.flutter_ad.constants.FlutterListenerMethod;
-import com.atmob.flutter_ad.constants.FlutterViewConfig;
+import com.atmob.flutter_ad.constants.FlutterNameConfig;
 import com.atmob.flutter_ad.utils.FlutterParamsUtils;
-import com.atmob.flutter_ad.utils.ViewUtils;
 import com.atmob.logging.AtmobLog;
 import com.atmob.sdk.AtmobAdNative;
 import com.atmob.sdk.AtmobAdSdk;
-
 import java.util.Map;
-
 import io.flutter.plugin.common.BinaryMessenger;
 import io.flutter.plugin.common.MethodChannel;
 import io.flutter.plugin.platform.PlatformView;
@@ -62,7 +56,7 @@ public class SplashAdView implements PlatformView {
         mContainer.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
         mContainer.setGravity(Gravity.BOTTOM);
         mContainer.setOrientation(LinearLayout.VERTICAL);
-        channel = new MethodChannel(messenger, FlutterViewConfig.splashAdView + "_" + viewId);
+        channel = new MethodChannel(messenger, FlutterNameConfig.splashAdView + "_" + viewId);
     }
 
 
@@ -135,5 +129,6 @@ public class SplashAdView implements PlatformView {
         if (mContainer != null) {
             mContainer.removeAllViews();
         }
+        channel.setMethodCallHandler(null);
     }
 }

+ 27 - 2
android/src/main/java/com/atmob/flutter_ad/utils/FlutterParamsUtils.java

@@ -3,13 +3,15 @@ package com.atmob.flutter_ad.utils;
 
 import android.text.TextUtils;
 
+import com.atmob.flutter_ad.constants.CommonParams;
+
 import java.util.HashMap;
 import java.util.Map;
 
 public class FlutterParamsUtils {
 
 
-    public static Map<String, Object> createCommonParams(String adFuncId, String method, String failMsg) {
+    public static Map<String, Object> createAdMethodParams(String adFuncId, String method, String failMsg) {
         Map<String, Object> params = new HashMap<>();
         params.put("adFuncId", adFuncId);
         params.put("method", method);
@@ -17,13 +19,36 @@ public class FlutterParamsUtils {
         return params;
     }
 
-    public static Map<String, Object> createCommonParams(String adFuncId, String method) {
+    public static Map<String, Object> createAdMethodParams(String adFuncId, String method) {
         Map<String, Object> params = new HashMap<>();
         params.put("adFuncId", adFuncId);
         params.put("method", method);
         return params;
     }
 
+    public static Map<String, Object> createAdEventParams(String adUnionType, String adPlacementId, String adSourceId, String adType, String adnType) {
+        return createAdEventParams(adUnionType, adPlacementId, adSourceId, adType, adnType, null);
+    }
+
+    public static Map<String, Object> createAdEventParams(String adUnionType, String adPlacementId, String adSourceId, String adType, String adnType, Float ecpm) {
+        return createAdEventParams(adUnionType, adPlacementId, adSourceId, adType, adnType, ecpm, null, null);
+    }
+
+    public static Map<String, Object> createAdEventParams(String adUnionType, String adPlacementId, String adSourceId, String adType, String adnType, Float ecpm, Integer duration, Boolean isPlayOver) {
+        Map<String, Object> params = new HashMap<>();
+        params.put(CommonParams.AdUnionType, adUnionType);
+        params.put(CommonParams.AdPlacementId, adPlacementId);
+        params.put(CommonParams.AdSourceId, adSourceId);
+        params.put(CommonParams.AdType, adType);
+        params.put(CommonParams.AdnType, adnType);
+        if (ecpm != null) {
+            params.put(CommonParams.Ecpm, ecpm + "");
+        }
+        params.put(CommonParams.Duration, duration);
+        params.put(CommonParams.IsPlayOver, isPlayOver);
+        return params;
+    }
+
     public static String getString(Map<String, Object> params, String param) {
         if (params == null) {
             return null;

+ 5 - 7
android/src/main/java/com/atmob/flutter_ad/video/RewardVideoAdCall.java

@@ -1,9 +1,7 @@
 package com.atmob.flutter_ad.video;
 
 import android.content.Context;
-import android.text.TextUtils;
 
-import com.atmob.ad.listener.InterstitialFullListener;
 import com.atmob.ad.listener.RewardVideoListener;
 import com.atmob.flutter_ad.constants.CommonParams;
 import com.atmob.flutter_ad.constants.FlutterAdMethod;
@@ -39,33 +37,33 @@ public class RewardVideoAdCall {
             @Override
             public void onRewarded() {
                 AtmobLog.d(TAG, "loadRewardVideo..onRewarded");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onRewarded));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onRewarded));
             }
 
             @Override
             public void onShow() {
                 AtmobLog.d(TAG, "loadRewardVideo..onShow");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onShow));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onShow));
             }
 
             @Override
             public void onClose() {
                 AtmobLog.d(TAG, "loadRewardVideo..onClose");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onClose));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onClose));
 
             }
 
             @Override
             public void onFail(String s) {
                 AtmobLog.d(TAG, "loadRewardVideo..onFail: " + s);
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onFail, s));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onFail, s));
 
             }
 
             @Override
             public void onClick() {
                 AtmobLog.d(TAG, "loadRewardVideo..onClick");
-                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createCommonParams(String.valueOf(adFuncId), FlutterListenerMethod.onClick));
+                channel.invokeMethod(FlutterAdMethod.flutterAdMethod, FlutterParamsUtils.createAdMethodParams(String.valueOf(adFuncId), FlutterListenerMethod.onClick));
 
             }
         });

+ 1 - 0
lib/flutter_ad.dart

@@ -10,6 +10,7 @@ export 'package:flutter_ad/src/constants/ad_constant.dart';
 
 //监听
 export 'package:flutter_ad/src/listener/ad_action_listener.dart';
+export 'package:flutter_ad/src/listener/on_ad_event_listener.dart';
 export 'package:flutter_ad/src/listener/atmob_ad_listener.dart';
 export 'package:flutter_ad/src/listener/banner_ad_listener.dart';
 export 'package:flutter_ad/src/listener/interstitial_ad_listener.dart';

+ 13 - 0
lib/src/constants/ad_constant.dart

@@ -29,3 +29,16 @@ enum AdPlatform {
 
   final int value;
 }
+
+class AdEventParams {
+  AdEventParams._();
+
+  static const String adUnionType = "adUnionType";
+  static const String adPlacementId = "adPlacementId";
+  static const String adSourceId = "adSourceId";
+  static const String adType = "adType";
+  static const String adnType = "adnType";
+  static const String ecpm = "ecpm";
+  static const String duration = "duration";
+  static const String isPlayOver = "isPlayOver";
+}

+ 49 - 0
lib/src/constants/flutter_method.dart

@@ -23,4 +23,53 @@ class FlutterAdMethod {
   static const String loadInterstitialFull = "loadInterstitialFull";
 
   static const String loadRewardVideo = "loadRewardVideo";
+
+  static const String setAdEventCallback = "setAdEventCallback";
+
+  static const String onAdLoadEvent = "onAdLoad";
+
+  static const String onAdShowEvent = "onAdShow";
+
+  static const String onAdClickEvent = "onAdClick";
+
+  static const String onAdPlayStartEvent = "onAdPlayStart";
+
+  static const String onAdPlayEndEvent = "onAdPlayEnd";
 }
+
+typedef OnAdLoadEvent = void Function(String? adUnionType,
+    String? adPlacementId, String? adSourceId, String? adType, String? adnType);
+
+typedef OnAdShowEvent = void Function(
+    String? adUnionType,
+    String? adPlacementId,
+    String? adSourceId,
+    String? adType,
+    String? adnType,
+    double? ecpm);
+
+typedef OnAdClickEvent = void Function(
+    String? adUnionType,
+    String? adPlacementId,
+    String? adSourceId,
+    String? adType,
+    String? adnType,
+    double? ecpm);
+
+typedef OnAdPlayStartEvent = void Function(
+    String? adUnionType,
+    String? adPlacementId,
+    String? adSourceId,
+    String? adType,
+    String? adnType,
+    double? ecpm);
+
+typedef OnAdPlayEndEvent = void Function(
+    String? adUnionType,
+    String? adPlacementId,
+    String? adSourceId,
+    String? adType,
+    String? adnType,
+    double? ecpm,
+    int? duration,
+    bool? isPlayOver);

+ 3 - 2
lib/src/constants/view_type.dart

@@ -1,9 +1,10 @@
-class ChannelViewType {
-  ChannelViewType._();
+class ChannelName {
+  ChannelName._();
 
   static const String splashViewType = "com.atmob.flutter_ad/splashAdView";
   static const String nativeViewType = "com.atmob.flutter_ad/nativeAdView";
   static const String bannerViewType = "com.atmob.flutter_ad/bannerAdView";
+  static const String adEvent = "com.atmob.flutter_ad/adEvent";
 }
 
 class ChannelMethod {

+ 13 - 5
lib/src/core/flutter_ad_method_channel.dart

@@ -2,10 +2,12 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_ad/src/constants/flutter_method.dart';
 import '../config/atmob_ad_config.dart';
+import '../listener/on_ad_event_listener.dart';
 import '../listener/interstitial_ad_listener.dart';
 import '../listener/interstitial_full_ad_listener.dart';
 import '../listener/reward_video_ad_listener.dart';
-import '../utils/flutter_ad_listener_method_channel_helper.dart';
+import '../utils/flutter_ad_event_listener_method_handler.dart';
+import '../utils/flutter_ad_listener_method_handler.dart';
 import 'flutter_ad_platform.dart';
 
 /// An implementation of [FlutterAdPlatform] that uses method channels.
@@ -15,7 +17,7 @@ class MethodChannelFlutterAd extends FlutterAdPlatform {
   final methodChannel = const MethodChannel('flutter_ad');
 
   MethodChannelFlutterAd() {
-    FlutterAdListenerMethodChannelHelper.setMethodChannel(methodChannel);
+    FlutterAdListenerMethodHandler.setMethodChannel(methodChannel);
   }
 
   @override
@@ -24,6 +26,12 @@ class MethodChannelFlutterAd extends FlutterAdPlatform {
   }
 
   @override
+  Future<void> setAdEventCallback(OnAdEventCallback callback) {
+    flutterAdEventListenerMethodHandler.setAdEventCallback(callback);
+    return methodChannel.invokeMethod("setAdEventCallback");
+  }
+
+  @override
   void loadInterstitial(
       {required String androidAdFuncId,
       required String iosAdFuncId,
@@ -39,7 +47,7 @@ class MethodChannelFlutterAd extends FlutterAdPlatform {
       default:
         throw UnsupportedError("Unsupported platform");
     }
-    FlutterAdListenerMethodChannelHelper.setAdListener(adFuncId, listener);
+    FlutterAdListenerMethodHandler.setAdListener(adFuncId, listener);
     methodChannel.invokeMethod(FlutterAdMethod.loadInterstitial, {
       "adFuncId": adFuncId,
     });
@@ -61,7 +69,7 @@ class MethodChannelFlutterAd extends FlutterAdPlatform {
       default:
         throw UnsupportedError("Unsupported platform");
     }
-    FlutterAdListenerMethodChannelHelper.setAdListener(adFuncId, listener);
+    FlutterAdListenerMethodHandler.setAdListener(adFuncId, listener);
     methodChannel.invokeMethod(FlutterAdMethod.loadInterstitialFull, {
       "adFuncId": adFuncId,
     });
@@ -83,7 +91,7 @@ class MethodChannelFlutterAd extends FlutterAdPlatform {
       default:
         throw UnsupportedError("Unsupported platform");
     }
-    FlutterAdListenerMethodChannelHelper.setAdListener(adFuncId, listener);
+    FlutterAdListenerMethodHandler.setAdListener(adFuncId, listener);
     methodChannel.invokeMethod(FlutterAdMethod.loadRewardVideo, {
       "adFuncId": adFuncId,
     });

+ 5 - 0
lib/src/core/flutter_ad_platform.dart

@@ -4,6 +4,7 @@ import 'package:flutter_ad/src/listener/interstitial_full_ad_listener.dart';
 import 'package:flutter_ad/src/listener/reward_video_ad_listener.dart';
 import 'package:plugin_platform_interface/plugin_platform_interface.dart';
 
+import '../listener/on_ad_event_listener.dart';
 import 'flutter_ad_method_channel.dart';
 
 abstract class FlutterAdPlatform extends PlatformInterface {
@@ -31,6 +32,10 @@ abstract class FlutterAdPlatform extends PlatformInterface {
     throw UnimplementedError('initAd() has not been implemented.');
   }
 
+  Future<void> setAdEventCallback(OnAdEventCallback callback) {
+    throw UnimplementedError('setAdEventCallback() has not been implemented.');
+  }
+
   void loadInterstitial(
       {required String androidAdFuncId,
       required String iosAdFuncId,

+ 6 - 1
lib/src/core/flutter_atmob_ad.dart

@@ -2,6 +2,7 @@ import 'package:flutter_ad/src/listener/interstitial_full_ad_listener.dart';
 import 'package:flutter_ad/src/listener/reward_video_ad_listener.dart';
 
 import '../config/atmob_ad_config.dart';
+import '../listener/on_ad_event_listener.dart';
 import '../listener/interstitial_ad_listener.dart';
 import 'flutter_ad_platform.dart';
 
@@ -9,10 +10,14 @@ class FlutterAtmobAd {
   FlutterAtmobAd._();
 
   /// 初始化广告
-  static Future<void> initAd(AtmobAdConfig adConfig) async {
+  static Future<void> initAd(AtmobAdConfig adConfig) {
     return FlutterAdPlatform.instance.initAd(adConfig);
   }
 
+  static Future<void> setAdEventCallback(OnAdEventCallback callback) {
+    return FlutterAdPlatform.instance.setAdEventCallback(callback);
+  }
+
   static void loadInterstitial(
       {required String androidAdFuncId,
       required String iosAdFuncId,

+ 17 - 0
lib/src/listener/on_ad_event_listener.dart

@@ -0,0 +1,17 @@
+import '../constants/flutter_method.dart';
+
+class OnAdEventCallback {
+  final OnAdLoadEvent onAdLoad;
+  final OnAdShowEvent onAdShow;
+  final OnAdClickEvent onAdClick;
+  final OnAdPlayStartEvent onAdPlayStart;
+  final OnAdPlayEndEvent onAdPlayEnd;
+
+  OnAdEventCallback({
+    required this.onAdLoad,
+    required this.onAdShow,
+    required this.onAdClick,
+    required this.onAdPlayStart,
+    required this.onAdPlayEnd,
+  });
+}

+ 62 - 0
lib/src/utils/flutter_ad_event_listener_method_handler.dart

@@ -0,0 +1,62 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_ad/src/constants/view_type.dart';
+import 'package:flutter_ad/src/listener/on_ad_event_listener.dart';
+import '../../flutter_ad.dart';
+import '../constants/flutter_method.dart';
+
+class FlutterAdEventListenerMethodHandler {
+  final String tag = 'FlutterAdEventListenerMethodHandler';
+  late final MethodChannel _eventChannel;
+
+  OnAdEventCallback? _adEventCallback;
+
+  FlutterAdEventListenerMethodHandler._() {
+    // debugPrint("$tag:constructor");
+    _eventChannel = const MethodChannel(ChannelName.adEvent);
+    _eventChannel.setMethodCallHandler(_platformCallHandler);
+  }
+
+  void setAdEventCallback(OnAdEventCallback callback) {
+    _adEventCallback = callback;
+  }
+
+  Future<dynamic> _platformCallHandler(MethodCall call) async {
+    String? adUnionType = call.arguments[AdEventParams.adUnionType];
+    String? adPlacementId = call.arguments[AdEventParams.adPlacementId];
+    String? adSourceId = call.arguments[AdEventParams.adSourceId];
+    String? adType = call.arguments[AdEventParams.adType];
+    String? adnType = call.arguments[AdEventParams.adnType];
+    String? ecpm = call.arguments[AdEventParams.ecpm];
+    double? ecpmDouble = ecpm != null ? double.parse(ecpm) : null;
+    int? duration = call.arguments[AdEventParams.duration];
+    bool? isPlayOver = call.arguments[AdEventParams.isPlayOver];
+    // debugPrint(
+    //     "$tag:method= ${call.method}, adUnionType= $adUnionType, adPlacementId= $adPlacementId, adSourceId= $adSourceId, adType= $adType, adnType= $adnType , ecpm= $ecpm,ecpmDouble=$ecpmDouble, duration= $duration, isPlayOver= $isPlayOver");
+    switch (call.method) {
+      case FlutterAdMethod.onAdLoadEvent:
+        _adEventCallback?.onAdLoad
+            .call(adUnionType, adPlacementId, adSourceId, adType, adnType);
+        break;
+      case FlutterAdMethod.onAdShowEvent:
+        _adEventCallback?.onAdShow.call(adUnionType, adPlacementId, adSourceId,
+            adType, adnType, ecpmDouble);
+        break;
+      case FlutterAdMethod.onAdClickEvent:
+        _adEventCallback?.onAdClick.call(adUnionType, adPlacementId, adSourceId,
+            adType, adnType, ecpmDouble);
+        break;
+      case FlutterAdMethod.onAdPlayStartEvent:
+        _adEventCallback?.onAdPlayStart.call(adUnionType, adPlacementId,
+            adSourceId, adType, adnType, ecpmDouble);
+        break;
+      case FlutterAdMethod.onAdPlayEndEvent:
+        _adEventCallback?.onAdPlayEnd.call(adUnionType, adPlacementId,
+            adSourceId, adType, adnType, ecpmDouble, duration, isPlayOver);
+        break;
+    }
+  }
+}
+
+final flutterAdEventListenerMethodHandler =
+    FlutterAdEventListenerMethodHandler._();

+ 2 - 2
lib/src/utils/flutter_ad_listener_method_channel_helper.dart

@@ -4,8 +4,8 @@ import 'package:flutter_ad/src/constants/flutter_method.dart';
 import 'package:flutter_ad/src/listener/atmob_ad_listener.dart';
 import 'package:flutter_ad/src/listener/reward_video_ad_listener.dart';
 
-class FlutterAdListenerMethodChannelHelper {
-  FlutterAdListenerMethodChannelHelper._();
+class FlutterAdListenerMethodHandler {
+  FlutterAdListenerMethodHandler._();
 
   static MethodChannel? _methodChannel;
 

+ 1 - 1
lib/src/widget/flutter_banner_ad_view.dart

@@ -24,7 +24,7 @@ class FlutterBannerAdView extends StatefulWidget {
 class _FlutterSplashAdViewState extends State<FlutterBannerAdView>
     with AutomaticKeepAliveClientMixin<FlutterBannerAdView> {
   MethodChannel? _channel;
-  final String viewType = ChannelViewType.bannerViewType;
+  final String viewType = ChannelName.bannerViewType;
 
   bool _isShowAd = true;
   double _height = 0.5;

+ 1 - 1
lib/src/widget/flutter_native_ad_view.dart

@@ -25,7 +25,7 @@ class FlutterNativeAdView extends StatefulWidget {
 class _FlutterSplashAdViewState extends State<FlutterNativeAdView>
     with AutomaticKeepAliveClientMixin<FlutterNativeAdView> {
   MethodChannel? _channel;
-  final String viewType = ChannelViewType.nativeViewType;
+  final String viewType = ChannelName.nativeViewType;
 
   bool _isShowAd = true;
   double _height = 0.5;

+ 1 - 1
lib/src/widget/flutter_splash_ad_view.dart

@@ -25,7 +25,7 @@ class FlutterSplashAdView extends StatefulWidget {
 
 class _FlutterSplashAdViewState extends State<FlutterSplashAdView> {
   MethodChannel? _channel;
-  final String viewType = ChannelViewType.splashViewType;
+  final String viewType = ChannelName.splashViewType;
 
   bool _isShowAd = true;