Commit c2c199f6 authored by jyx's avatar jyx

我的页面添加信息流

parent 81eecdef
......@@ -12,8 +12,8 @@ android {
applicationId "com.duben.miaoquplaylet"
minSdkVersion rootProject.ext.androidMinSdkVersion
targetSdkVersion rootProject.ext.androidTargetSdkVersion
versionCode 2
versionName "1.0.1"
versionCode 10
versionName "1.0.9"
flavorDimensions "default"
// dex突破65535的限制
......@@ -66,6 +66,7 @@ android {
buildConfigField "String", "GROMORE_VIDEO_CODE", GROMORE_VIDEO_CODE
buildConfigField "String", "GROMORE_DRAW_CODE", GROMORE_DRAW_CODE
buildConfigField "String", "GROMORE_EXPRESS_CODE", GROMORE_EXPRESS_CODE
buildConfigField "String", "GROMORE_MYEXPRESS_CODE", GROMORE_MYEXPRESS_CODE
buildConfigField "String", "GROMORE_BANNER_CODE", GROMORE_BANNER_CODE
buildConfigField "String", "RELEASE_TALKING_DATA_KEY", RELEASE_TALKING_DATA_KEY
buildConfigField "String", "WEIXIN_APP_PAY_ID", WEIXIN_APP_PAY_ID
......@@ -89,6 +90,7 @@ android {
buildConfigField "String", "GROMORE_VIDEO_CODE", GROMORE_VIDEO_CODE
buildConfigField "String", "GROMORE_DRAW_CODE", GROMORE_DRAW_CODE
buildConfigField "String", "GROMORE_EXPRESS_CODE", GROMORE_EXPRESS_CODE
buildConfigField "String", "GROMORE_MYEXPRESS_CODE", GROMORE_MYEXPRESS_CODE
buildConfigField "String", "GROMORE_BANNER_CODE", GROMORE_BANNER_CODE
buildConfigField "String", "RELEASE_TALKING_DATA_KEY", RELEASE_TALKING_DATA_KEY
buildConfigField "String", "WEIXIN_APP_PAY_ID", WEIXIN_APP_PAY_ID
......
package com.duben.miaoquplaylet.ad.express
import android.net.Uri
import android.text.TextUtils
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import com.bumptech.glide.Glide
import com.bytedance.sdk.openadsdk.*
import com.bytedance.sdk.openadsdk.mediation.ad.MediationExpressRenderListener
import com.bytedance.sdk.openadsdk.mediation.ad.MediationViewBinder
import com.duben.miaoquplaylet.MintsApplication
import com.duben.miaoquplaylet.BuildConfig
import com.duben.miaoquplaylet.R
import com.duben.miaoquplaylet.ad.AdManager
import com.duben.miaoquplaylet.utils.ForegroundOrBackground
import com.duben.miaoquplaylet.utils.LogUtil
import com.duben.miaoquplaylet.utils.TimeRender
import com.duben.miaoquplaylet.utils.UIUtils
import java.lang.Exception
import java.util.ArrayList
/**
* 信息流
*/
class MyExpressManager {
private val TAG = MyExpressManager::class.java.simpleName
companion object {
val instance: MyExpressManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
MyExpressManager()
}
}
private var frameLayout: FrameLayout? = null
private val adLoadTime: Long = 0 // 广告展示时间,45分钟后当前广告失效,重新预加载广告
private var adPreingTime: Long = 0 // 防止预加载超时 2分钟
private var isLoadSuccess = 0 //0-加载失败/未加载 1-加载中 2-加载成功
private var mExpressAdCallback: ExpressAdCallback? = null
private var mTTFeedAd: TTFeedAd? = null
fun preLoadAd() {
val isOversped = TimeRender.isOverspedMin(adLoadTime, AdManager.AD_NO_SHOWTIME_OUT)
val isPreingOversped = TimeRender.isOverspedMin(adPreingTime, AdManager.AD_REQUEST_TIME_OUT)
LogUtil.d(
TAG,
"gromore我的信息流--> 1、进入预加载 isLoadSuccess=$isLoadSuccess isOversped=$isOversped isPreingOversped=$isPreingOversped"
)
if ((isLoadSuccess == 0 // 加载失败
|| adLoadTime > 0 && isOversped // 超过45分钟
|| adPreingTime > 0 && isPreingOversped && isLoadSuccess == 1) // 预加载超时
) {
LogUtil.d(TAG, "gromore我的信息流--> 2、执行预加载去了=$isLoadSuccess")
adPreingTime = System.currentTimeMillis()
isLoadSuccess = 1
// 销毁及移除事件
// destroy()
this.frameLayout = FrameLayout(MintsApplication.getContext())
loadAd()
}
}
private fun loadAd() {
val activity = ForegroundOrBackground.getTopActivity()
val adNativeLoader = TTAdSdk.getAdManager().createAdNative(activity)
val adslot = AdSlot.Builder()
.setCodeId(BuildConfig.GROMORE_MYEXPRESS_CODE)
/**
* 注:
* 1:单位为px
* 2:如果是信息流自渲染广告,设置广告图片期望的图片宽高 ,不能为0
* 2:如果是信息流模板广告,宽度设置为希望的宽度,高度设置为0(0为高度选择自适应参数)
*/
.setImageAcceptedSize(UIUtils.getAdWidth(MintsApplication.getContext()).toInt(), 0)
.setAdCount(3)//请求广告数量为1到3条 (优先采用平台配置的数量)
.build()
adNativeLoader.loadFeedAd(adslot, object : TTAdNative.FeedAdListener {
override fun onError(p0: Int, p1: String?) {
LogUtil.e(TAG, "gromore我的信息流--> 3、load feed ad error : $p0, $p1")
isLoadSuccess = 0
}
override fun onFeedAdLoad(ads: MutableList<TTFeedAd>?) {
ads?.let {
if (it.isEmpty()) {
isLoadSuccess = 0
return
}
if (it.size > 0) {
mTTFeedAd = it[0]
isLoadSuccess = 2
showAd()
}
}
}
})
}
private fun showAd() {
mTTFeedAd?.let {
if (it.mediationManager.isExpress) {
//--------------信息流模板广告渲染----------------
showExpressView(it)
} else {
//--------------信息流自渲染广告渲染----------------
val view: View? = when (it.imageMode) {
TTAdConstant.IMAGE_MODE_SMALL_IMG -> getSmallAdView(frameLayout)//信息流自渲染广告渲染 :小图广告
TTAdConstant.IMAGE_MODE_LARGE_IMG -> getLargeAdView(frameLayout)//信息流自渲染广告渲染 :大图广告
TTAdConstant.IMAGE_MODE_GROUP_IMG -> getGroupAdView(frameLayout)//信息流自渲染广告渲染 :组图广告
TTAdConstant.IMAGE_MODE_VIDEO -> getVideoView(frameLayout)//信息流自渲染广告渲染 :视频广告
TTAdConstant.IMAGE_MODE_VERTICAL_IMG -> getVerticalAdView(frameLayout)//信息流自渲染广告渲染 :竖图广告
TTAdConstant.IMAGE_MODE_VIDEO_VERTICAL -> getVideoView(frameLayout)//信息流自渲染广告渲染 :竖版视频广告
else -> {
Log.i(TAG, "展示样式错误")
null
}
}
view?.let {
it.layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
frameLayout?.removeAllViews()
frameLayout?.addView(it)
}
}
}
}
fun getAdView(callback: ExpressAdCallback?) {
val isOversped = TimeRender.isOverspedMin(adLoadTime, AdManager.AD_NO_SHOWTIME_OUT)
// 若上一个广告还在加载中则返回
if (isLoadSuccess == 1) {
this.mExpressAdCallback = callback
LogUtil.d(TAG, "gromore我的信息流--> 3.9、广告加载中 LoadSuccess = $isLoadSuccess")
return
}
this.mExpressAdCallback = null
if (isLoadSuccess == 2 && !isOversped) {
LogUtil.d(
TAG,
"gromore我的信息流--> 4、展示广告 LoadSuccess=$isLoadSuccess isOversped=$isOversped"
)
isLoadSuccess = 0
callback?.loadSuccess(frameLayout)
} else {
LogUtil.e(TAG, "gromore我的信息流--> 5、展示广告时失败了,广告可能超时45分钟 onError ")
// 状态重置
isLoadSuccess = 0
callback?.loadFail()
}
}
private fun showExpressView(it: TTFeedAd) {
it.setExpressRenderListener(object : MediationExpressRenderListener {
override fun onRenderSuccess(p0: View?, p1: Float, p2: Float, p3: Boolean) {
Log.i(TAG, "onRenderSuccess")
it.setDislikeCallback(
ForegroundOrBackground.getTopActivity(),
object : TTAdDislike.DislikeInteractionCallback {
override fun onShow() {
Log.i(TAG, "express dislike 点击show")
}
override fun onSelected(position: Int, value: String?, enforce: Boolean) {
Log.i(TAG, "express 点击 $value")
}
override fun onCancel() {
Log.i(TAG, "express dislike 点击了取消")
}
})
it.adView?.let { view ->
if (view.parent != null) {
(view.parent as ViewGroup).removeView(view)
}
frameLayout?.addView(view)
}
mExpressAdCallback?.let {
if (it.renderSuccess(frameLayout)) {
isLoadSuccess = 0
}
}
mExpressAdCallback = null
}
override fun onRenderFail(p0: View?, p1: String?, p2: Int) {
isLoadSuccess = 0
LogUtil.e(TAG, "gromore我的信息流--> 5、展示广告时失败了,onRenderFail msg=${p1} code=${p2} ")
}
override fun onAdClick() {
Log.i(TAG, "onAdClick")
}
override fun onAdShow() {
Log.i(TAG, "onAdShow")
Log.i(TAG, "ad mediaExtraInfo ${it.mediaExtraInfo}")
}
})
it.render()//必须要调用render方法进行渲染,在onRenderSuccess中处理模板的view
}
/**
* 销毁
*/
fun destroy() {
// frameLayout?.removeAllViews()
// frameLayout = null
mTTFeedAd?.destroy()
this.mExpressAdCallback = null
}
fun getFrameLayout(): View? {
return frameLayout
}
private fun getSmallAdView(parent: ViewGroup?): View? {
val convertView =
LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_small_pic,
parent,
false
)
val adViewHolder = SmallAdViewHolder()
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.mDescription =
convertView.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mSmallImage =
convertView.findViewById<View>(R.id.iv_listitem_image) as ImageView
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_small_pic)
.titleId(R.id.tv_listitem_ad_title)
.sourceId(R.id.tv_listitem_ad_source).descriptionTextId(
R.id.tv_listitem_ad_desc
)
.mainImageId(R.id.iv_listitem_image)
.logoLayoutId(R.id.tt_ad_logo)
.callToActionId(R.id.btn_listitem_creative)
.iconImageId(R.id.iv_listitem_icon).build()
adViewHolder.viewBinder = viewBinder
bindData(convertView, adViewHolder)
if (mTTFeedAd?.imageList?.size != 0) {
mTTFeedAd?.let { ttfeedad ->
ttfeedad.imageList[0]?.imageUrl?.let {
Glide.with(ForegroundOrBackground.getTopActivity()).load(it)
.into(adViewHolder.mSmallImage!!)
}
}
}
return convertView;
}
private fun getLargeAdView(parent: ViewGroup?): View {
val adViewHolder = LargeAdViewHolder()
var convertView: View =
LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_large_pic,
parent,
false
)
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mDescription =
convertView.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.mLargeImage =
convertView.findViewById<View>(R.id.iv_listitem_image) as ImageView
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
adViewHolder.mLogo =
convertView.findViewById<RelativeLayout>(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_large_pic)
.titleId(R.id.tv_listitem_ad_title)
.descriptionTextId(R.id.tv_listitem_ad_desc).sourceId(
R.id.tv_listitem_ad_source
)
.mainImageId(R.id.iv_listitem_image)
.callToActionId(R.id.btn_listitem_creative)
.logoLayoutId(R.id.tt_ad_logo)
.iconImageId(R.id.iv_listitem_icon).build()
adViewHolder.viewBinder = viewBinder
bindData(convertView, adViewHolder)
if (mTTFeedAd?.imageList?.size != 0) {
mTTFeedAd?.let { ttfeedad ->
ttfeedad.imageList[0]?.imageUrl?.let {
Glide.with(ForegroundOrBackground.getTopActivity()).load(it)
.into(adViewHolder.mLargeImage!!)
}
}
}
return convertView
}
private fun getGroupAdView(parent: ViewGroup?): View? {
val adViewHolder = GroupAdViewHolder()
var convertView: View = LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_group_pic,
parent,
false
)
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.mDescription =
convertView.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mGroupImage1 =
convertView.findViewById<View>(R.id.iv_listitem_image1) as ImageView
adViewHolder.mGroupImage2 =
convertView.findViewById<View>(R.id.iv_listitem_image2) as ImageView
adViewHolder.mGroupImage3 =
convertView.findViewById<View>(R.id.iv_listitem_image3) as ImageView
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
adViewHolder.mLogo =
convertView.findViewById<RelativeLayout>(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_group_pic)
.titleId(R.id.tv_listitem_ad_title)
.descriptionTextId(R.id.tv_listitem_ad_desc).sourceId(
R.id.tv_listitem_ad_source
)
.mainImageId(R.id.iv_listitem_image1)
.logoLayoutId(R.id.tt_ad_logo).callToActionId(
R.id.btn_listitem_creative
).iconImageId(R.id.iv_listitem_icon)
.groupImage1Id(R.id.iv_listitem_image1).groupImage2Id(
R.id.iv_listitem_image2
)
.groupImage3Id(R.id.iv_listitem_image3).build()
adViewHolder.viewBinder = viewBinder
bindData(convertView, adViewHolder)
if (mTTFeedAd?.imageList?.size ?: 0 >= 3) {
val image1: String? = mTTFeedAd?.imageList?.get(0)?.imageUrl
val image2: String? = mTTFeedAd?.imageList?.get(1)?.imageUrl
val image3: String? = mTTFeedAd?.imageList?.get(2)?.imageUrl
if (image1 != null) {
Glide.with(ForegroundOrBackground.getTopActivity()).load(image1)
.into(adViewHolder.mGroupImage1!!)
}
if (image2 != null) {
Glide.with(ForegroundOrBackground.getTopActivity()).load(image2)
.into(adViewHolder.mGroupImage2!!)
}
if (image3 != null) {
Glide.with(ForegroundOrBackground.getTopActivity()).load(image3)
.into(adViewHolder.mGroupImage3!!)
}
}
return convertView
}
private fun getVideoView(parent: ViewGroup?): View? {
val adViewHolder = VideoAdViewHolder()
var convertView: View? = null
try {
convertView = LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_large_video,
parent,
false
)
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mDescription =
convertView.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.videoView =
convertView.findViewById<View>(R.id.iv_listitem_video) as FrameLayout
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
adViewHolder.mLogo =
convertView.findViewById<RelativeLayout>(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_large_video)
.titleId(R.id.tv_listitem_ad_title)
.sourceId(R.id.tv_listitem_ad_source)
.descriptionTextId(R.id.tv_listitem_ad_desc)
.mediaViewIdId(
R.id.iv_listitem_video
)
.callToActionId(R.id.btn_listitem_creative)
.logoLayoutId(R.id.tt_ad_logo)
.iconImageId(R.id.iv_listitem_icon).build()
adViewHolder.viewBinder = viewBinder
// 如果自己有需求进行视频播放操作,则按如下步骤进行。注意:不是所有adn都支持,因此需要进行判空操作。
// mTTFeedAd?.csjmAdInfo?.setUseCustomVideo(true) // 注意:要在registerView之前调用
val videoUrl: String? = mTTFeedAd?.customVideo?.videoUrl // 注意:不是所有adn都支持,这里务必要进行判空操作
if (!TextUtils.isEmpty(videoUrl)) {
// 如果通过getVideoUrl返回的url不是空,则自己处理视频播放操作,并通过reporter上报视频状态
playAdVideo(adViewHolder.videoView as FrameLayout, videoUrl ?: "")
} else {
// 注意:即使该adn支持返回url,但某次偶然原因返回的videoUrl为空,则仍然会用adn自己的视频播放作为兜底
}
//视频广告设置播放状态回调(可选)
mTTFeedAd?.setVideoAdListener(object : TTFeedAd.VideoAdListener {
override fun onVideoLoad(ad: TTFeedAd?) {
Log.i(TAG, "onVideoLoad")
}
override fun onVideoError(errorCode: Int, extraCode: Int) {
Log.i(TAG, "onVideoError")
}
override fun onVideoAdStartPlay(ad: TTFeedAd?) {
Log.i(TAG, "onVideoAdStartPlay")
}
override fun onVideoAdPaused(ad: TTFeedAd?) {
Log.i(TAG, "onVideoAdPaused")
}
override fun onVideoAdContinuePlay(ad: TTFeedAd?) {
Log.i(TAG, "onVideoAdContinuePlay")
}
override fun onProgressUpdate(current: Long, duration: Long) {
Log.i(TAG, "onProgressUpdate")
}
override fun onVideoAdComplete(ad: TTFeedAd?) {
Log.i(TAG, "onVideoAdComplete")
}
})
mTTFeedAd?.setDownloadListener(object : TTAppDownloadListener {
override fun onIdle() {
Log.i(TAG, "setDownloadListener")
}
override fun onDownloadActive(
totalBytes: Long,
currBytes: Long,
fileName: String?,
appName: String?
) {
Log.i(TAG, "onDownloadActive")
}
override fun onDownloadPaused(
totalBytes: Long,
currBytes: Long,
fileName: String?,
appName: String?
) {
Log.i(TAG, "onDownloadPaused")
}
override fun onDownloadFailed(
totalBytes: Long,
currBytes: Long,
fileName: String?,
appName: String?
) {
Log.i(TAG, "onDownloadFailed")
}
override fun onDownloadFinished(
totalBytes: Long,
fileName: String?,
appName: String?
) {
Log.i(TAG, "onDownloadFinished")
}
override fun onInstalled(fileName: String?, appName: String?) {
Log.i(TAG, "onInstalled")
}
})
//绑定广告数据、设置交互回调
bindData(convertView, adViewHolder)
} catch (e: Exception) {
e.printStackTrace()
}
return convertView
}
private var mVideoView: VideoView? = null
private var customVideoReporter: TTFeedAd.CustomizeVideo? = null
private fun playAdVideo(videoContainer: ViewGroup, videoUrl: String) {
mVideoView = VideoView(MintsApplication.getContext())
videoContainer.addView(mVideoView)
customVideoReporter = mTTFeedAd?.customVideo
// 开发者根据自己的需求,做相应的视频控制界面,播放暂停等
mVideoView?.setVideoURI(Uri.parse(videoUrl))
mVideoView?.setOnErrorListener { mp, what, extra ->
if (customVideoReporter != null) {
customVideoReporter?.reportVideoError(
mVideoView!!.currentPosition.toLong(),
what,
extra
)
}
false
}
mVideoView?.setOnCompletionListener {
if (customVideoReporter != null) {
customVideoReporter?.reportVideoFinish()
}
}
mVideoView?.start()
customVideoReporter?.reportVideoStart()
}
private fun getVerticalAdView(parent: ViewGroup?): View? {
val adViewHolder = VerticalAdViewHolder()
var convertView = LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_vertical_pic,
parent,
false
)
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.mDescription =
convertView?.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mVerticalImage =
convertView.findViewById<ImageView>(R.id.iv_listitem_image)
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
// adViewHolder.mLogo =
// convertView.findViewById<RelativeLayout>(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_vertical_pic)
.titleId(R.id.tv_listitem_ad_title)
.descriptionTextId(R.id.tv_listitem_ad_desc)
.mainImageId(R.id.iv_listitem_image)
.iconImageId(R.id.iv_listitem_icon)
.callToActionId(R.id.btn_listitem_creative)
.sourceId(R.id.tv_listitem_ad_source)
.logoLayoutId(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
.build()
adViewHolder.viewBinder = viewBinder
bindData(convertView, adViewHolder)
if (mTTFeedAd?.imageList?.size != 0) {
mTTFeedAd?.let { ttfeedad ->
ttfeedad.imageList[0]?.imageUrl?.let {
Glide.with(ForegroundOrBackground.getTopActivity()).load(it)
.into(adViewHolder.mVerticalImage!!)
}
}
}
return convertView
}
private fun bindData(convertView: View, adViewHolder: AdViewHolder) {
mTTFeedAd?.let {
if (it.mediationManager?.hasDislike() == true) {
val ttAdDislike: TTAdDislike =
it.getDislikeDialog(ForegroundOrBackground.getTopActivity())
adViewHolder.mDislike?.visibility = View.VISIBLE
adViewHolder.mDislike?.setOnClickListener(View.OnClickListener {
//使用接口来展示
ttAdDislike.showDislikeDialog()
ttAdDislike.setDislikeInteractionCallback(object :
TTAdDislike.DislikeInteractionCallback {
override fun onShow() {
Log.i(TAG, "dislike 点击show")
}
override fun onSelected(position: Int, value: String?, enforce: Boolean) {
Log.i(TAG, "点击 $value")
//用户选择不喜欢原因后,移除广告展示
frameLayout?.removeAllViews()
}
override fun onCancel() {
Log.i(TAG, "dislike 点击了取消")
}
})
})
} else {
if (adViewHolder.mDislike != null) adViewHolder.mDislike?.visibility = View.GONE
}
setDownLoadAppInfo(it, adViewHolder)
//可以被点击的view, 也可以把convertView放进来意味item可被点击
val clickViewList: MutableList<View?> = ArrayList()
clickViewList.add(convertView)
clickViewList.add(adViewHolder.mSource)
clickViewList.add(adViewHolder.mTitle)
clickViewList.add(adViewHolder.mDescription)
clickViewList.add(adViewHolder.mIcon)
//添加点击区域
if (adViewHolder is LargeAdViewHolder) {
clickViewList.add(adViewHolder.mLargeImage)
} else if (adViewHolder is SmallAdViewHolder) {
clickViewList.add(adViewHolder.mSmallImage)
} else if (adViewHolder is VerticalAdViewHolder) {
clickViewList.add(adViewHolder.mVerticalImage)
} else if (adViewHolder is VideoAdViewHolder) {
clickViewList.add(adViewHolder.videoView)
} else if (adViewHolder is GroupAdViewHolder) {
clickViewList.add(adViewHolder.mGroupImage1)
clickViewList.add(adViewHolder.mGroupImage2)
clickViewList.add(adViewHolder.mGroupImage3)
}
//触发创意广告的view(点击下载或拨打电话)
val creativeViewList: MutableList<View?> = ArrayList()
creativeViewList.add(adViewHolder.mCreativeButton)
//重要! 这个涉及到广告计费,必须正确调用。**** convertView必须是com.bytedance.msdk.api.format.TTNativeAdView ****
it.registerViewForInteraction(
ForegroundOrBackground.getTopActivity(),
convertView as ViewGroup,
clickViewList,
creativeViewList,
null,
object : TTNativeAd.AdInteractionListener {
override fun onAdClicked(view: View?, ad: TTNativeAd?) {
Log.i(TAG, "onAdClicked")
}
override fun onAdCreativeClick(view: View?, ad: TTNativeAd?) {
Log.i(TAG, "onAdCreativeClick")
}
override fun onAdShow(ad: TTNativeAd?) {
Log.i(TAG, "onAdShow")
ad?.let {
// PrintUtil.printShowInfo(ad.mediationManager)
}
}
},
adViewHolder.viewBinder
)
adViewHolder.mTitle?.text = it.title //title为广告的简单信息提示
adViewHolder.mDescription?.text = it.description //description为广告的较长的说明
adViewHolder.mSource?.text =
if (TextUtils.isEmpty(it.source)) "广告来源" else it.source
val icon: TTImage? = it.icon
if (icon != null) {
Glide.with(ForegroundOrBackground.getTopActivity()).load(icon.imageUrl)
.into(adViewHolder.mIcon!!)
}
val adCreativeButton = adViewHolder.mCreativeButton
when (it.interactionType) {
TTAdConstant.INTERACTION_TYPE_DOWNLOAD -> {
adCreativeButton?.visibility = View.VISIBLE;
adCreativeButton?.setText(it.buttonText ?: "立即下载")
}
TTAdConstant.INTERACTION_TYPE_DIAL -> {
adCreativeButton?.visibility = View.VISIBLE;
adCreativeButton?.setText("立即拨打");
}
TTAdConstant.INTERACTION_TYPE_LANDING_PAGE,
TTAdConstant.INTERACTION_TYPE_BROWSER -> {
adCreativeButton?.visibility = View.VISIBLE;
adCreativeButton?.setText(it.buttonText ?: "查看详情")
}
else -> {
adCreativeButton?.visibility = View.GONE
Log.i(TAG, "交互类型异常")
}
}
}
}
private fun setDownLoadAppInfo(ttNativeAd: TTFeedAd, adViewHolder: AdViewHolder) {
if (ttNativeAd.complianceInfo == null) {
adViewHolder.app_info?.visibility = View.GONE
} else {
adViewHolder.app_info?.visibility = View.VISIBLE
val appInfo = ttNativeAd.complianceInfo
adViewHolder.app_name?.text = "应用名称:" + appInfo.appName
adViewHolder.author_name?.text = "开发者:" + appInfo.developerName
adViewHolder.package_size?.text = "包大小:不支持"
adViewHolder.permissions_url?.text = "权限url:不支持"
adViewHolder.privacy_agreement?.text = "隐私url:" + appInfo.privacyUrl
adViewHolder.version_name?.text = "版本号:" + appInfo.appVersion
adViewHolder.permissions_content!!.text =
"权限内容:" + getPermissionsContent(appInfo.permissionsMap)
}
}
private fun getPermissionsContent(permissionsMap: Map<String, String>?): String {
if (permissionsMap == null) {
return ""
}
val stringBuffer = StringBuffer()
val keyList = permissionsMap.keys
for (s in keyList) {
stringBuffer.append(
"""$s : ${permissionsMap[s]} """
)
}
return stringBuffer.toString()
}
private class VideoAdViewHolder : AdViewHolder() {
var videoView: FrameLayout? = null
}
private class LargeAdViewHolder : AdViewHolder() {
var mLargeImage: ImageView? = null
}
private class SmallAdViewHolder : AdViewHolder() {
var mSmallImage: ImageView? = null
}
private class VerticalAdViewHolder : AdViewHolder() {
var mVerticalImage: ImageView? = null
}
private class GroupAdViewHolder : AdViewHolder() {
var mGroupImage1: ImageView? = null
var mGroupImage2: ImageView? = null
var mGroupImage3: ImageView? = null
}
private class ExpressAdViewHolder {
var mAdContainerView: FrameLayout? = null
}
open private class AdViewHolder {
var viewBinder: MediationViewBinder? = null
var mIcon: ImageView? = null
var mDislike: ImageView? = null
var mCreativeButton: Button? = null
var mTitle: TextView? = null
var mDescription: TextView? = null
var mSource: TextView? = null
var mLogo: RelativeLayout? = null
var app_info: LinearLayout? = null
var app_name: TextView? = null
var author_name: TextView? = null
var package_size: TextView? = null
var permissions_url: TextView? = null
var privacy_agreement: TextView? = null
var version_name: TextView? = null
var permissions_content: TextView? = null
}
}
\ No newline at end of file
......@@ -138,7 +138,7 @@ class MobileLoginActivity : BaseActivity(), LoginView, View.OnClickListener {
if (isFinishing) return
// false-登录 true-绑定手机号
showToast("登录成功")
showToast("绑定成功")
hideLoading()
......@@ -158,13 +158,8 @@ class MobileLoginActivity : BaseActivity(), LoginView, View.OnClickListener {
}
private fun initView() {
if (TextUtils.equals(enterType, "vip")) {
tv_title.text = "绑定手机号"
tvLoginNext.text = "立即绑定"
} else {
tv_title.text = "手机号登录"
tvLoginNext.text = "立即登录"
}
tv_title.text = "绑定手机号"
tvLoginNext.text = "立即绑定"
iv_left_icon.visibility = View.VISIBLE
iv_left_icon.setImageResource(R.mipmap.ic_arrow_back)
......
......@@ -6,6 +6,7 @@ import android.os.Handler
import android.os.Looper
import android.text.TextUtils
import android.view.View
import android.widget.FrameLayout
import com.daimajia.androidanimations.library.Techniques
import com.daimajia.androidanimations.library.YoYo
import com.duben.miaoquplaylet.R
......@@ -30,6 +31,9 @@ import com.duben.miaoquplaylet.utils.TimeRender
import com.duben.miaoquplaylet.utils.rxutil.CommonRxTask
import com.duben.miaoquplaylet.utils.rxutil.RxjavaUtil
import com.duben.library.utils.nodoubleclick.AntiShake
import com.duben.miaoquplaylet.ad.express.ExpressAdCallback
import com.duben.miaoquplaylet.ad.express.MyExpressManager
import com.duben.miaoquplaylet.utils.UIUtils
import kotlinx.android.synthetic.main.fragment_main_my.*
/**
......@@ -84,6 +88,11 @@ class MyFragment : LazyLoadBaseFragment(), MyView, View.OnClickListener {
if (AppConfig.fragmentClickFlag == Constant.FRAGMENT_CLICK_THREE) {
if (AntiShake.check(ll_my_record?.id)) return
if(userManager.vipFlag){
MyExpressManager.instance.preLoadAd()
showAd()
}
if (!TextUtils.isEmpty(userManager?.userID)) {
myPresenter.showTurn()
myPresenter.getMyInfo()
......@@ -156,7 +165,7 @@ class MyFragment : LazyLoadBaseFragment(), MyView, View.OnClickListener {
iv_my_bind.visibility = View.GONE
} else {
// 未登录
tv_my_account.text = "登录/注册"
tv_my_account.text = "绑定手机号"
iv_my_bind.visibility = View.VISIBLE
}
......@@ -380,4 +389,33 @@ class MyFragment : LazyLoadBaseFragment(), MyView, View.OnClickListener {
}
//----9宫格逻辑--结束--//
private fun showAd() {
MyExpressManager.instance.getAdView(object : ExpressAdCallback {
override fun loadSuccess(adView: FrameLayout?) {
adView?.let {
UIUtils.removeFromParent(it)
fl_ad.removeAllViews()
fl_ad.addView(it)
}
MyExpressManager.instance.preLoadAd()
}
override fun renderSuccess(adView: FrameLayout?): Boolean {
adView?.let {
UIUtils.removeFromParent(it)
fl_ad.removeAllViews()
fl_ad.addView(it)
}
MyExpressManager.instance.preLoadAd()
return false
}
override fun loadFail() {
}
})
}
}
\ No newline at end of file
......@@ -149,7 +149,7 @@
android:layout_marginRight="40dp"
android:background="@drawable/shape_red"
android:gravity="center"
android:text="立即登录"
android:text="绑定手机号"
android:textColor="@color/white"
android:textSize="20sp" />
......
......@@ -40,7 +40,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="10dp"
android:text="登录/注册"
android:text="绑定手机号"
android:textColor="#000000"
android:textSize="20sp"
android:textStyle="bold" />
......@@ -70,10 +70,10 @@
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:visibility="gone"
android:background="@mipmap/bg_my_vip"
android:orientation="vertical"
android:paddingLeft="24dp">
android:paddingLeft="24dp"
android:visibility="gone">
<TextView
android:id="@+id/tv_my_vip"
......@@ -108,11 +108,11 @@
<RelativeLayout
android:id="@+id/rl_lucky"
android:visibility="gone"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:layout_gravity="center_horizontal">
android:visibility="gone">
<com.duben.miaoquplaylet.ui.widgets.luckymonkeypanel.LuckyMonkeyPanelView
android:id="@+id/lucky_panel"
......@@ -141,10 +141,10 @@
</RelativeLayout>
<LinearLayout
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="14dp"
android:layout_marginBottom="10dp"
android:background="@drawable/shape_bg_mobile"
......@@ -212,14 +212,14 @@
android:background="@color/my_color_gray" />
<LinearLayout
android:visibility="gone"
android:id="@+id/ll_my_payrecord"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="20dp"
android:paddingEnd="15dp">
android:paddingEnd="15dp"
android:visibility="gone">
<TextView
android:layout_width="0dp"
......@@ -276,14 +276,14 @@
android:background="@color/my_color_gray" />
<LinearLayout
android:visibility="gone"
android:id="@+id/ll_contactus"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="20dp"
android:paddingEnd="15dp">
android:paddingEnd="15dp"
android:visibility="gone">
<TextView
android:id="@+id/tv_contact"
......@@ -306,6 +306,13 @@
</LinearLayout>
</FrameLayout>
<com.duben.miaoquplaylet.ui.widgets.RoundRectLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_bg_write" />
</LinearLayout>
</ScrollView>
......
......@@ -50,5 +50,6 @@ GROMORE_APP_ID="5418501"
GROMORE_SPLASH_CODE="102412552"
GROMORE_VIDEO_CODE="102412179"
GROMORE_EXPRESS_CODE="102412550"
GROMORE_MYEXPRESS_CODE="102424560"
GROMORE_DRAW_CODE="102412837"
GROMORE_BANNER_CODE="102412551"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment