精华内容
参与话题
问答
  • 10种常见的移动端App广告展现形式

    万次阅读 2019-06-27 14:07:36
    App广告,或称In-App广告,是指智能手机和平板电脑这类移动设备中第三方应用程序内置广告,属于移动广告的子类别。 App广告兴起得益于其载体—App的风行。平板电脑和大屏触摸手机等硬件的普遍使用,WiFi、3G、4G对...

    何为App广告?
    App广告,或称In-App广告,是指智能手机和平板电脑这类移动设备中第三方应用程序内置广告,属于移动广告的子类别。

    10种常见的移动端App广告形式
    App广告兴起得益于其载体—App的风行。平板电脑和大屏触摸手机等硬件的普遍使用,WiFi、3G、4G对流量限制的解放,以及Apple苹果公司App Store生态系统带来的全新交互体验促使App受众和App开发者大幅度增加。对于App开发者,需要一种方式将流量变现,而对于品牌企业, 广告投放需要随消费者注意力迁移,因此,App内置广告应运而生。
    (内容摘自百度百科)
    在这里插入图片描述

    互联网广告的计费方式

    互联网广告可分为两种形式,一种是效果广告,另一种是形象(品牌)广告。

    • 效果广告(通过广告的效果促进消费者行动或消费)
      效果广告
      AIDA 模型流程图

    效果广告是指以效果计费的广告类型,例如用户点击(CPC)、回应(CPP)、注册下载(CPA)、销售数量(CPS)等作为广告的计费衡量标准。

    除了以效果计费的付费形式,还有以千次展现来计费的CPM,以包断时间来计费的CPT。

    常见的广告类型:

    CPM:(Cost Per Mille / Cost Per Thousand)
    每千人成本,这是源自传统媒体的计费方式,结算单位是每千人。
    千人价格=(广告费用/到达人数)×1000。
    CPT:(Cost Per Time)
    按时段收费,也是源自传统媒体的计费方式。
    CPC:(Cost Per Click)
    每点击成本,这是网络广告界一种常见的定价形式,同样也延续到了移动互联网,结算单位是每次点击,适用于效果付费广告形式。
    CPA:(Cost Per Action)
    每行动成本,结算单位是每次激活、下载等动作。
    CPS:(Cost Per Sales)
    每销售成本,以实际销售产品数量来换算广告刊登金额,结算单位是每次订单/每次交易。
    CPP:(Cost Per Person)
    App频控视频广告的计费方式,以有效到达受众为结算单位。这里的有效受众是指主动点击+浏览视频内容+浏览活动信息。

    App广告的常见形式

    1.Banner

    Banner广告又叫横幅广告、通栏广告、广告条。
    常出现位置:顶部、底部。
    优点: 展示更直观,能快速吸引用户注意。
    缺点: 影响用户体验,对内容观看造成一定的遮挡,易造成用户反感。
    计费方式:CPC。
    顶部Banner示意图底部Banner示意图

    2.公告

    这种方式常出现在电商类app上,通过消息广播的形式给用户传递相关信息。
    常出现位置:首页
    优点:直观简洁、不占用内容页。
    缺点:不能直观诱导用户点击,大多情况只能起提示作用。
    计费方式:CPC。
    公告示意图公告示意图

    3.插屏

    一般情况下插屏广告会出现在用户第一次点击某个功能页时弹出,显示需要提示的具体内容。
    常出现位置:首页、未点击的功能页。
    优点:视觉冲击力强、定位更精准、效果显著
    缺点:会暂时打断用户操作行为,影响用户体验。
    计费方式:CPA、CPM、CPC
    插屏示意图插屏示意图

    4.启动页广告

    启动页广告又称全屏广告(Full Screen Ads),几乎在常用的app上都能看到,可以以图片的形式、视频、Flash等形式加载。用户首次进入app时,将会出现启动页,当app后台运行再次进入时,启动页将不会出现。
    常出现位置:首页
    优点
    1.合理利用资源,等待app加载时呈现内容
    2.当用户刚打开启动页时,直接呈现广告内容,能够更好的刺激用户记忆。
    缺点:部分Flash安装包加在缓慢,影响用户体验。
    计费方式:CPM(启动页广告费用一般较高)
    启动页广告示意图启动页广告示意图

    5.信息流广告

    信息流广告(Feeds Ads),这种广告伴随着信息而出现,用户在浏览信息时会不经意间浏览到广告。
    常出现位置:以TimeLine信息为主的内容列表里。在社交类App和新闻类App上,信息流广告尤为明显,常见的有微博、贴吧、百度、今日头条等,都有。
    优点:不影响用户操作行为。
    缺点:内容定位不精准会让用户产生厌恶情绪。
    信息流广告示意图信息流广告示意图

    6.积分广告

    这种广告形式主要是通过下载注册赢取部分积分或优惠,以流量导流的方式把自身一部分用户流量导向目标app,实现流量变现。除此之外,一些第三方平台为了高额的广告收入,通过积分或话费的奖励形式,来激励用户下载推广的APP。
    常出现位置:部分移动端游戏、应用商店等app。
    优点:通过积分的方式实现互利共赢。
    缺点:品牌信誉度不强的情况下,容易让用户怀疑目标app的安全性,严重情况下会影响品牌形象。
    计费方式:CPA(例如注册下载),只要肯花钱,很容易就上到AppStore排行版,很多APP通过积分墙进行推广和刷榜。
    积分广告示意图

    7.视频广告

    视频广告针对的用户群体分为VIP用户和普通用户,VIP用户在购买VIP业务后能够直接跳过广告,普通用户则需要先把广告看完才能看后面的内容。所以,这种广告方式收入渠道分为两种:一种是会员业务,另一种是视频广告。
    常出现位置:播放类app内容开头。
    优点:以内嵌的形式植入广告,不增加额外的内容板块。
    缺点:普通用户(不愿意付费购买VIP业务)长时间观看会影响用户体验。
    在这里插入图片描述

    8.竞价排名

    竞价排名的基本特点是按点击付费,推广信息出现在搜索(靠前)的结果中,如果没有被用户点击,则不收取推广费。
    常出现位置:搜索引擎的搜索结果,如百度、UC、360、搜狗。
    优点:见效快、关键词数量无限制、关键词不分难易程度。
    缺点:搜索结果是以资金衡量,出现结果难免会造成用户意愿不匹配,影响用户体验。
    计费方式:CPC
    竞价排名广告示意图竞价广告示意图

    9.下拉刷新

    当列表内容需要刷新的时候,一般app会采用下拉刷新的形式刷新列表。广告便会填充空白页,达到宣传效果。
    常出现位置:下拉刷新栏。
    优点:隐藏在内容页面板下,用户刷新才会出现,节约空间成本,不影响用户体验。
    缺点:广告出现时间过短,不容易引起用户注意。
    下来刷新广告示意图下拉刷新广告示意图

    10、私信通知广告

    以私信的形式将商品信息发送给用户,用户可以通过查看私信了解商品详情。
    常出现位置:消息功能。
    优点:具有精准性,通过后台分析用户洗好发送特定商品。
    缺点:常常忽略用户需求,增大用户筛选成本。
    私信广告示意图
    以上图片仅做示意图使用,没有任何推广的意思,也没有任何侵权的意思,如果真的觉得被侵权了,私信删除!

    随着信息科技的进化,以及5G网络的商用、智能设备的进化,今后肯定会出现更多的广告形式,在这个到处充满着信息的空间里,到处都有流量,也就意味着后期会持续不断的出现的新的广告花样!

    展开全文
  • 互联网广告行业术语及缩写

    万次阅读 2017-06-16 16:59:35
    4A
    4A American Association of Advertising Agencies 美国广告代理协会
     ADX  AD eXchange 广告交易平台 
     ad group 广告组 
     ADN AD Network 广告网络 
     ad placement 广告放置 
     ad safety 广告安全 
     affiliate 联盟 
     agreement-based advertising 合约广告 
     AUC Area Under Curve 曲线下面积 
     auction-based advertising 竞价广告 
     audience targeting 受众定向 
     ASN Average Show Number 
     BoW Bag of Words 词袋 
     banner ad 橫幅「告 
     bayesian learning 贝叶斯学习 
     BT Behaviorial Targeting 行为定向 
     bid term 竞价关键词 
     brand awareness 品牌广告 
     call out optimization 询价优化 
     campaign 广告计划 
     CoEC Click on Expected Click 
     CoPC Click on Predicted Click 
     CTR Click Through Rate 点击率 
     click value 愿击价值 
     CF Collaborative Filtering 协同过滤 
     compact allocation plan 紧凑分配方案 
     constrained optimization 带约束优化 
     content as ad 内容即广告 
     CDN Content Delivery Network 内容分发网络 
     contextual advertising 上下文庁告 
     contextual targeting 上下文定向 
     CVR Conversion Rate 转化率 
     CPA Cost per Action 按转化付费 
     CPC Cost per Click 按点击付费 
     CPM Cost per Mille 按千次展示付费 
     CPS Cost per Sale 按精售額付費 
     CPT Cost per Time 按时间付费 
     creative 广告创意 
     CRM Customer Relation Management 客户关系管理 
     customized audience segmentation Elle,TFF & 
     data exchange 數掘交易平台 
     DMIP Data Management Platform 数据管理平台 
     demand 需求方 
     demand constraint 需求约束 
     DSP Demand Side Platform 需求方平台 
     demographical targeting 人口属性定向 
     direct response 直接效果广告 
     display advertising 展示广告 
     downhill simplex method 下降单纯形法 
     dynamic allocation 动态分配 
     EDM E-mail Direct Marketing 邮件定向营销广告 
     EM Expectation-Maximization 最大期望 
     EC Expected Click 期望点击 
     eCPM Expected Cost per Mille 千次展示期望收入  
     experimentation framework 实验框架 
     ESKE Explore and Exploit 探索与利用 
     frequency capping 频次控制 
     GaP Gamma-Poisson Y泊松 
     GLIMI Generalized Linear Model 广义线性模型 
     GSP Generalized Second Price 广义第二高价 
     geo-targeting 地域定向 
     gradient descent 柳度下降法 
     GD Guaranteed Delivery 担保式投送 
     HVM High Water Mark 高水位算法 
     hyper-local targeting 精确位置定向 
     IDFA Identifier for Advertising 广告专用用户标识符
     IIS Improved Iterative Scaling 改述的迭代縮放 
     IR Information Retrieval 信息检索 
     integrated marketing 整合营销 
     IMEI International Mobile Equipment Identity 
     IADB Interactive Advertising Bureau 交互广告局 
     inventory 库存 
     IDF Inverse Document Frequency 例数文档频率 
     landing page 落地页 
     LDA Latent Dirichlet Allocation 潜在狄利克雷分配 
     LSA Latent Semantic Analysis 潜在语义分析 
     L-BFGS  Limited-memory BFGS f] Pop*g {f BFGS 
     LR Logistic Regression 逻辑回归 
     look-alike 新客推荐 
     ML Machine Learning 机器学习 
     MRP Market Reserve Price 市场保留价 
     MRA Maximal Representative Allocation 最大代表性分配 
     MAP  Maximinuunn a Posterior 最大后驗概率 
     ME Maximum Entropy 最大熵 
     mechanism design 机制设计 
     media buying platform 媒介采买平台 
     ML Mixture Model 混合模型 
     MoG Mixture of Gaussians 高斯混合模型 
     mobile ad 移动广告 
     MAB  Multi-Arm Bandit 多臂老虎机 
     native ad 原生广告 
     network optimization 网络优化 
     NFP North Foot Print 北区广告平均条数
     off-site recommendation 站外推荐 
     online allocation 在线分配 
     PII Personal Identifiable Information 个人可辨识信息 
     personalized recommendation 个性化推荐 
     personalized retargeting 个性化重定向 
     position auction 位置拍卖 
     PR Precision/Recall 
     preferred deals 优选 
     premium sales 优先销售 
     pricing 定价 
     PMP Private Marketplace 私有交易市场 
     PILSII  Probabilistic Latent Semantic Indexing 
     programmatic trade 程序化交易 
     query 查询 
     reach 到达率 
     RTB  Real Time Bidding 实时竟价 
     ROC Receive Operating Characteristic 接收机操作特性 
     remnant inventory 剩余流量 
     retargeting 重定向 
     ROI Return on Investinent 投入产出比 
     RPM Revenue per Mille 千次展示收益 
     rich media ad 富媒体广告 
     search ad 搜索广告 
     SEM Search engine marketing 搜索引擎背銷 
     search retargeting 搜索重定向 
     second price 第二高价 
     SVD Singular Value Decomposition 奇昇值分解 
     site retargeting 网站重定向 
     social ad 社交广告 
     sponsored search 付费搜索 
     SGD Stochastic Gradient Descent 随机様度下降 
     stream computing 流计算 
     sufficient statistics 充分統計量 
     supply 供给方 
     supply constraint 供给约束 
     SSP Supply Side Platform 供给方平台 
     targeted advertising 定向广告 
     TD Trading Desk 交易终端 
     TF Term Frequency 词频 
     textual ad 文字链广告 
     topic model 文本主题模型 
     traffic forecasting 流量预测 
     TP Traffic Protection 流量保护 
     traffic shaping 流量塑形 
     UCB Upper Confidence Bound 置信上界 
     VSM Vector Space Model 向量空间模型 
     vertical ad network 垂直广告网络 
     VCG Vickrey - Clarke - Groves 
     video ad 视频广告 
     WA Web Analytics 网站分析 
    展开全文
  • 穿山甲(巨量引擎)广告接入

    千次阅读 2019-10-21 16:08:46
    文章目录前言开屏广告Banner广告插屏广告激励广告(看视频)信息流广告(列表页)集成部分build.gradleSDK下载最后 前言 这边乍一看是一个简单的搬砖,可实际上,笔者还是踩了点坑,这里就写下示例代码,一般下次...

    前言

    这边乍一看是一个简单的搬砖,可实际上,笔者还是踩了点坑,这里就写下示例代码,一般下次查阅,也希望能帮到广大读者。

    PS:这里最值得注意的是,虽然官方提供的示例代码众多,但是实际情况下,我们能够使用的是TTAdNative(原生广告)以下全部为该类型广告,可能是笔者接触较少,不知道其他广告的使用方法,如果有使用到其他方式并成功调用者,请不吝赐教。

    开屏广告

    kp

      //开屏广告加载超时时间,建议大于3000,这里为了冷启动第一次加载到广告并且展示,示例设置了3000ms
      	 	private val AD_TIME_OUT = 3000
            val createAdNative = TTAdSdk.getAdManager().createAdNative(this)
            //step3:创建开屏广告请求参数AdSlot,具体参数含义参考文档
            val adSlot = AdSlot.Builder()
                .setCodeId("5029535")
                .setSupportDeepLink(true)
                .setImageAcceptedSize(1080, 1920)
                .build()
            createAdNative.loadSplashAd(adSlot, object : TTAdNative.SplashAdListener {
                override fun onSplashAdLoad(ad: TTSplashAd?) {
                    if (null == ad) return
                    //RxToast.showToast("开屏广告请求成功")
                    //获取SplashView
                    val view = ad?.splashView
                    if (view != null) {
                        mSplashContainer.removeAllViews()
                        //把SplashView 添加到ViewGroup中,注意开屏广告view:width >=70%屏幕宽;height >=50%屏幕宽
                        mSplashContainer.addView(view)
                        //设置不开启开屏广告倒计时功能以及不显示跳过按钮,如果这么设置,您需要自定义倒计时逻辑
                        //ad.setNotAllowSdkCountdown();
                    } else {
                        launchActivity<MainActivity> {}
                        finish()
                    }
    
                    //设置SplashView的交互监听器
                    ad.setSplashInteractionListener(object : TTSplashAd.AdInteractionListener {
                        override fun onAdClicked(view: View, type: Int) {
    
                            //RxToast.showToast("开屏广告点击")
                        }
    
                        override fun onAdShow(view: View, type: Int) {
                            //RxToast.showToast("开屏广告展示")
                        }
    
                        override fun onAdSkip() {
                            //RxToast.showToast("开屏广告跳过")
                            launchActivity<MainActivity> {}
                            finish()
                        }
    
                        override fun onAdTimeOver() {
                            launchActivity<MainActivity> {}
                            finish()
                        }
                    })
                    if (ad?.interactionType === TTAdConstant.INTERACTION_TYPE_DOWNLOAD) {
                        ad?.setDownloadListener(object : TTAppDownloadListener {
                            internal var hasShow = false
    
                            override fun onIdle() {
    
                            }
    
                            override fun onDownloadActive(
                                totalBytes: Long,
                                currBytes: Long,
                                fileName: String,
                                appName: String
                            ) {
                                if (!hasShow) {
                                    //RxToast.showToast("下载中...")
                                    hasShow = true
                                }
                            }
    
                            override fun onDownloadPaused(
                                totalBytes: Long,
                                currBytes: Long,
                                fileName: String,
                                appName: String
                            ) {
                                //RxToast.showToast("下载暂停...")
    
                            }
    
                            override fun onDownloadFailed(
                                totalBytes: Long,
                                currBytes: Long,
                                fileName: String,
                                appName: String
                            ) {
                                //RxToast.showToast("下载失败...")
                            }
    
                            override fun onDownloadFinished(totalBytes: Long, fileName: String, appName: String) {
    
                            }
    
                            override fun onInstalled(fileName: String, appName: String) {
    
                            }
                        })
                    }
                }
    
                override fun onTimeout() {
                    //RxToast.showToast("广告:onTimeout")
                    launchActivity<MainActivity> {}
                    finish()
                }
    
                override fun onError(p0: Int, p1: String?) {
                    //RxToast.showToast("广告:onTimeout")
                    launchActivity<MainActivity> {}
                    finish()
                }
            }, AD_TIME_OUT)
        }
    

    开屏广告最简单,我们只需要点完成即可,需要注意的是生成后的广告位ID能对应得上即可
    setCodeId("5029535")id

    Banner广告

    同上是原生广告

    不同的

    1. 监听器有所不同NativeAdListener
    2. setImageAcceptedSize一定要与下放后红框内标的值一样
    3. setNativeAdType设置成AdSlot.TYPE_BANNER

    banner

        //step2:创建TTAdNative对象,createAdNative(Context context) banner广告context需要传入Activity对象
        val mTTAdNative: TTAdNative by lazy {
            TTAdSdk.getAdManager().createAdNative(requireContext())
        }
        //广告部分
        private fun loadBannerAd(codeId: String) {
    //        binding.mBannerContainer
            //step4:创建广告请求参数AdSlot,具体参数含义参考文档
            val adSlot = AdSlot.Builder()
                .setCodeId(codeId) //广告位id
                .setSupportDeepLink(true)
                .setNativeAdType(AdSlot.TYPE_BANNER)
                .setAdCount(3) //请求广告数量为1到3条
    //            .setExpressViewAcceptedSize(350F,350F) //期望模板广告view的size,单位dp
                .setImageAcceptedSize(600, 300)
                .build()
    //         Caused by: java.lang.IllegalArgumentException: 必须设置请求原生广告的类型,目前支持TYPE_BANNER和TYPE_INTERACTION_AD
            //step5:请求广告,对请求回调的广告作渲染处理
            mTTAdNative.loadNativeAd(adSlot, object : TTAdNative.NativeAdListener {
                override fun onNativeAdLoad(ads: MutableList<TTNativeAd>?) {
                    if (ads == null || ads.isEmpty()) {
                        return
                    }
                    val imageUrls = ads.map { ad ->
                        ad.imageList[0].imageUrl
                    }
    //                val imageList = ads[0].imageList
                    Log.i("onNativeAdLoad", "ads.size:${ads.size}")
                    Log.i("onNativeAdLoad", "imageUrls.size:${imageUrls.size}")
                    binding.banner.apply {
                        setImageLoader(GlideImageLoader())
                        setImages(
                            imageUrls
    //                        arrayListOf(
    //                            "https://up.enterdesk.com/edpic_360_360/0f/18/15/0f18151ad295ecd910291beca5f54dd0.jpg",
    //                            "https://up.enterdesk.com/edpic_360_360/06/ab/c9/06abc90dd7ebd86a2a928baae0725303.jpg"
    //                        )
    
                        )
                        //banner设置方法全部调用完毕时最后调用
                        start()
                    }
    //                val banner = Class.forName("com.youth.banner.Banner")
    //                val field = banner.getDeclaredField("imageViews")
    //                field.isAccessible = true
    //                val imageViews = field.get(banner) as List<View>
                    //重要! 这个涉及到广告计费,必须正确调用。convertView必须使用ViewGroup。
    //                Log.i("onError", "imageViews:"+imageViews.toString())
                    val imageViews = arrayListOf<View>()
                    //现在要获取字段day02b的值
                    val declaredFields = binding.banner.javaClass.declaredFields
                    try {
                        declaredFields.forEach { field ->
                            val name = field.name
                            if (name == "imageViews") {
                                //用于获取private成员变量
                                field.isAccessible = true
                                Log.i("declaredFields", "字段名称: :$name")
    
                                //字段值
                                val o = field.get(binding.banner) as List<View>
                                imageViews.addAll(o)
                                Log.i("declaredFields", "要获取字段的值:$o")
                            }
                        }
    
                    } catch (e: IllegalAccessException) {
                        e.printStackTrace()
                    }
    
    
                    ads.forEach {
                        it.registerViewForInteraction(
                            binding.banner as ViewGroup,
                            imageViews,
                            imageViews,
                            object : TTNativeAd.AdInteractionListener {
                                override fun onAdClicked(view: View, ad: TTNativeAd?) {
                                    //RxToast.showToast("onAdClicked")
                                }
    
                                override fun onAdCreativeClick(view: View, ad: TTNativeAd?) {
                                    //RxToast.showToast("onAdCreativeClick")
                                }
    
                                override fun onAdShow(ad: TTNativeAd?) {
                                    //RxToast.showToast("onAdShow")
                                }
                            })
                    }
                }
    
                override fun onError(code: Int, message: String) {
    //                //RxToast.showToast("load error : $code, $message")
                    Log.i("onError", "load error : $code, $message")
                }
    
            })
    
    //        mTTAdNative.loadNativeExpressAd(adSlot, object : TTAdNative.NativeExpressAdListener {
    //            override fun onNativeExpressAdLoad(ads: MutableList<TTNativeExpressAd>?) {
    //                Log.i("onNativeAdLoad", ads.toString())
    //            }
    //
    //
    //            override fun onError(code: Int, message: String) {
    //                //RxToast.showToast("load error : $code, $message")
    //                Log.i("load error : $code, $message")
    //            }
    //
    //        })
    
    // Caused by: java.lang.IllegalArgumentException: 请求非原生广告的类型,请勿调用setNativeAdType()方法
    //        mTTAdNative.loadBannerExpressAd(adSlot, object : TTAdNative.NativeExpressAdListener {
    //
    //            override fun onError(code: Int, message: String) {
    //                //RxToast.showToast("load error : $code, $message")
    //                mBannerContainer.removeAllViews()
    //            }
    //
    //            override fun onNativeExpressAdLoad(ads: MutableList<TTNativeExpressAd>?) {
    //                //RxToast.showToast("load error : 请求成功 ads?.size:${ads?.size}")
    //            }
    //
    //        })
        }
    

    插屏广告

    cp
    PS:就是App进入首页后突然传出一个窗口,让你想秒关的哪个广告。

    1. 和Banner广告比,这个除了type为AdSlot.TYPE_INTERACTION_AD其他基本一致。
    2. setImageAcceptedSize(600, 600)和上图的所标注的1:1x相对于即可。
    
    
        /**
         * 加载插屏广告
         */
        private fun loadInteractionAd(codeId: String) {
            //step4:创建插屏广告请求参数AdSlot,具体参数含义参考文档
            val adSlot = Builder()
                .setCodeId(codeId)
                .setSupportDeepLink(true)
                .setAdCount(1) //请求广告数量为1到3条
                .setImageAcceptedSize(600, 600) //根据广告平台选择的尺寸,传入同比例尺寸
                .setNativeAdType(AdSlot.TYPE_INTERACTION_AD)
                .build()
            //step5:请求广告,调用插屏广告异步请求接口
            val mTTAdNative = TTAdSdk.getAdManager().createAdNative(this)
            mTTAdNative.loadNativeAd(adSlot, object : TTAdNative.NativeAdListener {
                override fun onNativeAdLoad(ads: MutableList<TTNativeAd>?) {
                    Log.i("onNativeAdLoad", Gson().toJson(ads))
                    if (ads == null || ads.isEmpty()) {
                        return
                    }
                    showAd(ads[0])
                }
    
                override fun onError(code: Int, message: String) {
                    //RxToast.showToast("load error : $code, $message")
                    Log.i("onError", "load error : $code, $message")
                }
            })
        }
    
    //==============================自定义一个对话框===========================================
        lateinit var mAdDialog: Dialog
        private fun showAd(ad: TTNativeAd) {
            Log.i("onNativeAdLoad", Gson().toJson(ad))
            mAdDialog = Dialog(this, R.style.native_insert_dialog)
            mAdDialog.setCancelable(true)
            mAdDialog.setContentView(R.layout.native_insert_ad_layout)
            val mRootView = mAdDialog.findViewById<ViewGroup>(R.id.native_insert_ad_root)
            val mAdImageView = mAdDialog.findViewById<ImageView>(R.id.native_insert_ad_img)
            //限制dialog 的最大宽度不能超过屏幕,宽高最小为屏幕宽的 1/3
            val dm = this.resources.displayMetrics
            val maxWidth = dm?.widthPixels ?: 0
            val minWidth = maxWidth / 3
            mAdImageView.setMaxWidth(maxWidth)
            mAdImageView.setMinimumWidth(minWidth)
            mAdImageView.setMinimumHeight(minWidth)
            val iv = mAdDialog.findViewById<ImageView>(R.id.native_insert_ad_logo)
            //绑定关闭按钮
            val stream = ByteArrayOutputStream()
            try {
                ad.adLogo.compress(Bitmap.CompressFormat.PNG, 100, stream)
                Glide.with(this)
                    .load(stream.toByteArray())
                    .into(iv)
            } catch (e: Exception) {
            } finally {
                try {
                    stream.close()
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
    
            ad.registerViewForInteraction(mRootView, listOf(mAdImageView), listOf(mAdImageView),
                object : TTNativeAd.AdInteractionListener {
                    override fun onAdShow(p0: TTNativeAd?) {
    
                    }
    
                    override fun onAdCreativeClick(p0: View?, p1: TTNativeAd?) {
                        mAdDialog.dismiss()
                    }
    
                    override fun onAdClicked(p0: View?, p1: TTNativeAd?) {
                        mAdDialog.dismiss()
                    }
    
                })
            if (ad.imageList != null && !ad.imageList.isEmpty()) {
                val image = ad.imageList[0]
                if (image != null && image.isValid) {
                    Glide.with(MainActivity@ this).load(image.imageUrl).into(mAdImageView)
                }
            }
            mAdDialog.show()
        }
    

    激励广告(看视频)

    PS: 代码部分要与创建时一一对应
    jl
    对应

        private var mHasShowDownloadActive = false
        private fun loadAd(function: (rewardVerify: Boolean) -> Unit) {
    //        function(true)
    //        return
            //step4:创建广告请求参数AdSlot,具体参数含义参考文档
            val adSlot = AdSlot.Builder()
    //            .setCodeId("927650269")
                .setCodeId("929535513")
                .setSupportDeepLink(true)
                .setImageAcceptedSize(1080, 1920)
                .setRewardName("语音包解锁") //奖励的名称
                .setRewardAmount(1)  //奖励的数量
                .setUserID("12768")//用户id,必传参数
                .setMediaExtra("media_extra") //附加参数,可选
                .setOrientation(TTAdConstant.VERTICAL) //必填参数,期望视频的播放方向:TTAdConstant.HORIZONTAL 或 TTAdConstant.VERTICAL
                .build()
    
            //step5:请求广告
            mTTAdNative.loadRewardVideoAd(adSlot, object : TTAdNative.RewardVideoAdListener {
                override fun onError(code: Int, message: String) {
                    //RxToast.showToast(message)
                }
    
                //视频广告加载后,视频资源缓存到本地的回调,在此回调后,播放本地视频,流畅不阻塞。
                override fun onRewardVideoCached() {
                    //RxToast.showToast("rewardVideoAd video cached")
                }
    
                //视频广告的素材加载完毕,比如视频url等,在此回调后,可以播放在线视频,网络不好可能出现加载缓冲,影响体验。
                override fun onRewardVideoAdLoad(ad: TTRewardVideoAd) {
                    //RxToast.showToast("rewardVideoAd loaded")
                    ad.setRewardAdInteractionListener(object : TTRewardVideoAd.RewardAdInteractionListener {
    
                        override fun onAdShow() {
                            //RxToast.showToast("rewardVideoAd show")
                        }
    
                        override fun onAdVideoBarClick() {
                            //RxToast.showToast("rewardVideoAd bar click")
                        }
    
                        override fun onAdClose() {
                            //RxToast.showToast("rewardVideoAd close")
                            function(false)
                        }
    
                        //视频播放完成回调
                        override fun onVideoComplete() {
                            //RxToast.showToast("rewardVideoAd complete")
                        }
    
                        override fun onVideoError() {
                            //RxToast.showToast("rewardVideoAd error")
                        }
    
                        //视频播放完成后,奖励验证回调,rewardVerify:是否有效,rewardAmount:奖励梳理,rewardName:奖励名称
                        override fun onRewardVerify(rewardVerify: Boolean, rewardAmount: Int, rewardName: String) {
                            RxToast.showToast("激活" + if (rewardVerify) "成功" else "失败")
                            Log.i(
                                "onRewardVerify", "verify:" + rewardVerify + " amount:" + rewardAmount +
                                        " name:" + rewardName
                            )
                            function(rewardVerify)
                        }
    
                        override fun onSkippedVideo() {
                            //RxToast.showToast("rewardVideoAd has onSkippedVideo")
                        }
                    })
                    ad.showRewardVideoAd(requireActivity())
                    ad.setDownloadListener(object : TTAppDownloadListener {
                        override fun onIdle() {
                            mHasShowDownloadActive = false
                        }
    
                        override fun onDownloadActive(
                            totalBytes: Long,
                            currBytes: Long,
                            fileName: String,
                            appName: String
                        ) {
                            if (!mHasShowDownloadActive) {
                                mHasShowDownloadActive = true
                                //RxToast.showToast("下载中,点击下载区域暂停")
                            }
                        }
    
                        override fun onDownloadPaused(
                            totalBytes: Long,
                            currBytes: Long,
                            fileName: String,
                            appName: String
                        ) {
                            //RxToast.showToast("下载暂停,点击下载区域继续")
                        }
    
                        override fun onDownloadFailed(
                            totalBytes: Long,
                            currBytes: Long,
                            fileName: String,
                            appName: String
                        ) {
                            //RxToast.showToast("下载失败,点击下载区域重新下载")
                        }
    
                        override fun onDownloadFinished(totalBytes: Long, fileName: String, appName: String) {
                            //RxToast.showToast("下载完成,点击下载区域重新下载")
                        }
    
                        override fun onInstalled(fileName: String, appName: String) {
                            //RxToast.showToast("安装完成,点击下载区域打开")
                        }
                    })
                }
            })
        }
    
        val mTTAdNative: TTAdNative by lazy {
            TTAdSdk.getAdManager().createAdNative(requireActivity())
        }
    

    信息流广告(列表页)

    直接点完成即可
    xxl

    val ads = arrayListOf<TTFeedAd>()
        lateinit var mTTAdNative: TTAdNative
        /**
         * 加载feed广告
         */
        private fun loadListAd() {
            mTTAdNative = TTAdSdk.getAdManager().createAdNative(requireActivity())
            //step4:创建feed广告请求类型参数AdSlot,具体参数含义参考文档
            val adSlot = AdSlot.Builder()
    //            .setCodeId("927650179")
                .setCodeId("929535710")
                .setSupportDeepLink(true)
                .setImageAcceptedSize(228, 150)
                .setAdCount(3) //请求广告数量为1到3条11
                .build()
            //step5:请求广告,调用feed广告异步请求接口,加载到广告后,拿到广告素材自定义渲染
            mTTAdNative.loadFeedAd(adSlot, object : TTAdNative.FeedAdListener {
                override fun onFeedAdLoad(ads: MutableList<TTFeedAd>?) {
                    if (ads == null || ads.isEmpty()) {
                        Log.i("loadFeedAd", "on FeedAdLoaded: ad is null!")
                        return
                    }
                    Log.i("loadFeedAd", "FeedAdLoaded: ad is null!ads ===============" + ads.size)
                    if (ads.size <= 0) return
                    this@VpItemFragment.ads.addAll(ads)
                    myBaseQuickAdapter.notifyDataSetChanged()
                }
    
                override fun onError(code: Int, message: String) {
                    Log.i("loadFeedAd", "code: :$code  message :$message")
                }
            })
        }
        //========================Adapter======================
        val myBaseQuickAdapter =
            object : BaseQuickAdapter<File, VpBaseViewHolder>(R.layout.layout_vp_item) {
                override fun convert(helper: VpBaseViewHolder?, item: File) {
                    val adView = helper!!.getView<ImageView>(R.id.ad)
                    val videView = helper!!.getView<ViewGroup>(R.id.videView)
                    adView.visibility = View.GONE
                    videView.visibility = View.GONE
                    val num = helper?.layoutPosition ?: 0
                    if (ads.size > 0 && num < ads.size)
                        if (num == 0 || num % 2 == 0) {
                            val ad = ads[num]
                            if (ad == null) {
    
                            } else if (
                                ad.imageMode == TTAdConstant.IMAGE_MODE_SMALL_IMG
                                || ad.imageMode == TTAdConstant.IMAGE_MODE_LARGE_IMG
                                || ad.imageMode == TTAdConstant.IMAGE_MODE_GROUP_IMG
                                || ad.imageMode == TTAdConstant.IMAGE_MODE_VERTICAL_IMG
                            ) {
                                ad.registerViewForInteraction(
                                    helper.itemView as ViewGroup,
                                    listOf(adView),
                                    listOf(adView),
                                    object : TTNativeAd.AdInteractionListener {
                                        override fun onAdClicked(view: View, ad: TTNativeAd?) {
                                            if (ad != null) {
    //                                        RxToast.showToast("广告" + ad.title + "被点击")
                                            }
                                        }
    
                                        override fun onAdCreativeClick(view: View, ad: TTNativeAd?) {
                                            if (ad != null) {
    //                                        RxToast.showToast("广告" + ad.title + "被创意按钮被点击")
                                            }
                                        }
    
                                        override fun onAdShow(ad: TTNativeAd?) {
                                            if (ad != null) {
    //                                        RxToast.showToast("广告" + ad.title + "展示")
                                            }
                                        }
                                    })
                                Glide.with(this@VpItemFragment).load(ad.imageList[0].imageUrl)
                                    .into(adView.apply { visibility = View.VISIBLE })
                            } else if (ad.imageMode == TTAdConstant.IMAGE_MODE_VIDEO) {
                                val video = ad.getAdView()
                                if (video != null) {
                                    if (video.parent == null) {
                                        videView.removeAllViews()
                                        videView.addView(video)
                                    }
                                }
                                videView.visibility = View.VISIBLE
                                ad.registerViewForInteraction(
                                    helper.itemView as ViewGroup,
                                    listOf(video),
                                    listOf(video),
                                    object : TTNativeAd.AdInteractionListener {
                                        override fun onAdClicked(view: View, ad: TTNativeAd?) {
                                            if (ad != null) {
    //                                        RxToast.showToast("广告" + ad.title + "被点击")
                                            }
                                        }
    
                                        override fun onAdCreativeClick(view: View, ad: TTNativeAd?) {
                                            if (ad != null) {
    //                                        RxToast.showToast("广告" + ad.title + "被创意按钮被点击")
                                            }
                                        }
    
                                        override fun onAdShow(ad: TTNativeAd?) {
                                            if (ad != null) {
    //                                        RxToast.showToast("广告" + ad.title + "展示")
                                            }
                                        }
                                    })
                            } else {
    //                            RxToast.showToast("图片展示样式错误")
                            }
                        } 
                }
            }
    

    有人会好奇这个videView是什么,其实就是一个简单的FrameLayout 而已
    videoView

    集成部分

    manifest

    //权限
        <uses-permission android:name="android.permission.VIBRATE"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.CALL_PHONE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.CAMERA"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 获取网络状态 -->
        <uses-permission android:name="android.permission.INTERNET"/> <!-- 网络通信 -->
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 获取设备信息 -->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 获取MAC地址 -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 读写sdcard,storage等等 -->
        <uses-permission android:name="android.permission.RECORD_AUDIO"/> <!-- 允许程序录制音频 -->
        <uses-permission android:name="android.permission.GET_TASKS"/>
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <!-- 如果有视频相关的广告且使用textureView播放,请务必添加,否则黑屏 -->
        <uses-permission android:name="android.permission.WAKE_LOCK"/>
        <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
        <uses-permission
                android:name="android.permission.PACKAGE_USAGE_STATS"
                tools:ignore="ProtectedPermissions"/>
    //7.0权限            
    <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/file_paths"/>
    </provider>
    
    

    build.gradle

        //广告
        implementation(name: 'open_ad_sdk', ext: 'aar')
        implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.6'
    

    SDK下载

    穿山甲联盟Android SDK

    最后

    这些是Kotlin代码,当然穿山甲Demo使用的是Java语言,17年到现在已经有两年的时间了,Kotlin的发展大家有目共睹,真的建议使用Kotlin开发。

    展开全文
  • 最近发现了一款软件叫作adbyby,

    最近发现了一款软件叫作adbyby,可以用来屏蔽网站及视频前的广告,使用了一下,感觉效果不错,看视频再也不用看广告了,最重要的是,软件支持linux及Openwrt,可以安装在路由器上。折腾了一个上午,终于成功的部署在了路由器上,下面是在路由器上安装部署的步骤:


    1. 下载adbyby,下载页面为:http://www.adbyby.com/。注意,下载的时候要注意自己的硬件平台哦,我的路由器是ar71xx的,于是我就下载了ar71xx平台的版本:

    2. 将下载的文件(openwrt.tar.gz)上传到路由器,当然,如果你的路由器已经连通了互联网,也可以直接下载,方法是使用一下命令:wget http://info.adbyby.com/download/openwrt.tar.gz

    3. 解压缩: tar -zvxf openwrt.tar.gz

    4. 移动解压出来的bin文件夹到/usr/share : mv bin /usr/share/adbyby

    5. 进入/usr/share/adbyby目录: cd /usr/share/adbyby

    6. 至此,adbyby就算安装完成了,如果要求不高,就已经可以使用了,使用方法是直接运行/usr/share/adbyby/adbyby,然后在pc上设置http代理,指向路由器的8118端口就行了。如果希望客户端不做任何设置就能享受到广告屏蔽的效果,并且每次都不用手动启动adbyby那就继续往下看。

    7. 在/usr/share/adbyby目录创建三个文件:

    文件1:show-state,内容如下:

    ps | grep "/usr/share/adbyby/adbyby" | grep -v grep

    文件2:start-adbyby,内容如下:

    /usr/share/adbyby/adbyby &> /tmp/log/adbyby.log &
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8118

    文件3:stop-adbyby,内容如下:

    ps | grep "/usr/share/adbyby/adbyby" | grep -v 'grep' | awk '{print $1}' | xargs kill -9
    iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8118

    8. 给上一步中的三个文件赋予可执行的权限:

    chmod +x show-state

    chmod +x start-adbyby

    chmod +x stop-adbyby

    9.  在/etc/init.d/下创建文件adbyby,内容如下:

    #!/bin/sh /etc/rc.common
    START=80
    start() {
        echo "starting adbyby..."
        /usr/share/adbyby/start-adbyby
    }
    stop() {
        echo "stopping adbyby..."
         /usr/share/adbyby/stop-adbyby
    }
    restart() {
        stop
        sleep 1
        start
    }

    10. 赋予/etc/init.d/adbyby可执行的权限

    chmod +x /etc/init.d/adbyby

    11. 在/etc/rc.d/下建立一个到/etc/init.d/adbyby的链接:

     ln -s /etc/init.d/adbyby S80adbyby

    12. 重启路由器,检验使用效果。



    展开全文
  • 上网页面被强制广告——简单分析

    万次阅读 2015-05-02 00:55:13
    一、现象描述事情起因很简单,最近家里打开网页,老发现有点不正常,火狐打开页面鼠标在上面随便点击一下,立马弹出广告,起初认为可能是浏览器问题或者机器中招了,后来看了一下系统没问题,换了几个浏览器发现还是...
  • 广告

    2009-06-22 13:27:00
    欢迎大家来http://feed.feedsky.com/sspace_cv9x 点击广告,这个博客是我本科的boss,非常nice的一个老师开的,里面有很多小师妹的pp,欢迎帮顶,谢谢大家 转载于:...
  • 广告的定义及其目的

    千次阅读 2018-10-19 22:13:43
      William F.Arens在《 当代广告学》中给出的定义:广告是由已确定的出资人通过各种媒介进行的有关产品(商品、服务和观点)的, 通常是有偿的、有组织的、综合的、劝服性的非人员的信息传播活动。   定义中有两...
  • 广告

    2018-05-24 16:28:06
    推荐大家一个靠谱的论文检测平台。重复的部分有详细出处以及具体修改意见,能直接在文章上做修改,全部改完一键下载就搞定了。怕麻烦的话,还能用它自带的降重功能。哦对了,他们现在正在做毕业季活动, 赠送很多...
  • adbyby过滤规则整理

    万次阅读 2019-04-20 18:09:57
    ADbyby过滤规则 把 Lazy 原更新地址注释掉,然后 更改为 ... opa 免费共享,以下为广告源官方地址,实时更新,按个人需求下载使用。 opa https://kprules.b0.upaiyun.com/kp.dat opa https://kpr...
  • 解决Flash弹窗广告

    万次阅读 多人点赞 2019-02-06 09:00:27
    广告,困扰已久,痛定思痛打算搞定它。 当弹窗广告再次出现时,打开任务管理器,看到了一个叫&amp;amp;quot;FlashHelperService.exe&amp;amp;quot;的进程,右键打开所在文件夹,发现是在Flash目录中,而后...
  • Flash Helper Service 这个流氓,动不动弹出广告!!

    万次阅读 多人点赞 2019-06-28 22:48:49
    如题 , C:\Windows\SysWOW64\...动不动弹出不堪入目的乱七八糟的广告。 哪何,如何清除呢? 1.按快捷键CTRL+Shift+ESC就弹出任务管理器了,我们点击进程界面,找到FlashHelperService.exe点鼠标右键...
  • CSDN屏蔽广告

    万次阅读 多人点赞 2018-08-09 15:52:24
    样式于20190505停止更新,推荐使用 AdBlock 插件屏蔽广告, 谢谢大家一直以来的支持 致CSDN官方:如若侵犯贵站利益,请联系我,我将立马删除所有相关CSS 邮箱:demoliu94@163.com 请耐心看完这篇文章 在浏览文章的时候...
  • 1. 在线广告综述1.1. 广告的定义与目的1.2. 在线广告类型1.3. 在线广告简史1.4. 广告有效性原理1.5. 在线广告相关行业协会 2. 计算广告基础2.1. 在线广告的技术特点2.2. 计算广告核心问题2.2.1. 在线广告技术课题...
  • 移动广告平台Android SDK接入指南

    千次阅读 2017-11-06 21:12:13
    在应用开发中为了提高应用的收入,一般项目中都会引入广告,而我在开发中用的较多的就是讯飞移动广告平台的接入,下面将介绍讯飞移动广告平台是如何完成接入的。 一、集成说明 1.1申请appid  在...
  • 一、程序化广告生态 下图展示的是程序化广告生态链的各参与者之间...流量的消费者,包括广告主或代理 2. 需求方服务 需求方平台DSP和采购交易平台Trading Desk,它们为需求方提供精准的广告投放和管理服务 3. ...
  • 上周班上的小范同学问我广告模块怎么设计,我说你去参考phpcms啊,他上面的广告模块设计的很不错呢。 那么,就让我们开始吧。 PHPCMS广告模块详细分析——广告的生成 一、功能。 我们首先从功能开始,这里用的是...
  • 不少同学安装WinRAR后,发现我们在使用WinRAR解压一个文件时,总会先弹出一个广告。那么怎么去除这个广告呢? WinRAR官方下载地址:http://www.rarlab.com/rar/winrar-x64-540sc.exe 由于WinRAR本身并不收费,所以...
  • 内嵌广告SDK

    千次阅读 2015-02-06 08:57:59
     一、如何学习Android  android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具。对于过多的具体知识详细介绍我这里不展开,我只说我个人的学习方法和本人以为...
  • 计算广告——广告定向实践

    千次阅读 2016-07-11 22:44:04
    计算广告学涉及到很多的不同的学科知识,包括大规模搜索,文本分析,机器学习,信息检索以及经济学等等。在计算广告中,其核心问题是在给定的环境下,找到用户和广告之间的最佳匹配,在斯坦福大学的计算广告学中如下...
  • 部分品牌广告主会要求合作伙伴先进行入库申请流程,符合一定标准的供应才有资格入库。主要关注指标有: 公司情况、媒体资源、技术能力、数据实力、算法能力、服务能力、收费模式 2、比稿... (二)广告策划/提案 ...

空空如也

1 2 3 4 5 ... 20
收藏数 439,854
精华内容 175,941
关键字:

广告