HarmonyOS鸿蒙Next中Flutter开发接入鲸鸿动能-激励广告
HarmonyOS鸿蒙Next中Flutter开发接入鲸鸿动能-激励广告
Flutter鸿蒙开发接入鲸鸿动能 - 激励广告
在本文中,我们将讲解如何在Flutter应用中接入鸿蒙的鲸鸿动能广告系统,重点介绍如何调用激励广告。如果您对Flutter与原生ArkTS交互还不了解,请先阅读:Flutter与原生ArkTS交互实现。
激励广告仅做基础本地验证。如需服务器端验证,请根据自身需求编写后端代码。
实现步骤
1. 编写原生端代码
获取OAID
在之前的接入开屏广告文章中,我们已经讲解了获取OAID的方法,可以复用相关代码。
请求激励广告
以下是请求激励广告的代码实现:
function requestIncentiveAdvertising(adLoader: advertising.AdLoader,context: common.UIAbilityContext,oaid:string,result:MethodResult): void {
const adRequestParam: advertising.AdRequestParams = {
// 广告类型:7激励广告
adType: 7,
// 'testx9dtjwj8hp'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
adId: 'testx9dtjwj8hp',
oaid: oaid
};
const adOption: advertising.AdOptions = {
// 设置是否请求非个性化广告
nonPersonalizedAd: 0,
// 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
allowMobileTraffic: 1,
// 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
tagForChildProtection: -1,
// 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
tagForUnderAgeOfPromise: -1,
// 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
adContentClassification: 'A'
};
const adLoaderListener: advertising.AdLoadListener = {
onAdLoadFailure: (errorCode: number, errorMsg: string) => {
hilog.error(0x0000, 'testTag', '%{public}s',
`Failed to request ad, message: ${errorMsg}, error code: ${errorCode}`);
result.success("error:"+errorCode+" - "+errorMsg)
},
onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
hilog.info(0x0000, 'testTag', '%{public}s', `Succeeded in requesting ad`);
showAd(context,ads,result)
},
};
adLoader.loadAd(adRequestParam, adOption, adLoaderListener);
}
根据需要自行调整配置
展示激励广告
function showAd(context: common.UIAbilityContext,ads:Array<advertising.Advertisement>,result:MethodResult) {
new RewardAdStatusHandler().registerPPSReceiver(result)
let load: advertising.AdLoader = new advertising.AdLoader(context);
const displayOptions: advertising.AdDisplayOptions = {
// 激励广告视频播放是否静音
mute: true
};
advertising.showAd(ads[0], displayOptions, context);
}
2. 创建事件Handler
为了验证激励广告是否完整观看,需要创建一个Handler
对事件进行订阅。
import { commonEventManager, BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { MethodResult } from '@ohos/flutter_ohos';
const KEY_REWARD_DATA = "reward_ad_data";
const KEY_REWARD_STATUS = "reward_ad_status";
export class RewardAdStatusHandler {
// 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
private subscriber: commonEventManager.CommonEventSubscriber | null = null;
// 订阅方法,需要在每次展示广告前调用
public registerPPSReceiver(result:MethodResult): void {
if (this.subscriber) {
this.unRegisterPPSReceiver();
}
// 订阅者信息
const subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
events: ['com.huawei.hms.pps.action.PPS_REWARD_STATUS_CHANGED'],
// publisherBundleName被设置为"com.huawei.hms.adsservice",这意味着只有来自该包名的事件才会被订阅者接受和处理。
// 如果没有明确声明publisherBundleName,那么订阅者可能会收到来自其它包名的伪造事件,从而导致安全性问题或误导。
publisherBundleName: 'com.huawei.hms.adsservice'
};
// 创建订阅者回调
commonEventManager.createSubscriber(subscribeInfo, (err: BusinessError, commonEventSubscriber:
commonEventManager.CommonEventSubscriber) => {
if (err) {
hilog.error(0x0000, 'testTag', '%{public}s',
`createSubscriber error, code: ${err.code}, message: ${err.message}`);
return;
}
hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in creating subscriber');
this.subscriber = commonEventSubscriber;
// 订阅公共事件回调
if (!this.subscriber) {
hilog.warn(0x0000, 'testTag', '%{public}s', 'Need create subscriber');
return;
}
commonEventManager.subscribe(this.subscriber, (err: BusinessError, commonEventSubscriber:
commonEventManager.CommonEventData) => {
if (err) {
hilog.error(0x0000, 'testTag', '%{public}s', `Subscribe error, code: ${err.code}, message: ${err.message}`);
result.success("error")
} else {
hilog.info(0x0000, 'testTag', '%{public}s', 'Subscribe data');
const status: string = commonEventSubscriber?.parameters?.[KEY_REWARD_STATUS];
switch (status) {
case AdStatus.AD_OPEN:
hilog.info(0x0000, 'testTag', '%{public}s', 'onAdOpen');
break;
case AdStatus.AD_CLICKED:
hilog.info(0x0000, 'testTag', '%{public}s', 'onAdClick');
break;
case AdStatus.AD_CLOSED:
hilog.info(0x0000, 'testTag', '%{public}s', 'onAdClose');
result.success(AdStatus.AD_CLOSED)
this.unRegisterPPSReceiver();
break;
case AdStatus.AD_REWARDED:
const rewardData: Record<string, string | number> = commonEventSubscriber?.parameters?.[KEY_REWARD_DATA];
const rewardType: string = rewardData?.rewardType as string;
const rewardAmount: number = rewardData?.rewardAmount as number;
hilog.info(0x0000, 'testTag', '%{public}s',
`onAdReward, rewardType: ${rewardType}, rewardAmount: ${rewardAmount}`);
this.unRegisterPPSReceiver();
result.success(AdStatus.AD_REWARDED)
break;
case AdStatus.AD_VIDEO_START:
hilog.info(0x0000, 'testTag', '%{public}s', 'onAdVideoStart');
break;
case AdStatus.AD_COMPLETED:
hilog.info(0x0000, 'testTag', '%{public}s', 'onAdCompleted');
break;
default:
break;
}
}
});
});
}
// 取消订阅
public unRegisterPPSReceiver(): void {
commonEventManager.unsubscribe(this.subscriber, (err: BusinessError) => {
if (err) {
hilog.error(0x0000, 'testTag', '%{public}s', `Unsubscribe error, code: ${err.code}, message: ${err.message}`);
} else {
hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in unsubscribing');
this.subscriber = null;
}
});
}
}
enum AdStatus {
AD_OPEN = 'onAdOpen',
AD_CLICKED = 'onAdClick',
AD_CLOSED = 'onAdClose',
AD_REWARDED = 'onAdReward',
AD_VIDEO_START = 'onVideoPlayBegin',
AD_COMPLETED = 'onVideoPlayEnd'
}
我在此处将MethodResult进行了传入,并只在AD_CLOSED和AD_REWARDED上做了响应。因为如果激励视频的奖励时间达标,result只能返回一次信息,AD_REWARDED一定先于AD_CLOSED完成返回响应,否则就是用户提前关闭了激励视频。 也可以根据自己的需要,在其他事件上添加处理
3. 展示开屏广告
添加MethodChannelHandler
if(call.method=="showIncentiveAdvertising"){
let load: advertising.AdLoader = new advertising.AdLoader(this.context);
requestIncentiveAdvertising(load,this.context,oaid,result);
}
flutter调用激励广告
static Future<int> showRewardAd() async {
try {
final result = await platform.invokeMethod('showIncentiveAdvertising');
if (result.toString().contains('onAdReward')) {
return 1;
} else if (result.toString().contains('error')) {
return -1;
}
return 0;
} on PlatformException catch (e) {
print("Failed to show reward ad: '${e.message}'.");
return 0;
}
}
调用时,await
会阻塞Flutter端后续代码。如果广告请求失败,将返回-1
,开发者可提示用户“暂时没有广告可看”。
如果广告正常展示,用户完整观看广告会返回1
,此时即可执行奖励逻辑;若用户提前关闭广告,将返回0
。
至此,激励广告接入流程完成。开发者可根据业务需求进一步优化相关逻辑。
更多关于HarmonyOS鸿蒙Next中Flutter开发接入鲸鸿动能-激励广告的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在HarmonyOS鸿蒙Next中,Flutter开发接入鲸鸿动能激励广告的步骤如下:
-
环境准备:确保开发环境已安装Flutter SDK,并配置好HarmonyOS开发环境。
-
集成鲸鸿动能SDK:在Flutter项目的
pubspec.yaml
文件中添加鲸鸿动能SDK依赖。例如:dependencies: huawei_ads: ^x.x.x
然后运行
flutter pub get
安装依赖。 -
初始化SDK:在Flutter应用的
main.dart
文件中初始化鲸鸿动能SDK。例如:import 'package:huawei_ads/huawei_ads.dart'; void main() { Ads.instance.init(); runApp(MyApp()); }
-
创建激励广告实例:在需要展示激励广告的页面中,创建激励广告实例。例如:
RewardedAd rewardedAd = RewardedAd( adUnitId: 'your_ad_unit_id', listener: AdListener( onAdLoaded: () { // 广告加载成功 }, onAdFailedToLoad: (int errorCode) { // 广告加载失败 }, onAdOpened: () { // 广告打开 }, onAdClosed: () { // 广告关闭 }, onRewarded: (RewardItem reward) { // 用户获得奖励 }, ), );
-
加载和展示广告:调用
load
方法加载广告,并在合适的时机调用show
方法展示广告。例如:rewardedAd.load(); rewardedAd.show();
-
处理广告生命周期:在页面销毁时,释放广告资源。例如:
[@override](/user/override) void dispose() { rewardedAd.dispose(); super.dispose(); }
通过以上步骤,可以在HarmonyOS鸿蒙Next的Flutter应用中成功接入鲸鸿动能激励广告。
更多关于HarmonyOS鸿蒙Next中Flutter开发接入鲸鸿动能-激励广告的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在HarmonyOS鸿蒙Next中接入鲸鸿动能的激励广告,首先需要在Flutter项目中集成鲸鸿动能的SDK。通过pubspec.yaml
文件添加依赖,然后在代码中初始化SDK并配置广告位ID。使用RewardedAd
类加载和展示激励广告,监听广告事件如加载完成、展示成功和用户奖励等。确保在广告展示后处理用户奖励逻辑,以提升用户体验。