ToneSnap_FSX_Flutter/lib/ads/app_open_ad_manager.dart
fengshengxiong c7cbdb04be 个人曲库
2024-07-14 16:13:46 +08:00

127 lines
3.9 KiB
Dart

// Author: fengshengxiong
// Date: 2024/6/25
// Description: 开屏广告
import 'dart:io' show Platform;
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:tone_snap/utils/log_util.dart';
class AppOpenAdManager {
AppOpenAdManager._();
static final AppOpenAdManager _instance = AppOpenAdManager._();
factory AppOpenAdManager() => _instance;
/// 加载和显示广告之间允许的最长持续时间
final Duration maxCacheDuration = const Duration(hours: 4);
/// 跟踪加载时间,这样我们就不会显示过期的广告
DateTime? _appOpenLoadTime;
AppOpenAd? _appOpenAd;
bool _isShowingAd = false;
/// 开屏广告单元id
final adUnitId = Platform.isAndroid
? (kDebugMode ? 'ca-app-pub-3940256099942544/9257395921' : '')
: (kDebugMode ? 'ca-app-pub-3940256099942544/5575463023' : 'ca-app-pub-5684307632319406/2523581084');
/// 加载广告
void loadAd() async {
final List<ConnectivityResult> connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult.contains(ConnectivityResult.none)) {
return;
}
if (isAdAvailable) {
return;
}
AppOpenAd.load(
adUnitId: adUnitId,
request: const AdRequest(),
adLoadCallback: AppOpenAdLoadCallback(
onAdLoaded: (ad) {
LogUtil.d('开屏广告加载完成');
_appOpenAd = ad;
_appOpenLoadTime = DateTime.now();
},
onAdFailedToLoad: (error) {
LogUtil.e('开屏广告加载失败: $error');
// Handle the error.
},
),
);
}
/// 是否可以播放广告
bool get isAdAvailable {
return _appOpenAd != null;
}
/// 显示广告(如果存在且尚未显示)
/// 如果先前缓存的广告已过期,则只加载并缓存新广告
void showAdIfAvailable({Function()? onTap}) {
if (!isAdAvailable) {
LogUtil.d('尝试在可用之前显示广告');
loadAd();
if(onTap != null) onTap();
return;
}
if (_isShowingAd) {
LogUtil.d('尝试在已显示广告的情况下显示广告');
if(onTap != null) onTap();
return;
}
if (DateTime.now().subtract(maxCacheDuration).isAfter(_appOpenLoadTime!)) {
LogUtil.d('超过了最大缓存持续时间。正在加载另一个广告');
_appOpenAd!.dispose();
_appOpenAd = null;
loadAd();
if(onTap != null) onTap();
return;
}
// 设置 fullScreenContentCallback 并显示广告
_appOpenAd!.fullScreenContentCallback = FullScreenContentCallback(
// 暂停应用程序中的活动或记录广告展示的时间
onAdShowedFullScreenContent: (ad) {
LogUtil.d('$ad onAdShowedFullScreenContent');
// 隐藏状态栏
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: <SystemUiOverlay>[]);
_isShowingAd = true;
},
// 更适合用于跟踪广告展示的次数和效果,以及执行与广告展示相关的操作
onAdImpression: (ad) {
LogUtil.d('$ad onAdImpression');
},
onAdFailedToShowFullScreenContent: (ad, error) {
LogUtil.d('$ad onAdFailedToShowFullScreenContent: $error');
_isShowingAd = false;
ad.dispose();
_appOpenAd = null;
if(onTap != null) onTap();
},
onAdDismissedFullScreenContent: (ad) {
LogUtil.d('$ad onAdDismissedFullScreenContent');
// 显示状态栏(用户关闭广告后)
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values);
_isShowingAd = false;
ad.dispose();
_appOpenAd = null;
loadAd();
if(onTap != null) onTap();
},
onAdClicked: (ad) {
LogUtil.d('$ad onAdClicked');
},
);
_appOpenAd!.show();
}
}