# flutter_unionad
**Repository Path**: ChengFengPoLang2008/flutter_unionad
## Basic Information
- **Project Name**: flutter_unionad
- **Description**: 字节跳动 穿山甲广告SDK flutter版本插件
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 7
- **Created**: 2024-09-12
- **Last Updated**: 2024-09-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 字节跳动穿山甲广告 Flutter版本
## 简介
flutter_unioad是一款集成了穿山甲Android和iOSSDK的Flutter插件,方便直接调用穿山甲SDK方法开发,已支持null safety,[体验demo](https://www.pgyer.com/j7YB),可通过[GTAds](https://github.com/gstory0404/GTAds)实现多个广告平台接入、统一管理。
## 官方文档
* [Android](https://partner.oceanengine.com/union/media/union/download/detail?id=4&osType=android)
* [IOS](https://partner.oceanengine.com/union/media/union/download/detail?id=16&osType=ios)
## 版本更新
[更新日志](https://github.com/gstory0404/flutter_unionad/blob/master/CHANGELOG.md)
## 注意事项
⚠️ 版本更新必看,不然可能广告加载可能会出现异常
[插件更新调整](https://github.com/gstory0404/flutter_unionad/blob/master/notice.md)
## 本地开发环境
```
[✓] Flutter (Channel stable, 3.3.6, on macOS 13.0.1 22A400 darwin-x64, locale zh-Hans-CN)
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 14.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.3)
[✓] IntelliJ IDEA Ultimate Edition (version 2022.3)
[✓] VS Code (version 1.73.1)
[✓] Connected device (4 available)
[✓] HTTP Host Availability
```
## 集成步骤
#### 1、pubspec.yaml
```Dart
flutter_unionad: ^1.3.18
//测试版本
flutter_unionad:
git:
url: https://github.com/gstory0404/flutter_unionad.git
ref: dev
```
引入
```Dart
import 'package:flutter_unionad/flutter_unionad.dart';
```
#### 2、Android
SDK([5.0.0.1](https://www.csjplatform.com/union/media/union/download/log?id=4))已配置插件中无需额外配置,只需要在android目录中AndroidManifest.xml配置
```Java
```
#### 3、IOS
SDK([5.0.0.0](https://www.csjplatform.com/union/media/union/download/log?id=16)))已配置插件中,其余根据SDK文档配置,因为使用PlatformView,在Info.plist加入
```
io.flutter.embedded_views_preview
```
## 使用
#### 1、SDK初始化
⚠️如果要修改个性化,重新调用初始化方法
```Dart
await FlutterUnionad.register(
//穿山甲广告 Android appid 必填
androidAppId: "5098580",
//穿山甲广告 ios appid 必填
iosAppId: "5098580",
//使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView 选填
useTextureView: true,
//appname 必填
appName: "unionad_test",
//是否允许sdk展示通知栏提示 选填
allowShowNotify: true,
//是否在锁屏场景支持展示广告落地页 选填
allowShowPageWhenScreenLock: true,
//是否显示debug日志
debug: true,
//是否支持多进程,true支持 选填
supportMultiProcess: true,
//是否开启个性化推荐 选填 默认开启
personalise: FlutterUnionadPersonalise.close,
//主题模式 默认FlutterUnionAdTheme.DAY,修改后需重新调用初始化
themeStatus: FlutterUnionAdTheme.DAY,
//允许直接下载的网络状态集合 选填
directDownloadNetworkType: [
FlutterUnionadNetCode.NETWORK_STATE_2G,
FlutterUnionadNetCode.NETWORK_STATE_3G,
FlutterUnionadNetCode.NETWORK_STATE_4G,
FlutterUnionadNetCode.NETWORK_STATE_WIFI
]
);
```
#### 2、获取SDK版本
```Dart
await FlutterUnionad.getSDKVersion();
```
#### 3、请求权限
```Dart
FlutterUnionad.requestPermissionIfNecessary(
callBack: FlutterUnionadPermissionCallBack(
notDetermined: () {
print("权限未确定");
},
restricted: () {
print("权限限制");
},
denied: () {
print("权限拒绝");
},
authorized: () {
print("权限同意");
},
),
);
```
Android获取定位、照片权限,只返回成功
Android相关权限为非必须权限,可选择在AndroidManifest.xml中声明
IOS 版本14及以上获取ATT权限,根据返回结果具体操作业务逻辑
#### 4、开屏广告
```Dart
FlutterUnionad.splashAdView(
//是否使用个性化模版 设定widget宽高
mIsExpress: true,
//android 开屏广告广告id 必填
androidCodeId: "887367774",
//ios 开屏广告广告id 必填
iosCodeId: "887367774",
//是否支持 DeepLink 选填
supportDeepLink: true,
// 期望view 宽度 dp 选填 mIsExpress=true必填
expressViewWidth: 750,
//期望view高度 dp 选填 mIsExpress=true必填
expressViewHeight: 800,
//控制下载APP前是否弹出二次确认弹窗
downloadType: FlutterUnionadDownLoadType.DOWNLOAD_TYPE_POPUP,
//用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,
adLoadType: FlutterUnionadLoadType.LOAD,
//是否影藏跳过按钮(当影藏的时候显示自定义跳过按钮) 默认显示
hideSkip: false,
callBack: FlutterUnionadSplashCallBack(
onShow: () {
print("开屏广告显示");
},
onClick: () {
print("开屏广告点击");
Navigator.pop(context);
},
onFail: (error) {
print("开屏广告失败 $error");
},
onFinish: () {
print("开屏广告倒计时结束");
Navigator.pop(context);
},
onSkip: () {
print("开屏广告跳过");
Navigator.pop(context);
},
onTimeOut: () {
print("开屏广告超时");
},
),
),
```
#### 5、banner广告
```Dart
FlutterUnionad.bannerAdView(
//andrrid banner广告id 必填
androidCodeId: "945410197",
//ios banner广告id 必填
iosCodeId: "945410197",
//是否使用个性化模版
mIsExpress: true,
//是否支持 DeepLink 选填
supportDeepLink: true,
//一次请求广告数量 大于1小于3 必填
expressAdNum: 3,
//轮播间隔事件 30-120秒 选填
expressTime: 30,
// 期望view 宽度 dp 必填
expressViewWidth: 600.5,
//期望view高度 dp 必填
expressViewHeight: 120.5,
//控制下载APP前是否弹出二次确认弹窗
downloadType: FlutterUnionadDownLoadType.DOWNLOAD_TYPE_POPUP,
//用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,
adLoadType: FlutterUnionadLoadType.LOAD,
//是否启用点击 仅ios生效 默认启用
isUserInteractionEnabled: true,
//广告事件回调 选填
callBack: FlutterUnionadBannerCallBack(
onShow: () {
print("banner广告加载完成");
},
onDislike: (message){
print("banner不感兴趣 $message");
},
onFail: (error){
print("banner广告加载失败 $error");
},
onClick: (){
print("banner广告点击");
}
),
),
```
#### 6、信息流广告
```dart
//个性化模板信息流广告
FlutterUnionad.nativeAdView(
//android 信息流广告id 必填
androidCodeId: "945417699",
//ios banner广告id 必填
iosCodeId: "945417699",
//是否支持 DeepLink 选填
supportDeepLink: true,
// 期望view 宽度 dp 必填
expressViewWidth: 375.5,
//期望view高度 dp 必填
expressViewHeight: 0,
//一次请求广告数量 大于1小于3 必填
expressNum: 2,
mIsExpress: true,
//控制下载APP前是否弹出二次确认弹窗
downloadType: FlutterUnionadDownLoadType.DOWNLOAD_TYPE_POPUP,
//用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,
adLoadType: FlutterUnionadLoadType.LOAD,
callBack: FlutterUnionadNativeCallBack(
onShow: () {
print("信息流广告显示");
},
onFail: (error) {
print("信息流广告失败 $error");
},
onDislike: (message) {
print("信息流广告不感兴趣 $message");
},
onClick: () {
print("信息流广告点击");
},
),
),
```
#### 8、激励视频广告
预加载激励视频广告
```Dart
FlutterUnionad.loadRewardVideoAd(
mIsExpress: true,
//是否个性化 选填
androidCodeId: "945418088",
//Android 激励视频广告id 必填
iosCodeId: "945418088",
//ios 激励视频广告id 必填
supportDeepLink: true,
//是否支持 DeepLink 选填
rewardName: "100金币",
//奖励名称 选填
rewardAmount: 100,
//奖励数量 选填
userID: "123",
// 用户id 选填
orientation: FlutterUnionadOrientation.VERTICAL,
//控制下载APP前是否弹出二次确认弹窗
downloadType: FlutterUnionadDownLoadType.DOWNLOAD_TYPE_POPUP,
//视屏方向 选填
mediaExtra: null, //扩展参数 选填
//用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,
adLoadType: FlutterUnionadLoadType.PRELOAD,
);
```
显示激励视频广告
```dart
await FlutterUnionad.showRewardVideoAd();
```
监听激励视频结果
```Dart
FlutterUnionad.FlutterUnionadStream.initAdStream(
//激励广告
flutterUnionadRewardAdCallBack: FlutterUnionadRewardAdCallBack(
onShow: (){
print("激励广告显示");
},
onClick: (){
print("激励广告点击");
},
onFail: (error){
print("激励广告失败 $error");
},
onClose: (){
print("激励广告关闭");
},
onSkip: (){
print("激励广告跳过");
},
onVerify: (rewardVerify,rewardAmount,rewardName){
print("激励广告奖励 $rewardVerify $rewardAmount $rewardName");
},
onReady: () async{
print("激励广告预加载准备就绪");
//显示激励广告
await FlutterUnionad.showRewardVideoAd();
},
onUnReady: (){
print("激励广告预加载未准备就绪");
},
onRewardArrived: (rewardVerify, rewardType, rewardAmount, rewardName,
errorCode, error, propose) {
print(
"阶段激励广告奖励 验证结果=$rewardVerify 奖励类型=$rewardType 奖励=$rewardAmount"
"奖励名称$rewardName 错误码=$errorCode 错误$error 建议奖励$propose");
}),
),
);
```
#### 9、draw视频广告
```Dart
FlutterUnionad.drawFeedAdView(
androidCodeId: "945426252",
// Android draw视屏广告id 必填
iosCodeId: "945426252",
//ios draw视屏广告id 必填
supportDeepLink: true,
//是否支持 DeepLink 选填
expressViewWidth: 600.5,
// 期望view 宽度 dp 必填
expressViewHeight: 800.5,
//控制下载APP前是否弹出二次确认弹窗
downloadType: FlutterUnionadDownLoadType.DOWNLOAD_TYPE_POPUP,
//用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,
adLoadType: FlutterUnionadLoadType.LOAD,
//期望view高度 dp 必填
callBack: FlutterUnionadDrawFeedCallBack(
onShow: () {
print("draw广告显示");
},
onFail: (error) {
print("draw广告加载失败 $error");
},
onClick: () {
print("draw广告点击");
},
onDislike: (message) {
print("draw点击不喜欢 $message");
},
onVideoPlay: () {
print("draw视频播放");
},
onVideoPause: () {
print("draw视频暂停");
},
onVideoStop: () {
print("draw视频结束");
}),
),
```
#### 10、~~全屏视频广告~~
不推荐使用,请使用新模版渲染插屏广告
```Dart
FlutterUnionad.fullScreenVideoAd(
androidCodeId: "945491318", //android 全屏广告id 必填
iosCodeId: "945491318", //ios 全屏广告id 必填
supportDeepLink: true, //是否支持 DeepLink 选填
orientation: FlutterUnionadOrientation.VERTICAL, //视屏方向 选填
//控制下载APP前是否弹出二次确认弹窗
downloadType: FlutterUnionadDownLoadType.DOWNLOAD_TYPE_POPUP,
);
```
#### 11、新模版渲染插屏广告 分为全屏和插屏
预加载新模版渲染插屏广告
```dart
FlutterUnionad.loadFullScreenVideoAdInteraction(
androidCodeId: "946201351", //android 全屏广告id 必填
iosCodeId: "946201351", //ios 全屏广告id 必填
supportDeepLink: true, //是否支持 DeepLink 选填
orientation: FlutterUnionadOrientation.VERTICAL, //视屏方向 选填
//控制下载APP前是否弹出二次确认弹窗
downloadType: FlutterUnionadDownLoadType.DOWNLOAD_TYPE_POPUP,
//用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,
adLoadType: FlutterUnionadLoadType.PRELOAD,
);
```
显示新模版渲染插屏广告
```dart
await FlutterUnionad.showFullScreenVideoAdInteraction();
```
新模版渲染插屏广告结果监听
```dart
FlutterUnionad.FlutterUnionadStream.initAdStream(
// 新模板渲染插屏广告回调
flutterUnionadNewInteractionCallBack: FlutterUnionadNewInteractionCallBack(
onShow: () {
print("新模板渲染插屏广告显示");
},
onSkip: () {
print("新模板渲染插屏广告跳过");
},
onClick: () {
print("新模板渲染插屏广告点击");
},
onFinish: () {
print("新模板渲染插屏广告结束");
},
onFail: (error) {
print("新模板渲染插屏广告错误 $error");
},
onClose: () {
print("新模板渲染插屏广告关闭");
},
onReady: () async{
print("新模板渲染插屏广告预加载准备就绪");
//显示新模板渲染插屏
await FlutterUnionad.showFullScreenVideoAdInteraction();
},
onUnReady: (){
print("新模板渲染插屏广告预加载未准备就绪");
},
),
);
```
#### 12、Android隐私权限控制
注:必须在FlutterUnionad.register初始化前使用才生效
```dart
if (Platform.isAndroid) {
await FlutterUnionad.andridPrivacy(
isCanUseLocation: false, //是否允许SDK主动使用地理位置信息 true可以获取,false禁止获取。默认为true
lat: 1.0,//当isCanUseLocation=false时,可传入地理位置信息,穿山甲sdk使用您传入的地理位置信息lat
lon: 1.0,//当isCanUseLocation=false时,可传入地理位置信息,穿山甲sdk使用您传入的地理位置信息lon
isCanUsePhoneState: false,//是否允许SDK主动使用手机硬件参数,如:imei
imei: "123",//当isCanUsePhoneState=false时,可传入imei信息,穿山甲sdk使用您传入的imei信息
isCanUseWifiState: false,//是否允许SDK主动使用ACCESS_WIFI_STATE权限
isCanUseWriteExternal: false,//是否允许SDK主动使用WRITE_EXTERNAL_STORAGE权限
oaid: "111",//开发者可以传入oaid
alist: false,//是否允许SDK主动获取设备上应用安装列表的采集权限
);
}
```
#### 13、日间/夜间模式
获取主题模式
```dart
// 0正常模式 1夜间模式
_themeStatus = await FlutterUnionad.getThemeStatus();
```
切换主题模式
修改初始化中themeStatus参数,重新调用初始化
## 常见问题
[常见问题](https://github.com/gstory0404/flutter_unionad/blob/master/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98.md)
## 插件链接
|插件|地址|
|:----|:----|
|字节-穿山甲广告插件|[flutter_unionad](https://github.com/gstory0404/flutter_unionad)|
|腾讯-优量汇广告插件|[flutter_tencentad](https://github.com/gstory0404/flutter_tencentad)|
|百度-百青藤广告插件|[baiduad](https://github.com/gstory0404/baiduad)|
|字节-Gromore聚合广告|[gromore](https://github.com/gstory0404/gromore)|
|Sigmob广告|[sigmobad](https://github.com/gstory0404/sigmobad)|
|聚合广告插件(迁移至GTAds)|[flutter_universalad](https://github.com/gstory0404/flutter_universalad)|
|GTAds聚合广告|[GTAds](https://github.com/gstory0404/GTAds)|
|字节穿山甲内容合作插件|[flutter_pangrowth](https://github.com/gstory0404/flutter_pangrowth)|
|文档预览插件|[file_preview](https://github.com/gstory0404/file_preview)|
|滤镜|[gpu_image](https://github.com/gstory0404/gpu_image)|
### 开源不易,觉得有用的话可以请作者喝杯奶茶🧋
## 联系方式
* Email: gstory0404@gmail.com
* blog:https://www.gstory.cn/
* QQ群:
* [Telegram](https://t.me/flutterex)