广告_广告代码 - CSDN
精华内容
参与话题
  • 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网络的商用、智能设备的进化,今后肯定会出现更多的广告形式,在这个到处充满着信息的空间里,到处都有流量,也就意味着后期会持续不断的出现的新的广告花样!

    展开全文
  • 穿山甲(巨量引擎)广告接入

    千次阅读 2019-10-21 17:14:24
    文章目录前言开屏广告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开发。

    展开全文
  • 安卓SDK——广告植入

    千次阅读 2019-05-12 18:36:08
    移动广告平台的话,好像还挺多的,介绍就不一一介绍了(因为我也不太了解 orz),简单搜了一下 不过感觉这几年不怎么兴这个了...撑死就是开屏广告...带有其他广告形式的软件基本上被归类到流氓软件了 不如一个...

    移动广告平台的话,好像还挺多的,介绍就不一一介绍了(因为我也不太了解 orz),简单搜了一下

    不过感觉这几年不怎么兴这个了...撑死就是开屏广告...带有其他广告形式的软件基本上被归类到流氓软件了

    不如一个“高级账号”解锁全部功能圈钱来的实在 (逃

    BAT应该也有自己的广告接入平台?我猜...

    国际上主要是Admob

    国内就比较多了,多盟、万普、有米、点入等等....

    然后这篇文章关于万普...


    集成万普广告平台

    平台使用

    万普平台官网:http://www.waps.cn/

    首先肯定是注册

    然后竟然随便到连个验证码都不用...就注册成功了...

    然后在控制台添加一个应用

    然后可以看到APP IDSDK的下载提示

    b589ca763dd033d098d8eff1dc063a4d

    然后会要求上传应用...和完善一些应用介绍信息


    集成SDK

    这部分的话,基本照搬文档了...

    基础配置

    • 下载SDK
    • 加入 jar 包

    将 Demo 解压包中 libs 目录中的 AppOffer_2.2.0.jar 包拷贝工程指定的 libs 目录,并执行 Build Path 将 jar 包引入。

    (复制到libs目录,右键单击 add as libraries.....)

    • 添加配置信息 将以下权限添加到 AndroidManifest.xml 文件中

    注:如果设置 android:targetSdkVersion,其值须设置为 15 或 15 以下 。

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    
    <!-- 适配android8.0系统(若设置了targetSdkVersion为26以上,则必须添加此权限) -->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

    混淆事项

    如果应用进行了混淆编译,需要在混淆的配置文件中加入以下代码,避免SDK被二次混淆编译,才能确保SDK功能正常使用。如果开发者使用了定制名的SDK,也需要对相应的包名加入类似代码:

    -keep public class cn.waps.** {*;}

    -keep public interface cn.waps.** {*;}

    -dontwarn cn.waps.**

    集成代码

    数据统计接口

    该接口是所有其他接口能正常使用的基础,在每次应用启动时,必须调用该接口进行初始化操作,才能保证获得准确的统计数据。

    步骤1:在的应用中第一个Activity类中(启动的第一个类),添加下面一行代码: 

    //方式①:通过代码设置APP_ID和APP_PID

    AppConnect.getInstance("APP_ID","APP_PID",this);

    APP_ID为应用标识,该值由万普后台添加应用后自动生成,点击“应用详情”获取;

    APP _PID为分发渠道标识,使用规则请参见本文档附表《常用渠道编码表》。

    除了使用以上方法外,也可以通过在AndroidManifest内添加配置来设置APP_ID和APP_PID:

    <meta-data android:name="APP_ID"android:value="应用标识"/>

    <meta-data android:name="APP_PID"android:value="分发渠道标识"/>

    //方式②:通过AndroidManifest文件读取APP_ID和APP_PID

    AppConnect.getInstance(this);

    大概就是下图所示的样子~

     

    注意:上传到万普平台官方合作商店(机锋、N多、木蚂蚁、优亿、联想、MM、十字猫等)的,需要采用方式②初始化,并需要严格按照《常用渠道编码表》的要求设置对应的APP_PID标识,才能快速通过商店审核;而对于其他可能会限制第三方广告SDK的应用商店,需要采用方式①初始化,并结合万普“在线参数”功能进行广告显示控制,在通过商店审核并正常发布之后再开启广告。

    APP_PID

    渠道名称

     

    APP_PID

    渠道名称

    default

    万普平台(默认)

     

    QQ

    腾讯应用

    google

    GooglePlay市场

     

    3G

    3G安卓市场

    91

    91手机助手

     

    360

    360应用

    hiapk

    安卓市场

     

    baidu

    百度应用

    gfan

    机锋市场*

     

    sohu

    搜狐应用

    goapk

    安智市场

     

    163

    网易应用*

    appChina

    掌上应用汇

     

    UC

    UC应用商店

    mumayi

    木蚂蚁市场*

     

    dangle

    当乐游戏中心

    eoe

    优亿市场*

     

    samsung

    三星乐园

    nduo

    N多市场*

     

    mmw

    移动MM商店

    feiliu

    飞流下载

     

    xiaomi

    小米市场

    crossmo

    十字猫商店*

     

    lenovo

    联想乐商店*

    huawei

    华为智汇云

     

    nearme

    NearMe商店

    步骤2:在程序退出的处理方法中, 添加下面一行代码:

    AppConnect.getInstance(this).close();

    大概就是下图的样子~


    积分墙、互动广告

    积分墙

    什么是积分墙?

    积分墙是指在一个应用内展示各种积分(货币)任务(下载安装推荐
    的优质应用、注册、填表等),以供用户完成任务获得积分(货币)
    的广告解决方案。积分墙将广告与应用融为一体,避免生硬的广告推
    送,对用户体验影响最小,单个用户对积分墙广告收入的贡献率比较
    高。

    强大学习引擎让您的流量更有效率

    该引擎构建在多维立体优化模型基础上,依托用户在您应用中的所为
    行为习惯,实时计算,动态决策,并且能够根据投放的历史数据自动
    学习、自动调优,确保您的收入不断提升,使您每个广告用户的单位价
    值更加高效。

    积分墙广告计费方式

    可按CPA(效果)计费,实时检测数据。
    如按CPA(效果)计费,则不重复计费展示数、点击数。

    积分墙(也称Offer,广告墙)是万普平台提供的一种集中展示型广告。开发者可在应用中合适的位置加入“推荐应用”、“免费赚积分”等类似字样的功能,获取更高的广告收益。添加如下代码,即可显示万普平台推荐应用列表:

    AppConnect.getInstance(this).showOffers(this);

    //对于使用“服务器通知接口”时,则使用下面的方法进行设置userId

    AppConnect.getInstance(this).showOffers(this, userId);

    说明:以上方法调用的为综合积分墙。SDK还提供了showAppOffers(this)、showGameOffers(this)两个接口,用于直接调用推荐软件列表、推荐游戏列表的积分墙。

    提示:开发者可通过万普后台的“广告设置”功能,手动设置积分墙的显示样式和广告内容。

    积分墙关闭监听接口(可选,可在积分墙关闭时调用getPoints方法更新积分或进行其它操作)

    //设置关闭积分墙的监听接口,必须在showOffers接口之前调用

    AppConnect.getInstance(this).setOffersCloseListener(new AppListener(){

          @Override

          public void onOffersClose() {

                // TODO 关闭积分墙时的操作代码

          }

    });


    假设我们有一个按钮 

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="积分墙"
            android:onClick="show"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </android.support.constraint.ConstraintLayout>

    书写点击事件

    package com.example.advertisement;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    
    import cn.waps.AppConnect;
    import cn.waps.AppListener;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //初始化
            AppConnect.getInstance(this);
            //监听广告墙关闭事件
            AppConnect.getInstance(this).setOffersCloseListener(new AppListener(){
                @Override
                public void onOffersClose() {
                    super.onOffersClose();
                    // TODO 关闭积分墙时的操作代码
                }
            });
    
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //关闭
            AppConnect.getInstance(this).close();
        }
    
        public void show(View view){
            AppConnect.getInstance(this).showOffers(this);
        }
    }
    

     效果如下:

    然而8.0及以上亲测显示不出来?官方文档也没找到相关的说明...唯一提到适配的...似乎是适配“不能安装”的问题


    互动广告

    互动广告是一个显示在应用内固定位置高度为50像素广告条,将自动显示万普平台提供的广告。结合虚拟货币功能使用,可获得最佳的广告效果和用户体验。

    方式①:通过布局文件添加互动广告

    步骤1: 复制如下代码到相应Activiy的Layout文件中,并放置在合适的位置:

    <LinearLayout  android:id="@+id/AdLinearLayout"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:gravity="center_horizontal"/>

    步骤2: 在调用样式文件的Activity类中, 添加下面的代码:

    LinearLayout adlayout =(LinearLayout)findViewById(R.id.AdLinearLayout);

    AppConnect.getInstance(this).showBannerAd(this, adlayout);

    方式②:纯代码模式添加互动广告

    LinearLayout adlayout = new LinearLayout(this);

    adlayout.setGravity(Gravity.CENTER_HORIZONTAL);

    RelativeLayout.LayoutParamslayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
                                                    ViewGroup.LayoutParams.WRAP_CONTENT);

    AppConnect.getInstance(this).showBannerAd(this, adlayout);

    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);//设置顶端或低端

    this.addContentView(adlayout, layoutParams);

    互动广告无数据时的回调监听:(2.3.2版本加入

    AppConnect.getInstance(this).setBannerAdNoDataListener(new AppListener(){

          @Override

          public void onBannerNoData() {

                Log.e("debug", "Banner广告无数据");

          }

    });

           该接口需要在showBannerAd之前调用

     

    我们使用方式一,大概就这样,fill_parent是比较老的写法了,可以改成match_parent

    然后让它程序创建就显示出来

    效果如下

    好吧 展示不出来...感觉不是我的问题,它的广告源的链接戳进去都没有东西的样子..不会已经倒闭了把 orz

    插屏广告、迷你广告

    插屏广告

    插屏广告是1.8版本SDK开始推出的一种新型广告形式,以全屏对话框的新式显示广告,支持透明背景和浮层特效。和传统Banner广告相比,显示效果更炫,转化率更高,而且具有良好的用户体验。不占用固定广告位,特别适用于应用启动、游戏通关等场景使用。

    始化(预先加载)广告数据:

    AppConnect.getInstance(this).initPopAd(this);

    说明:该方法将通过异步方式预先加载5-10条插屏广告到本地缓存,如果事先未通该方法初始化广告,或者在数据未加载完成的情况下直接显示插屏广告,将重新异步加载一次数据,等待数据加载完成后才能显示出广告,会造成一定的延时。

    显示插屏广告:

    AppConnect.getInstance(this).showPopAd(this);

    //调用方式2:显示插屏广告时设置关闭插屏广告的监听接口 (选用)

    AppConnect.getInstance(this).showPopAd(this, new AppListener(){

              @Override

              public void onPopClose() {super.onPopClose();   }

    });

    说明:该方法将根据应用当前场景,用自适应方式显示插屏广告。

    获取插屏广告对话框(可选):

    Dialog popAdDialog = AppConnect.getInstance(this).getPopAdDialog();

    说明:该方法仅用于先通过调用showPodAd方法正常显示出插屏广告后,获取到插屏广告对话框实例,实现对插屏广告的显示过程灵活控制,比如监听广告关闭事件、定时自动关闭广告等自定义效果,但不能用于取代showPodAd方法直接显示插屏广告。当插屏广告尚未正常显示时,该方法可能会获取到空值。

    获取插屏广告内嵌布局(可选):

    //获取默认宽高的插屏广告布局

    View popAdDialog = AppConnect.getInstance(this).getPopAdView(this);//默认400*400

    //获取可自定义宽高的插屏广告布局

    View popAdDialog = AppConnect.getInstance(this).getPopAdView(this, width, height);

    说明:该接口可用于将插屏广告灵活插入到应用内,用于实现开屏广告、退屏广告、界面内嵌入式广告等灵活的广告形式。随本文档提供的Demo程序中,提供了一份完整的开屏广告和退屏广告的实现样例和源码,开发者可直接引用,也可进行任意修改用于实现更多的广告形式。

    判断插屏广告是否初始化完成:

    //判断插屏广告是否已初始化完成,用于确定是否能成功调用插屏广告

    booleanhasPopAd = AppConnect.getInstance(this).hasPopAd(this);

    从2.3.1版本开始,插屏广告展示时默认屏蔽了设备back键可关闭广告的功能。如需启用back键的关闭插屏广告的功能,可在调用插屏广告之前添加如下代码:

    // 参数true表示可使用设备back键关闭插屏广告,不调用该代码则使用默认值false不可关闭

    AppConnect.getInstance(this).setPopAdBack(true);

    互动广告无数据时的回调监听:(2.3.2版本加入

    AppConnect.getInstance(this).setPopAdNoDataListener(new AppListener(){

          @Override

          public void onPopNoData() {

                Log.e("debug", "插屏广告已经没有数据");

          }

    });

           注:该接口需要在showPopAd之前调用。

    迷你广告

    你广告是一种基于自定义广告的广告形式,每个广告由一个微缩图标和文字链组成,高度仅为24像素,文字颜色、背景颜色及透明度可自定义,特别适用于广告位空间有限的游戏类应用。和传统的Banner大广告条相比,迷你广告采用了流量压缩和本地缓存方式轮换广告,不仅省广告位,而且非常省流量,广告轮换频率更高,相比传统Banner广告条有更高的收益。

    步骤1: 复制如下代码到相应Activiy的Layout文件中,并放置在合适的位置:

    <LinearLayoutandroid:id="@+id/miniAdLinearLayout"

    android:layout_width="wrap_parent"

    android:layout_height="wrap_content"

    android:gravity="center_horizontal"/>

    步骤2: 在调用样式文件的Activity类中, 添加下面的代码:

    //设置迷你广告背景颜色

    AppConnect.getInstance(this).setAdBackColor(Color.argb(50, 120, 240, 120));

    //设置迷你广告广告语颜色

    AppConnect.getInstance(this).setAdForeColor(Color.YELLOW);

    //若未设置以上两个颜色,则默认为黑底白字

    LinearLayout miniLayout =(LinearLayout)findViewById(R.id.miniAdLinearLayout);

    AppConnect.getInstance(this).showMiniAd(this, miniLayout, 10); //默认10秒切换一次广告

     

     

    展开全文
  • 广告的定义及其目的

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

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

      定义中有两个关键点,首先,广告活动的两个主动参与方——出资人(sponsor)和媒体(medium) 。在数字广告更加复杂的市场结构中,我们可以用一般性的术语来描述它们: 需求方(demand) 和供给方(supply) 。 需求方可以是广告主(advertiser) 、代表广告主利益的代理商( agency) 或其他技术形态的采买方; 供给方可以是媒体, 也可以是其他技术形态的变现平台。另外,要特别注意的是,广告还有一个被动的参与方, 即受众(audience) 。 请牢牢建立起这样的概念: 出资人、媒体和受众这三者的利益博弈关系是广告活动永远的主线, 这一主线将贯穿于商业和产品形态的整个演化过程。另外,该定义还阐明了广告必须是有偿的、非人员的信息传播活动。 这两点限制, 前者使得广告的目标变得明确, 后者使得这一目标可以采用计算的方式来优化, 而这些都是计算广告产生的基础。

      广告这一商业行为,其本质目的是什么呢? 在不同的时代, 广告主与媒体对这一问题存在着不同的认知。在传统媒体时代,供给方与需求方在市场地位上有相当的距离,不论运营的是电视台、机场或杂志, 都与大多数广告主需要的转化行为之间有相当大的差距。 因此, 这一阶段广告的目的是希望借助媒体的力量来快速接触大量用户,以达到宣传品牌形象、提升中长期购买率与利润空间的目的。 这种目的的广告称为品牌广告(brand awareness) 。当然,也有许多广告商希望能利用广告手段马上带来大量的购买或其他转化行为, 这种目的的广告称为直接效果广告(direct response)效果广告。在传统广告产品中, 大量投送和优化效果广告的能力显然是缺乏的。这是因为对短期效果追求要求广告精准地送达目标人群。能够想到以效果为目的的传统广告比如传单,而数字媒体的出现使得效果广告蓬勃地发展起来。 主要有两方面的原因: 一是数字媒体的特点可以低成本地投送个性化广告; 二是一些在线服务, 如搜索、 电子商务等能够更清楚的了解用户的意图, 使得广告效果的优化更加容易。

      互联网广告兼有品牌和效果两方面的功能。不过要说明的是,到目前为止,互联网广告行业的高速发展主要是由于效果广告市场带来的巨大红利。网络广告的市场规模发展迅猛;与此同时,传统广告渠道则增长乏力或快速下降。

      广告的根本目的是广告主通过媒体达到低成本的用户接触。即按某种市场意图接触相应的人群,进而影响其中的潜在用户,使他们选择广告主产品的几率增加,或者对产品性价比的苛求程度降低。至于短期内的转化效果,由于市场意图或媒体性质的不同,并不是直接可比。换句话说,如果仅仅以转化效果为目的来思考问题, 可能会背离投放广告的正确方法论。举个例子,某感冒药广告商如果以短期效果为导向,那么最佳的策略是把广告投放给那些现在感冒的人,不过这显然是一个荒谬的决策;再比如,某汽车广告商为了提升自己的品牌形象,希望对自己竞品品牌的用户加强宣传,而对于这部分人群,广告的直接效果甚至有可能比随机投放还要差。认清这一概念,使得大家在遇到多种广告渠道的效果比较时能够避免偏颇的结论。关于这一点,有所谓**整合营销(integrated marketing)**的概念,即通过多种渠道的有机配合来达到整体投放效果的最优。广告的“低成本”是与那些由市场或销售人员完成的劝服活动成本相对而言的,实际上是广告搭了媒体流量和影响力的便车。要确定是否真的成本较低,需要用到投入产出比(Return On Investment,ROI) 这一评价指标,即某次广告活动的总产出与总投入的比例。在实际中,广告活动的总投入容易确定,但总产出的确定却不那么容易,特别是在投放以中长期收益为目标的品牌广告时。因此,绝对的 ROI 有时难以计算,不过通过各个渠道之间的对比, 我们仍然可以评估广告的成本是否令人满意。需要说明,在互联网环境中,广告的本质虽然没有变化,但是由于大量直接效果需求的产生,其表现形式越来越丰富和灵活。不论是与线下类似的横幅、搜索竞价排名,还是软文,甚至是表面上与广告并不相干的游戏联运,其本质都是付费的信息推广,从产品和技术的角度来看都可以归在广告的范畴下。因此,对于互联网广告有如下认识:一切付费的信息、 产品或服务的传播渠道,都是广告。

    如有侵权,烦请联系删除,谢谢!

    参考文献
    计算广告学

    展开全文
  • AdMob(app内嵌广告)原生广告

    万次阅读 2018-06-27 14:47:07
    原生广告 原生格式是一种基于组件的广告格式,可让发布商自由地自定义在应用中如何呈现广告资源,如标题及对操作的调用。通过选择适合自己的字体、颜色和其他详细信息,发布商能够制作出自然而然、毫不唐突的广告...
  • 互联网广告行业知识

    千次阅读 2018-09-10 15:03:54
    入职互联网广告行业已经两月有余了,结合自己的工作经历和网上的一些科普做一下总结。 一、定义 《当代广告学》一书中对广告的定义是:广告是由已确定的出资人通过各种媒介进行的有关产品(商品、服务和观点)的,...
  • 计算广告(一)

    千次阅读 2018-09-20 21:37:59
    计算广告(一) 第一部分:综述 1.内涵 (1)定义 广告是由已确定的出资人通过各种媒介进行的有关产品(商品,服务和观点)的,通常是有偿的,有组织的,综合的,劝服性的非人员的信息传播活动。——Wiliam.F....
  • 笔者加入腾讯已经快5年时光,一直负责广告前端研发工作。最近即将离开公司,特意将广告的全链路整理了一下,作为自己的一个总结。本文将从产品的角度入手,通过描述广告的玩法,让读者对广告有一个整体的概念和印象...
  • 广告竞价科普扫盲

    万次阅读 2018-04-10 17:37:55
    百度搜索引擎变现策略指标体系 4 Replies 下文就百度商业变现的指标体系进行概要描述,并针对一个类似于百度LBS系统的变现思路,阐述一个商业系统变现策略指标体系的建立过程。 为什么需要商业变现策略指标体系 ...
  • 不少同学安装WinRAR后,发现我们在使用WinRAR解压一个文件时,总会先弹出一个广告。那么怎么去除这个广告呢? WinRAR官方下载地址:http://www.rarlab.com/rar/winrar-x64-540sc.exe 由于WinRAR本身并不收费,所以...
  • 解决Flash弹窗广告

    万次阅读 多人点赞 2020-03-13 13:18:31
    广告,困扰已久,痛定思痛打算搞定它。 当弹窗广告再次出现时,打开任务管理器,看到了一个叫&amp;amp;quot;FlashHelperService.exe&amp;amp;quot;的进程,右键打开所在文件夹,发现是在Flash目录中,而后...
  • 广告法的上线实行,限制了很多的违规词,敏感词的使用,极限用语的处罚由原来的退一赔三变更为罚款二十万元起!如何确定广告中是否存在有敏感词呢?小龙经过多方努力,终于开发出了新广告法违规词、敏感词在线检测...
  • 小米电视屏蔽广告规则

    万次阅读 2018-04-12 09:42:29
    小米电视的开机广告总是漫长且坑爹,看视频的广告也是坑爹且漫长,我们喜欢的是发烧的MI,而不是AD小米。 如何屏蔽小米电视的视频广告? 例如我之前用斐讯k2刷了华硕路由,现在斐讯K3c刷了非官固件,带有adbyby...
  • 【更新】四种WinRAR永久去广告方法

    万次阅读 2017-12-23 11:14:23
    三种WinRAR永久去广告方法    Winrar官网下载地址   我的电脑是64位的 就以64位版本进行介绍 方法一: 用Spy++查看广告窗口类名  打开x64dbg附加winrar.exe,运行至winrar.exe模块程序入口点。   ...
  • 关闭新版360浏览器广告流氓行为

    万次阅读 2018-09-20 10:25:18
    目前360浏览器在国内的使用量还是挺多的,但是360有点流氓:弹出广告。下面演示如何设置,将360浏览器的广告关闭: 1.进入设置菜单。 打开360浏览器,点击右上角"三横"图标,在弹出的菜单中点击"...
  • 如何去除Android游戏软件中的广告:很多时候,我们下载好一款Andriod游戏软件,却被游戏软件中的广告弄的很烦。不停跳动的广告让人觉得非常不爽,而且在玩游戏的时候,还有可能点击到广告,中断游戏。那各位椒友...
  • 搜索广告与竞价广告

    千次阅读 2018-12-22 21:40:58
      随着搜索业务变现的要求,以及精准受众定向技术的发展, 在搜索广告和展示广告中都产生了竞价这种新的交易模式。对比前面的合约广告可知,竞价交易模式的本质是将量的约束从交易过程中去除,仅仅采用“价高者得...
  • 广告展示:该广告在设定时间范围内的展示数量,也可以理解为曝光,广告在页面上曝光显示的次数,显示一次记为一个pv,被一个用户看到记为一个uv。 广告点击:该广告在设定时间范围内的点击数量,广告被点击一次记为...
  • 一、程序化广告生态 下图展示的是程序化广告生态链的各参与者之间的分工协作,并用线条表示了现金流方向、广告服务方向以及数据提供方向。 相对于传统的网络广告产业链,程序化市场的新角色及技术服务主要分为...
  • Android 启动页面与广告页面的实现

    万次阅读 2019-05-16 16:55:25
    在我们APP的开发过程中,启动页面是绕不开的,广告页面说不定,但是不得不说,这两个界面都是经常要用到的。接下来我记录一下我的实现过程。项目架构为MVP。  那么先看看我们的需求和流程:(当然这也是可以根据...
1 2 3 4 5 ... 20
收藏数 416,588
精华内容 166,635
关键字:

广告