{"id":19777394,"url":"https://github.com/gstory0404/flutter_tencentad","last_synced_at":"2025-07-13T17:33:01.584Z","repository":{"id":50273576,"uuid":"393316310","full_name":"gstory0404/flutter_tencentad","owner":"gstory0404","description":"腾讯优量汇(广点通)广告 Flutter版本","archived":false,"fork":false,"pushed_at":"2025-06-23T07:51:54.000Z","size":23299,"stargazers_count":57,"open_issues_count":13,"forks_count":20,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-23T08:43:37.202Z","etag":null,"topics":["flutter","flutter-ads","flutter-plugin","flutter-widget"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gstory0404.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-08-06T08:48:36.000Z","updated_at":"2025-06-23T07:51:58.000Z","dependencies_parsed_at":"2025-06-23T08:29:29.402Z","dependency_job_id":"e3e20735-a85e-48fe-a177-6924248a8e7e","html_url":"https://github.com/gstory0404/flutter_tencentad","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/gstory0404/flutter_tencentad","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gstory0404%2Fflutter_tencentad","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gstory0404%2Fflutter_tencentad/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gstory0404%2Fflutter_tencentad/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gstory0404%2Fflutter_tencentad/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gstory0404","download_url":"https://codeload.github.com/gstory0404/flutter_tencentad/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gstory0404%2Fflutter_tencentad/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265178815,"owners_count":23723338,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flutter","flutter-ads","flutter-plugin","flutter-widget"],"created_at":"2024-11-12T05:24:44.457Z","updated_at":"2025-07-13T17:33:01.551Z","avatar_url":"https://github.com/gstory0404.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 腾讯优量汇(广点通)广告 Flutter版本（支持bidding）\n\n\u003cp\u003e\n\u003ca href=\"https://pub.flutter-io.cn/packages/flutter_tencentad\"\u003e\u003cimg src=https://img.shields.io/pub/v/flutter_tencentad?color=orange\u003e\u003c/a\u003e\n\u003ca href=\"https://pub.flutter-io.cn/packages/flutter_tencentad\"\u003e\u003cimg src=https://img.shields.io/pub/likes/flutter_tencentad\u003e\u003c/a\u003e\n\u003ca href=\"https://pub.flutter-io.cn/packages/flutter_tencentad\"\u003e\u003cimg src=https://img.shields.io/pub/points/flutter_tencentad\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/gstory0404/flutter_tencentad/commits\"\u003e\u003cimg src=https://img.shields.io/github/last-commit/gstory0404/flutter_tencentad\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/gstory0404/flutter_tencentad\"\u003e\u003cimg src=https://img.shields.io/github/stars/gstory0404/flutter_tencentad\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp\u003e\n\u003ca href=\"http://qm.qq.com/cgi-bin/qm/qr?_wv=1027\u0026k=VhD0AZSmzvsD3fu7CeQFkzpBQHMHANb1\u0026authKey=W7JGJ0HKklyhP1jyBvbTF2Dkw0cq4UmhVSx2zXVdIm6n48Xrto%2B7%2B1n9jbkAadyF\u0026noverify=0\u0026group_code=649574038\"\u003e\u003cimg src=https://img.shields.io/badge/flutter%E4%BA%A4%E6%B5%81%E7%BE%A4-649574038-blue\u003e\u003c/a\u003e\n\u003ca href=\"http://qm.qq.com/cgi-bin/qm/qr?_wv=1027\u0026k=9I9lyXewEsEnx0f00EOF_9hEcFmG5Bmg\u0026authKey=AJfQ8%2FhOLcoJ0p5B16EITjFav1IIs3UAerZSUsWZfa0evuklgxibHti51AYlZgI3\u0026noverify=0\u0026group_code=769626410\"\u003e\u003cimg src=https://img.shields.io/badge/flutter%E4%BA%A4%E6%B5%81%E7%BE%A42-769626410-blue\u003e\u003c/a\u003e\n\u003ca href=\"https://qm.qq.com/q/4MSgZuKimc\"\u003e\u003cimg src=https://img.shields.io/badge/flutter%E5%B9%BF%E5%91%8A%E4%BA%A4%E6%B5%81-662186116-blue\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\n## 简介\nflutter_tencentad是一款集成了腾讯优量汇广告(广点通)Android和iOS SDK的Flutter插件,方便直接调用优量汇(广点通)广告SDK方法快速开发,[体验demo](https://www.pgyer.com/j7YB)，可通过[GTAds](https://github.com/gstory0404/GTAds)实现多个广告平台接入、统一管理。\n\n\u003cimg src=\"https://github.com/gstory0404/flutter_tencentad/blob/master/images/tencentad.gif\" width=\"30%\"\u003e\n\n\n## 官方文档\n* [Android](https://developers.adnet.qq.com/doc/android/access_doc)\n* [IOS](https://developers.adnet.qq.com/doc/ios/guide)\n\n## 版本更新\n\n[更新日志](https://github.com/gstory0404/flutter_tencentad/blob/master/CHANGELOG.md)\n\n## 本地开发环境\n```\n[✓] Flutter (Channel stable, 3.16.6, on macOS 14.2.1 23C71 darwin-x64, locale zh-Hans-CN)\n[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.1)\n[✓] Xcode - develop for iOS and macOS (Xcode 15.2)\n[✓] Chrome - develop for the web\n[✓] Android Studio (version 2022.1)\n[✓] Android Studio (version 2023.1)\n[✓] IntelliJ IDEA Ultimate Edition (version 2023.3.2)\n[✓] VS Code (version 1.85.2)\n[✓] Connected device (4 available)\n[✓] Network resources\n```\n\n## 集成步骤\n#### 1、pubspec.yaml\n```Dart\nflutter_tencentad: ^latest\n```\n引入\n```Dart\nimport 'package:flutter_tencentad/flutter_tencentad.dart';\n```\n\n\u003e bidding模式下 必需要调用对应Controller 回传竞价结果\n\n#### 2、Android\n需要在android目录中AndroidManifest.xml配置\n\n⚠️插件1.1.4以后不再默认集成权限，需手动配置\n```Java\n\u003cmanifest ···\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    ···\u003e\n    \u003cuses-permission android:name=\"android.permission.INTERNET\" /\u003e\n    \u003cuses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" /\u003e\n    \u003cuses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" /\u003e\n    \u003cuses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\" /\u003e\n    \u003cuses-permission android:name=\"android.permission.READ_PHONE_STATE\" /\u003e\n    \u003cuses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" /\u003e\n    \u003cuses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" /\u003e\n  \u003capplication\n        tools:replace=\"android:label\"\u003e\n```\n\n#### 3、IOS\n\n根据SDK文档配置。因为使用PlatformView，在Info.plist加入\n```\n \u003ckey\u003eio.flutter.embedded_views_preview\u003c/key\u003e\n    \u003ctrue/\u003e\n```\n\n## 使用\n\n#### 1、SDK初始化\n```Dart\nawait FlutterTencentad.register(\n    //androidId\n    androidId: \"1200310001\",\n    //iosId\n    iosId: \"1202937154\",\n    //是否显示日志log\n    debug: true,\n    //是否显示个性化推荐广告\n    personalized: FlutterTencentadPersonalized.show,\n    //渠道id\n    channelId: FlutterTencentadChannel.other,\n    //安卓隐私设置 根绝官方文档填写\n    androidPrivacy: {\n        //false为关闭粗略地理位置获取，不设置或者设置为true为获取\n        \"cell_id\": false,\n        //优量汇SDK将不采集mac地址\n        \"mac_address\": false,\n        //false为关闭device_id获取，不设置或者设置为true为获取\n        \"device_id\": false,\n        //false为关闭android_id获取，不设置或者设置为true为获取\n        \"android_id\": false,\n        //false为关闭移动网络状态下获取IP地址，不设置或者设置为true为获取\n        \"mipaddr\":false,\n        //false为关闭WIFI状态下获取IP地址，不设置或者设置为true为获取\n        \"wipaddr\":false\n        //禁用taid获取\n        \"taid\": false,\n        //禁用oaid获取\n        \"oaid\": false\n    },\n    convOptimizelnfo: {\n        //关闭应用安装监听状态\n        \"hieib\": false\n    },\n    enableCollectAppInstallStatus: false,//安卓隐私合规 是否开启收集应用安装状态\n);\n```\n#### 2、获取SDK版本\n```Dart\nawait FlutterTencentad.getSDKVersion();\n```\n\n#### 3、开屏广告\n```Dart\nFlutterTencentAdBiddingController _bidding =\nnew FlutterTencentAdBiddingController();\nFlutterTencentad.splashAdView(\n    //android广告id\n    androidId: widget.androidId,\n    //ios广告id\n    iosId: widget.iosId,\n    ////设置开屏广告从请求到展示所花的最大时长（并不是指广告曝光时长），取值范围为[1500, 5000]ms\n    fetchDelay: 3000,\n    //下载二次确认弹窗 默认false\n    downloadConfirm: true,\n    //是否开启竞价 默认不开启\n    isBidding: widget.isBidding,\n    //竞价结果回传\n    bidding: _bidding,\n    //广告回调\n    callBack: FlutterTencentadSplashCallBack(onShow: () {\n          print(\"开屏广告显示\");\n        }, onADTick: (time) {\n          print(\"开屏广告倒计时剩余时间 $time\");\n        }, onClick: () {\n          print(\"开屏广告点击\");\n        }, onClose: () {\n          print(\"开屏广告关闭\");\n          Navigator.pop(context);\n        }, onExpose: () {\n          print(\"开屏广告曝光\");\n        }, onFail: (code, message) {\n          print(\"开屏广告失败  $code $message\");\n          Navigator.pop(context);\n        }, onECPM: (ecpmLevel, ecpm) {\n          print(\"开屏广告竞价  ecpmLevel=$ecpmLevel  ecpm=$ecpm\");\n            //规则 自己根据业务处理\n            if (ecpm \u003e 0) {\n            //竞胜出价，类型为Integer\n            //最大竞败方出价，类型为Integer\n            _bidding.biddingResult(\n            FlutterTencentBiddingResult().success(ecpm, 0));\n            } else {\n            //竞胜方出价（单位：分），类型为Integer\n            //优量汇广告竞败原因 FlutterTencentAdBiddingLossReason\n            //竞胜方渠道ID FlutterTencentAdADNID\n            _bidding.biddingResult(FlutterTencentBiddingResult().fail(\n            1000,\n            FlutterTencentAdBiddingLossReason.LOW_PRICE,\n            FlutterTencentAdADNID.othoerADN));\n            }\n        }),\n),\n```\n#### 4、banner广告\n```Dart\nFlutterTencentAdBiddingController _bidding =\nnew FlutterTencentAdBiddingController();\nFlutterTencentad.bannerAdView(\n    //android广告id\n    androidId: \"8042711873318113\",\n    //ios广告id\n    iosId: \"6062430096832369\",\n    //广告宽 单位dp\n    viewWidth: 500,\n    //广告高  单位dp   宽高比应该为6.4:1\n    viewHeight: 100,\n    //下载二次确认弹窗 默认false\n    downloadConfirm: true,\n    //是否开启竞价 默认不开启\n    isBidding: widget.isBidding,\n    //竞价结果回传\n    bidding: _bidding,\n    // 广告回调\n    callBack: FlutterTencentadBannerCallBack(\n        onShow: () {\n          print(\"Banner广告显示\");\n        },\n        onFail: (code, message) {\n          print(\"Banner广告错误 $code $message\");\n        },\n        onClose: () {\n          print(\"Banner广告关闭\");\n        },\n        onExpose: () {\n          print(\"Banner广告曝光\");\n        },\n        onClick: () {\n          print(\"Banner广告点击\");\n        }, onECPM: (ecpmLevel, ecpm) {\n            print(\"Banner广告竞价  ecpmLevel=$ecpmLevel  ecpm=$ecpm\");\n            //规则 自己根据业务处理\n            if (ecpm \u003e 0) {\n                //竞胜出价，类型为Integer\n                //最大竞败方出价，类型为Integer\n                _bidding.biddingResult(\n                FlutterTencentBiddingResult().success(ecpm, 0));\n            } else {\n                //竞胜方出价（单位：分），类型为Integer\n                //优量汇广告竞败原因 FlutterTencentAdBiddingLossReason\n                //竞胜方渠道ID FlutterTencentAdADNID\n                _bidding.biddingResult(FlutterTencentBiddingResult().fail(\n                1000,\n                FlutterTencentAdBiddingLossReason.LOW_PRICE,\n                FlutterTencentAdADNID.othoerADN));\n            }\n        },\n    ),\n),\n```\n\n#### 5、动态信息流/横幅/视频贴片广告\n⚠️ android端信息流广告曝光异常\n```dart\nFlutterTencentAdBiddingController _bidding =\nnew FlutterTencentAdBiddingController();\nFlutterTencentad.expressAdView(\n              //android广告id\n              androidId: \"4033498034524284\",\n              //ios广告id\n              iosId: \"4033278955532222\",\n              viewWidth: 400,\n              viewHeight: 300,\n              //下载二次确认弹窗 默认false\n              downloadConfirm: true,\n              //是否开启竞价模式\n              isBidding: true,\n              bidding: _bidding,\n              //回调事件\n              callBack: FlutterTencentadExpressCallBack(\n                  onShow: () {\n                    print(\"动态信息流广告显示\");\n                  },\n                  onFail: (code, message) {\n                    print(\"动态信息流广告错误 $code $message\");\n                  },\n                  onClose: () {\n                    print(\"动态信息流广告关闭\");\n                  },\n                  onExpose: () {\n                    print(\"动态信息流广告曝光\");\n                  },\n                  onClick: () {\n                    print(\"动态信息流广告点击\");\n                  },\n                  onECPM: (ecpmLevel, ecpm) {\n                    print(\"动态信息流广告竞价  ecpmLevel=$ecpmLevel  ecpm=$ecpm\");\n                    //规则 自己根据业务处理\n                    if (ecpm \u003e 0) {\n                      //竞胜出价，类型为Integer\n                      //最大竞败方出价，类型为Integer\n                      _bidding.biddingResult(\n                          FlutterTencentBiddingResult().success(ecpm, 0));\n                    } else {\n                      //竞胜方出价（单位：分），类型为Integer\n                      //优量汇广告竞败原因 FlutterTencentAdBiddingLossReason\n                      //竞胜方渠道ID FlutterTencentAdADNID\n                      _bidding.biddingResult(FlutterTencentBiddingResult().fail(\n                          1000,\n                          FlutterTencentAdBiddingLossReason.LOW_PRICE,\n                          FlutterTencentAdADNID.othoerADN));\n                    }\n                  }\n              ),\n            ),\n```\n\n#### 6、激励视频广告\n预加载激励视频广告\n```Dart\nawait FlutterTencentad.loadRewardVideoAd(\n    //android广告id\n    androidId: \"5042816813706194\",\n    //ios广告id\n    iosId: \"8062535056034159\",\n    //用户id\n    userID: \"123\",\n    //奖励\n    rewardName: \"100金币\",\n    //奖励数\n    rewardAmount: 100,\n    //扩展参数 服务器回调使用\n    customData: \"\"\n    //下载二次确认弹窗 默认false\n    downloadConfirm: true,\n    //是否开启竞价\n    isBidding: true,\n);\n```\n显示激励视频广告\n```dart\n  await FlutterTencentad.showRewardVideoAd();\n```\n监听激励视频结果\n\u003e 当为竞价时触发onECPM，否则触发onReady\n```Dart\n FlutterTencentAdStream.initAdStream(\n      //激励广告\n    flutterTencentadRewardCallBack: FlutterTencentadRewardCallBack(\n        onShow: () {\n          print(\"激励广告显示\");\n        },\n        onClick: () {\n          print(\"激励广告点击\");\n        },\n        onFail: (code, message) {\n          print(\"激励广告失败 $code $message\");\n        },\n        onClose: () {\n          print(\"激励广告关闭\");\n        },\n        onReady: () async {\n          print(\"激励广告预加载准备就绪\");\n          await FlutterTencentad.showRewardVideoAd();\n        },\n        onUnReady: () {\n          print(\"激励广告预加载未准备就绪\");\n        },\n         onVerify: (transId,rewardName,rewardAmount) {\n          print(\"激励广告奖励  $transId   $rewardName   $rewardAmount\");\n        },\n        onFinish: (){\n          print(\"激励广告完成\");\n        },\n        onECPM: (ecpmLevel, ecpm) async {\n            print(\"激励广告竞价  ecpmLevel=$ecpmLevel  ecpm=$ecpm\");\n            //规则 自己根据业务处理\n            if (ecpm \u003e 0) {\n                //竞胜出价，类型为Integer\n                //最大竞败方出价，类型为Integer\n                await FlutterTencentad.showRewardVideoAd(\n                result: FlutterTencentBiddingResult().success(ecpm, 0));\n            } else {\n                //竞胜方出价（单位：分），类型为Integer\n                //优量汇广告竞败原因 FlutterTencentAdBiddingLossReason\n                //竞胜方渠道ID FlutterTencentAdADNID\n                await FlutterTencentad.showRewardVideoAd(\n                result: FlutterTencentBiddingResult().fail(\n                1000,\n                FlutterTencentAdBiddingLossReason.LOW_PRICE,\n                FlutterTencentAdADNID.othoerADN));\n          }\n        },\n      ),\n    );\n```\n#### 7、插屏广告\n预加载插屏广告\n```dart\nawait FlutterTencentad.loadUnifiedInterstitialAD(\n    //android广告id\n    androidId: \"9062813863614416\",\n    //ios广告id\n    iosId: \"1052938046031440\",\n    //是否全屏\n    isFullScreen: false,\n    //下载二次确认弹窗 默认false\n    downloadConfirm: true,\n    //是否开启竞价\n    isBidding: true,\n);\n```\n\n显示插屏广告\n```dart\n  await FlutterTencentad.showUnifiedInterstitialAD();\n```\n\n插屏广告结果监听\n\u003e 当为竞价时触发onECPM，否则触发onReady\n```dart\nFlutterTencentAdStream.initAdStream(\n    flutterTencentadInteractionCallBack: FlutterTencentadInteractionCallBack(\n        onShow: () {\n          print(\"插屏广告显示\");\n        },\n        onClick: () {\n          print(\"插屏广告点击\");\n        },\n        onFail: (code, message) {\n          print(\"插屏广告失败 $code $message\");\n        },\n        onClose: () {\n          print(\"插屏广告关闭\");\n        },\n        onReady: () async {\n          print(\"插屏广告预加载准备就绪\");\n          await FlutterTencentad.showUnifiedInterstitialAD();\n        },\n        onUnReady: () {\n          print(\"插屏广告预加载未准备就绪\");\n        },\n        onVerify: (transId,rewardName,rewardAmount){\n          print(\"广告奖励凭证id  $transId\");\n        },\n        onECPM: (ecpmLevel, ecpm) async {\n            print(\"插屏广告竞价  ecpmLevel=$ecpmLevel  ecpm=$ecpm\");\n            //规则 自己根据业务处理\n            if (ecpm \u003e 0) {\n                //竞胜出价，类型为Integer\n                //最大竞败方出价，类型为Integer\n                await FlutterTencentad.showUnifiedInterstitialAD(\n                result: FlutterTencentBiddingResult().success(ecpm, 0));\n            } else {\n                //竞胜方出价（单位：分），类型为Integer\n                //优量汇广告竞败原因 FlutterTencentAdBiddingLossReason\n                //竞胜方渠道ID FlutterTencentAdADNID\n                await FlutterTencentad.showUnifiedInterstitialAD(\n                result: FlutterTencentBiddingResult().fail(\n                1000,\n                FlutterTencentAdBiddingLossReason.LOW_PRICE,\n                FlutterTencentAdADNID.othoerADN));\n            }\n      },\n  ),\n);\n```\n\n#### 8、进入APP下载列表（仅android）\n```dart\nawait FlutterTencentad.enterAPPDownloadListPage();\n```\n\n## 错误码\n\n- [错误码1](https://developers.adnet.qq.com/doc/android/union/union_debug#sdk%20%E9%94%99%E8%AF%AF%E7%A0%81)\n- [错误码2](https://developers.adnet.qq.com/backend/error_code.html)\n\n## 插件链接\n\n|插件|地址|\n|:----|:----|\n|字节-穿山甲广告插件|[flutter_unionad](https://github.com/gstory0404/flutter_unionad)|\n|腾讯-优量汇广告插件|[flutter_tencentad](https://github.com/gstory0404/flutter_tencentad)|\n|百度-百青藤广告插件|[baiduad](https://github.com/gstory0404/baiduad)|\n|字节-Gromore聚合广告|[gromore](https://github.com/gstory0404/gromore)|\n|Sigmob广告|[sigmobad](https://github.com/gstory0404/sigmobad)|\n|聚合广告插件(迁移至GTAds)|[flutter_universalad](https://github.com/gstory0404/flutter_universalad)|\n|GTAds聚合广告|[GTAds](https://github.com/gstory0404/GTAds)|\n|字节穿山甲内容合作插件|[flutter_pangrowth](https://github.com/gstory0404/flutter_pangrowth)|\n|文档预览插件|[file_preview](https://github.com/gstory0404/file_preview)|\n|滤镜|[gpu_image](https://github.com/gstory0404/gpu_image)|\n\n### 开源不易，觉得有用的话可以请作者喝杯奶茶🧋\n\u003cimg src=\"https://github.com/gstory0404/flutter_tencentad/blob/master/images/weixin.jpg\" width = \"200\" height = \"160\" alt=\"打赏\"/\u003e\n\n## 联系方式\n* Email: gstory0404@gmail.com\n* Blog：https://www.gstory.cn/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgstory0404%2Fflutter_tencentad","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgstory0404%2Fflutter_tencentad","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgstory0404%2Fflutter_tencentad/lists"}