Commit c653cd80 by tanghuan

集成开屏广告

1 parent ca90354c
......@@ -108,4 +108,29 @@ dependencies {
//implementation("com.tencent.timpush:meizu:8.7.7201")
// Google Firebase Cloud Messaging (Google FCM)
//implementation("com.tencent.timpush:fcm:8.7.7201")
// 聚合SDK start
implementation("com.yfanads.ads:sdk-core:${rootProject.ext["sdk_versionName"]}")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
// 聚合SDK end
//百度广告SDK(适配+原sdk)
implementation("com.yfanads.ads:adapter-bd:${rootProject.ext["bd_sdk_version"]}")
//穿山甲广告SDK(适配+原sdk)
implementation("com.yfanads.ads:adapter-csj:${rootProject.ext["csj_sdk_version"]}")
implementation("com.squareup.okhttp3:okhttp:3.12.1")
//快手广告SDK(适配+原sdk)
implementation("com.yfanads.ads:adapter-ks:${rootProject.ext["ks_sdk_version"]}")
implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0")
//优量汇广告SDK(适配+原sdk)
implementation("com.yfanads.ads:adapter-ylh:${rootProject.ext["ylh_sdk_version"]}")
//京东广告SDK(适配+原来sdk)
implementation("com.yfanads.ads:adapter-jd:${rootProject.ext["jd_sdk_version"]}")
//华为广告SDK(适配+原来sdk)
implementation("com.yfanads.ads:adapter-hw:${rootProject.ext["hw_sdk_version"]}")
//小米广告SDK(适配+原来sdk)
implementation("com.yfanads.ads:adapter-xm:${rootProject.ext["xm_sdk_version"]}")
//oppo广告SDK(适配+原来sdk)
implementation("com.yfanads.ads:adapter-oppo:${rootProject.ext["oppo_sdk_version"]}")
//荣耀广告 (适配+源sdk)
implementation("com.yfanads.ads:adapter-ry:${rootProject.ext["ry_sdk_version"]}")
}
\ No newline at end of file
......@@ -25,4 +25,211 @@
}
# 可选:如果遇到兼容性问题,可以忽略警告
-dontwarn com.tencent.mm.**
\ No newline at end of file
-dontwarn com.tencent.mm.**
# 亿帆广告
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }
# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
##---------------End: proguard configuration for Gson ----------
## ------聚合开始
-keep class com.yfanads.android.** { *; }
-keep class com.yfanads.ads.** { *; }
## ------聚合结束
# -------三方依赖开始
-keep class com.google.** { *; }
-dontwarn okio.**
-dontwarn com.ak.**
-dontwarn android.webkit.**
-dontwarn com.bytedance.sdk.**
-keep class android.** { *; }
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
# -------三方依赖结束
# csj sdk start
#3500以及以下版本混淆规则如下:
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.pgl.sys.ces.* {*;}
-keep class com.bytedance.embed_dr.** {*;}
-keep class com.bytedance.embedapplog.** {*;}
#3600版本-3800版本混淆规则如下:
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class ms.bd.c.**{*;}
-keep class com.bytedance.mobsec.**{*;}
-keep class com.bytedance.embed_dr.** {*;}
-keep class com.bytedance.embedapplog.** {*;}
-keep interface com.bytedance.frameworks.baselib.network.http.cronet.I* {*;}
-keepnames class com.bytedance.framwork.core.sdkmonitor.SDKMonitorUtils
#3900版本及以上版本混淆规则如下:
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep class com.bytedance.frameworks.** { *; }
-keep class ms.bd.c.Pgl.**{*;}
-keep class com.bytedance.mobsec.metasec.ml.**{*;}
-keep class com.ss.android.**{*;}
-keep class com.bytedance.embedapplog.** {*;}
-keep class com.bytedance.embed_dr.** {*;}
-keep class com.bykv.vk.** {*;}
-keep class bykvm*.**
-keep class com.bytedance.msdk.adapter.**{ public *; }
-keep class com.bytedance.msdk.api.** {
public *;
}
-keep class com.bytedance.msdk.base.TTBaseAd{*;}
-keep class com.bytedance.msdk.adapter.TTAbsAdLoaderAdapter{
public *;
protected <fields>;
}
# csj sdk end
#baidu start
-keep class com.baidu.mobads.** { *; }
# ks SDK
-keep class org.chromium.** {*;}
-keep class org.chromium.** { *; }
-keep class aegon.chrome.** { *; }
-keep class com.kwai.**{ *; }
-dontwarn com.kwai.**
-dontwarn com.kwad.**
-dontwarn com.ksad.**
-dontwarn aegon.chrome.**
# GDT sdk start
-dontwarn com.qq.e.**
-keep class com.qq.e.** {*;}
-dontpreverify
# JD SDK
-keep class com.jd.ad.sdk.** { *; }
# Xm SDK
-keep class com.miui.zeus.** { *; }
# Oppo SDK
-keep class com.opos.** { *;}
-keep class com.heytap.msp.mobad.** { *;}
-keep class com.heytap.openid.** {*;}
-keep class okio.**{ *; }
-keeppackagenames com.heytap.nearx.tapplugin
# HuaWei SDK
-keep class com.huawei.openalliance.ad.** { *; }
-keep class com.huawei.hms.ads.** { *; }
# Vivo SDK
-dontwarn okhttp3.**
-dontwarn android.support.v4.**
-dontwarn com.squareup.okhttp.**
-keep class com.vivo.*.** { *; }
-dontwarn com.bytedance.article.common.nativecrash.NativeCrashInit
-keep class com.bytedance.sdk.openadsdk.** {*;}
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.pgl.sys.ces.* {*;}
-keep class com.qq.e.** {
public protected *;
}
-keep class android.support.v4.**{
public *;
}
-dontwarn com.vivo.secboxsdk.**
-keep class com.vivo.secboxsdk.SecBoxCipherException { *; }
-keep class com.vivo.secboxsdk.jni.SecBoxNative { *; }
-keep class com.vivo.secboxsdk.BuildConfig { *; }
-keep class android.support.v7.widget.** {*;}
# TanX
##优化配置,可进行字段优化、内联、类合并、代码简化、算法指令精简等操作。
-optimizations code/removal/simple,code/removal/advanced,method/removal/parameter,method/inlining/short,method/inlining/tailrecursion
##执行优化的次数,默认1次,多次能达到更好的优化效果。
-optimizationpasses 5
# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames
#保持参数名 指定keep已经被keep的方法的参数类型和参数名称,在混淆library库时非常有用,可供IDE帮助用户进行信息提示和代码自动填充。
-keepparameternames
#指定保留属性,多个属性可以用多个-keepattributes配置,也可以用逗号分隔,可以使用? * **通配符,并且可以使用否定符(!)。
#比如,在混淆ibrary库时,应该至少keep Exceptions, InnerClasses, Signature;如果在追踪代码,还需要keep符号表;使用到注解时也需要keep
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
#优化时允许访问并修改有修饰符的类和类的成员, 混淆后的类名还会改变地方,到其他包中 需要,所有被混淆的都到一个包去,不需要保留原来的结构
-allowaccessmodification
#混淆前后类、方法、类成员等的对照
-printmapping mapping.txt
##屏蔽警告
-ignorewarnings
#指定在混淆过程中输出更多信息,配置这个选项后,在遇到异常时,将输出完整的堆栈,而不仅仅是异常消息
-verbose
# 指定不去忽略非公共的库类(不跳过library中的非public的类)
-dontskipnonpubliclibraryclasses
#指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.**{*;}
-keep class com.bumptech.glide.**{*;}
-keep class com.alimm.tanx.**{*;}
# 自动曝光数据的防混淆
-keep class * implements java.io.Serializable{
<fields>;
<methods>;
}
#荣耀 start
-keep class com.hihonor.adsdk.** {*;}
-keep,allowshrinking class com.hihonor.adsdk.base.**{*;}
-keep,allowshrinking class com.hihonor.adsdk.banner.**{*;}
-keep,allowshrinking class com.hihonor.adsdk.intersititial.**{*;}
-keep,allowshrinking class com.hihonor.adsdk.reward.**{*;}
-keep,allowshrinking class com.hihonor.adsdk.picturetextad.**{*;}
-keep,allowshrinking class com.hihonor.adsdk.splash.**{*;}
-keep,allowshrinking class com.hihonor.adsdk.common.**{*;}
-keep,allowshrinking class com.hihonor.hianalytics.**{*;}
-keep,allowshrinking class com.hihonor.updater.**{*;}
-keep,allowshrinking class com.hihonor.secure.android.common.encrypt.**{*;}
-keep,allowshrinking class com.hihonor.secure.android.common.ssl.**{*;}
-keep,allowshrinking class com.hihonor.ads.identifier.**{*;}
-keep,allowshrinking class com.hihonor.dlinstall.**{*;}
-keep class com.squareup.wire.** { *; }
-keep class com.opensource.svgaplayer.proto.** { *; }
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="cn.banxe.bxe">
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
......@@ -18,12 +20,32 @@
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- 广告SDK推荐的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 广告SDK可选权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!--注意: 该权限不强制获取,即使没有获取也能正常运行;获取该权限将帮助优化投放广告精准度。-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!--穿山甲的必要权限,解决安全风险漏洞,发送和注册广播事件需要调用带有传递权限的接口-->
<permission
android:name="${applicationId}.openadsdk.permission.TT_PANGOLIN"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.openadsdk.permission.TT_PANGOLIN" />
<!-- 如果有视频相关的广告且使用textureView播放,请务必添加,否则黑屏 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- 安全隐患,需要删除 -->
<uses-permission
android:name="android.permission.BROADCAST_STICKY"
tools:node="remove" />
<application
android:label="班小二"
android:name="cn.banxe.bxe.MyApplication"
android:icon="@mipmap/launcher_icon"
android:networkSecurityConfig="@xml/network_security_config">
android:networkSecurityConfig="@xml/network_security_config"
android:allowBackup="false"
tools:replace="android:allowBackup,android:label">
<activity
android:name=".MainActivity"
android:exported="true"
......@@ -38,9 +60,9 @@
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
......@@ -51,6 +73,55 @@
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<!--穿山甲-->
<provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/ea_csj_file_paths" />
</provider>
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" />
<!--优量汇-->
<provider
android:name="com.qq.e.comm.GDTFileProvider"
android:authorities="${applicationId}.gdt.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/gdt_file_path" />
</provider>
<!-- 小米 -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/xm_file_paths" />
</provider>
<!--亿帆-->
<provider
android:name="com.yfanads.android.adx.download.AdxFileProvider"
android:authorities="${applicationId}.AdxFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/adxfilepaths" />
</provider>
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
......@@ -63,4 +134,4 @@
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>
</manifest>
\ No newline at end of file
apply(from = "config.gradle.kts")
allprojects {
repositories {
google()
mavenCentral()
// 京东
maven { url = uri("https://jitpack.io") }
// 穿山甲
maven { url = uri("https://artifact.bytedance.com/repository/pangle") }
// 荣耀仓库
maven { url = uri("https://developer.hihonor.com/repo/") }
// 米盟 - 需要特殊处理认证
maven {
url = uri("https://repos.xiaomi.com/maven")
credentials {
username = "mimo-developer"
password =
"AKCp8ih1PFG9tV8qaLyws67dLGZi8udFM39SfsHgihN15cgsiRvHuxj8JzFmuZjaViVeNawaA"
}
}
// 华为
maven { url = uri("https://developer.huawei.com/repo") }
maven { url = uri("https://maven.aliyun.com/repository/public/") }
maven { url = uri("https://maven.yfanads.com/repository/maven-public/") }
}
}
......
rootProject.extra.apply {
set("compileSdk", 31)
set("minSdk", 21)
set("targetSdk", 31)
set("supportLibVersion", "28.0.0")
set("glide_version", "4.9.0")
set("glide_transformations", "3.0.1")
set("app_versionName", "6.0.7.1")
// 亿帆广告
set("sdk_versionName", "6.0.7.1")
// 百度
set("bd_sdk_version", "9.42.0-${this["sdk_versionName"]}")
// 快手
set("ks_sdk_version", "v4.9.20.1-${this["sdk_versionName"]}")
// 穿山甲
set("csj_sdk_version", "7.1.3.2-${this["sdk_versionName"]}")
// 优量汇
set("ylh_sdk_version", "4.660.1530-${this["sdk_versionName"]}")
// 京东
set("jd_sdk_version", "2.6.32-${this["sdk_versionName"]}")
// 华为
set("hw_sdk_version", "13.4.78.301-${this["sdk_versionName"]}")
// oppo
set("oppo_sdk_version", "810004-${this["sdk_versionName"]}")
// 小米
set("xm_sdk_version", "5.3.7-${this["sdk_versionName"]}")
// 荣耀
set("ry_sdk_version", "1.0.24.300-${this["sdk_versionName"]}")
}
\ No newline at end of file
......@@ -15,8 +15,10 @@ import 'package:appframe/services/recorder_service.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:dio/dio.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:shared_preferences/shared_preferences.dart';
......@@ -25,6 +27,13 @@ import 'package:volume_controller/volume_controller.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
import 'package:wechat_camera_picker/wechat_camera_picker.dart';
import 'package:yf_ads/bean/yf_ads_init_sdk_android_bean.dart';
import 'package:yf_ads/bean/yf_ads_init_sdk_base_bean.dart';
import 'package:yf_ads/bean/yf_ads_init_sdk_ios_bean.dart';
import 'package:yf_ads/bean/yf_ads_splash_bean.dart';
import 'package:yf_ads/callbacks/yf_ads_callback.dart';
import 'package:yf_ads/managers/yf_splash.dart';
import 'package:yf_ads/yf_ads.dart';
class WebState extends Equatable {
final int selectedIndex;
......@@ -202,6 +211,8 @@ class WebCubit extends Cubit<WebState> with WidgetsBindingObserver {
HttpServer? _server;
PlayerService? _playerService;
RecorderService? _recorderService;
// 亿帆广告
YFAds? _adsFlutterPlugin;
WebViewController get controller => _controller;
......@@ -215,10 +226,79 @@ class WebCubit extends Cubit<WebState> with WidgetsBindingObserver {
router.go('/loginMain');
});
} else {
_initAdsSdk().then((value) => _loadColdSplashAd(true));
_init();
}
}
Future<void> _initAdsSdk() async {
_adsFlutterPlugin = YFAds.instance;
YFAdsInitSDKBaseBean? reaperInitSdkBaseBean;
if (Platform.isAndroid) {
const RELEASE_APP_ID = "edd7b801541f4371a1f40212a76869fd";
reaperInitSdkBaseBean = const YFAdsInitSDKAndroidBean(appId: RELEASE_APP_ID, appKey: '', enableLog: true);
} else if (Platform.isIOS) {
const RELEASE_APP_ID = "b23c5c5c7ebd4dff9cf51ee9ee15aa77";
reaperInitSdkBaseBean = const YFAdsInitSDKIOSBean(appId: RELEASE_APP_ID, appKey: '');
}
await _adsFlutterPlugin?.initAdsSDK(reaperInitSdkBaseBean!);
}
Future<void> _loadColdSplashAd(bool loadAndShow) async {
String? positionId;
if (Platform.isAndroid) {
positionId = "90906223b4e6427da7a1885b44afacc8";
} else if (Platform.isIOS) {
positionId = "5212de4238344338913289d4358f3e45";
}
var reaperSplashBean =
YFAdsSplashBean(positionId: positionId, loadAndShow: loadAndShow, callBack: _splashAdCallBack);
await YFSplashManager.loadSplashAd(reaperSplashBean);
}
void _splashAdCallBack(YFAdsCallBack data) {
debugPrint("splashAdCallBack:${data.method} ${data.tag}");
if (defaultTargetPlatform == TargetPlatform.android && data.method == YFAdsCallBack.YF_ADS_ANDROID_SUCCESS) {
Fluttertoast.showToast(msg: "加载成功", toastLength: Toast.LENGTH_SHORT);
}
if (defaultTargetPlatform == TargetPlatform.iOS) {
switch (data.method) {
case 'yfSplashAdDidLoad':
Fluttertoast.showToast(msg: "开屏广告加载成功", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfSplashAdExpose':
{
if (Platform.isIOS) {
// emit(state.copyWith(pageAbsorbing: true));
}
Fluttertoast.showToast(msg: "开屏广告曝光成功", toastLength: Toast.LENGTH_SHORT);
}
break;
case 'yfSplashAdLoadFail':
{
if (defaultTargetPlatform == TargetPlatform.iOS) {
// emit(state.copyWith(pageAbsorbing: false));
}
Fluttertoast.showToast(msg: "开屏广告加载失败", toastLength: Toast.LENGTH_SHORT);
}
break;
case 'yfSplashAdDidClick':
Fluttertoast.showToast(msg: "开屏广告点击", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfSplashAdDidClose':
{
if (defaultTargetPlatform == TargetPlatform.iOS) {
// emit(state.copyWith(pageAbsorbing: false));
}
Fluttertoast.showToast(msg: "开屏广告关闭", toastLength: Toast.LENGTH_SHORT);
}
break;
default:
}
}
}
Future<void> _init() async {
// 当前使用的H5版本
var curVersion = getIt.get<SharedPreferences>().getString(Constant.h5VersionKey) ?? Constant.h5Version;
......
......@@ -84,6 +84,10 @@ dependencies:
open_file: ^3.5.10
cupertino_icons: ^1.0.8
# --- 亿帆广告插件 ---
yf_ads: ^0.4.1
fluttertoast: ^8.2.5
dev_dependencies:
flutter_test:
sdk: flutter
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!