谷歌原生广告接入

今天来分享一下谷歌原生广告的接入的经验

首先,我先说明一下,谷歌广告的种类,在创建应用的时候,选择导入广告,然后选择广告种类的时候,会看到三个种类,一个是横幅的,一个是全面视频的,一个是插屏视屏的,除了那个横幅的广告,其余两个都是全屏的广告,但是如果你看过谷歌的广告开发文档的话,你就会发现有一个原生广告,这个广告就像朋友圈,qq空间这些,列表广告的插入效果。

效果就是最近我们这个项目想要达到的效果,但是,帐号管理那哥们给了我两个id然后就让我接这个,后来代码写好了。测试id都能拿到广告,但是换成自己的id就是拿不到,网上搜了很久,有说要等几个小时的,各种原因,后来我怀疑是广告种类的问题,我就去找那哥们看帐号所选的种类,果然,他选的是一个全屏视频的广告(奖金视频),然后让我去接原生的,后来我就让他重新选,他说,没有原生广告那个选项,然后我就懵逼了。

仔细看了一下文档上面的提示,emmmm,这就很尴尬了。

https://developers.google.com/admob/android/native-advanced-unified


就是这个,那哥们英语好直接就看懂了。然后我翻译过来一看就是:


谷歌提示说这个是高级版本的,已经发布给一些发布商,如果你想要接入的话,emmmm。看到这儿,我想基本上是没戏了,然后就有了上文,接入facebook的广告,项目就快要上线了。然后这个时候让我重新接广告,真的是有点小无语,好在facebook遇到的坑不算很多,一天就搞定了,不然真的就很尴尬了。

好了虽然这样但是我还是分享一下怎么接入这个高级的原生广告,说不定哪天谷歌就给开放给大众了呢,也说不定,是吧。

老规矩还是先是导包配置什么的,这里谷歌的开发文档已经说的很清楚了。我就不再啰嗦了,照着做就可以了。

https://developers.google.com/admob/android/quick-start

文档的下方清楚的展示了四个种类的广告,但是呢,你去给你的应用创建广告的时候才会发现,你只能选择三个,native这个就是没有,气不气。。。

好了,继续讲怎么接入,首先接入广告第一行代码就是要配置你的id


比如说这里,就马上要你填写app的id了,如果你说你没有,但是也想看一下效果怎么办?这个好办,谷歌有提供专门的测试id给你测试用,然后我也是用的这个测试id才看到的效果


比如说就是这个

https://developers.google.com/admob/android/test-ads

谷歌的文档里面专门有些了,和我一样粗心大意的同学就可以看看了。每个广告种类都有专门的id供你选择,这里我说一下,那个测试只看你的unit id  你的app id可以填写你自己的,效果是一样的,不影响。

接下来就可以写一个方法去拿广告了,我直接是去谷歌的demo里面copy 的,然后改一些自己想要的,这里我贴上我改后的代码:

private void refreshAd() {
    AdLoader.Builder builder = new AdLoader.Builder(mActivity, ADMOB_AD_UNIT_ID);

    builder.forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
        // OnUnifiedNativeAdLoadedListener implementation.
        @Override
        public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
            //成功拿到广告  并且设置到adView当中
            UnifiedNativeAdView adView = (UnifiedNativeAdView) mActivity.getLayoutInflater().inflate(R.layout.item_video_list_admob, null);
            populateUnifiedNativeAdView(unifiedNativeAd, adView);
            //判断广告有没有拿完
            if (adLoader.isLoading()){
                LogUtils.logLocalD("广告-正在加载广告");
            }else {
                LogUtils.logLocalD("广告-拿到所有广告");
                if (adMobGetLisenter != null) adMobGetLisenter.getAdViewOk(unifiedNativeAdViews);
            }
        }

    });



    VideoOptions videoOptions = new VideoOptions.Builder()
            .setStartMuted(true)//视频广告是否静音
            .build();

    NativeAdOptions adOptions = new NativeAdOptions.Builder()
            .setVideoOptions(videoOptions)
            .build();

    builder.withNativeAdOptions(adOptions);

    adLoader = builder.withAdListener(new AdListener() {
        @Override
        public void onAdFailedToLoad(int errorCode) {//获取广告失败
            LogUtils.logLocalD("广告Failed to load native ad: "
                    + errorCode);
            if (adMobGetLisenter != null) adMobGetLisenter.getAdViewFail(errorCode);
        }
    }).build();

    AdRequest request = new AdRequest.Builder()
            .build();
    adLoader.loadAds(request,5);
}

这里和demo里面有些不一样,我请求的是多条广告所以用的是loadAds这个方法,demo里面用的是loadAd这个方法是获取一条广告,失败的话就走onAdFailedToLoad这个方法。成功的话就走onUnifiedNativeAdLoaded这个方法,拿到一个unifiedNativeAd对象(存有广告的信息和一些其他杂七杂八的)。然后回到多条广告,多条广告你会问,怎么返回的啊,返回值还是单个对象啊,并没有返回一个list给我啊,别慌。仔细看谷歌的文档,上面写的是多次调用返回,what?什么意思。当时我就有点不明白了。我怎么判断,广告都返回给我了了?我怎么知道我要的5条广告都OK了呢?直到我不知道从哪儿看到了这一句:adLoader.isLoading()   然后我就懂了,直接给你了嘛。判断广告有没有拿完。

 //成功拿到广告  并且设置到adView当中
            UnifiedNativeAdView adView = (UnifiedNativeAdView) mActivity.getLayoutInflater().inflate(R.layout.item_video_list_admob, null);
            populateUnifiedNativeAdView(unifiedNativeAd, adView);
            //判断广告有没有拿完
            if (adLoader.isLoading()){
                LogUtils.logLocalD("广告-正在加载广告");
            }else {
                LogUtils.logLocalD("广告-拿到所有广告");
                if (adMobGetLisenter != null) adMobGetLisenter.getAdViewOk(unifiedNativeAdViews);
            }

所以就有了这些代码。我把每次得到的unifiedNativeAd这个对象都传给了populateUnifiedNativeAdView这个方法处理,然后在这个类里面创建了我要的adViews  一个广告view的list  然后我判断一下广告如果是拿完了,就调一下监听,返回我想要的list,然后就可以把list里面的view内容拿去用,加到你的主列表里面还是干啥。都随便了。

接下来我们看一下unifiedNativeAd转view的那个方法:

private void populateUnifiedNativeAdView(UnifiedNativeAd nativeAd, UnifiedNativeAdView adView) {
        // Get the video controller for the ad. One will always be provided, even if the ad doesn't
        // have a video asset.
        VideoController vc = nativeAd.getVideoController();

        // Create a new VideoLifecycleCallbacks object and pass it to the VideoController. The
        // VideoController will call methods on this object when events occur in the video
        // lifecycle.
        vc.setVideoLifecycleCallbacks(new VideoController.VideoLifecycleCallbacks() {
            public void onVideoEnd() {
                // Publishers should allow native ads to complete video playback before refreshing
                // or replacing them with another ad in the same UI location.
//                refresh.setEnabled(true);
//                videoStatus.setText("Video status: Video playback has ended.");
                super.onVideoEnd();
            }
        });

        adView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
            @Override
            public void onViewAttachedToWindow(View view) {
                LogUtils.logLocalD("广告:onViewAttachedToWindow");
            }

            @Override
            public void onViewDetachedFromWindow(View view) {
                LogUtils.logLocalD("广告:onViewDetachedFromWindow");

            }
        });

        adView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
                LogUtils.logLocalD("广告:onLayoutChange");
            }
        });


        MediaView mediaView = adView.findViewById(R.id.ad_media);
        ImageView mainImageView = adView.findViewById(R.id.ad_image);

        // Apps can check the VideoController's hasVideoContent property to determine if the
        // NativeAppInstallAd has a video asset.
        if (vc.hasVideoContent()) {
            adView.setMediaView(mediaView);
            mainImageView.setVisibility(View.GONE);
//            videoStatus.setText(String.format(Locale.getDefault(),
//                    "Video status: Ad contains a %.2f:1 video asset.",
//                    vc.getAspectRatio()));
        } else {
            adView.setImageView(mainImageView);
            mediaView.setVisibility(View.GONE);

            // At least one image is guaranteed.
            try{
                List<NativeAd.Image> images = nativeAd.getImages();
                mainImageView.setImageDrawable(images.get(0).getDrawable());
            }catch (Exception e){
                e.printStackTrace();
            }

//            refresh.setEnabled(true);
//            videoStatus.setText("Video status: Ad does not contain a video asset.");
        }

        adView.setHeadlineView(adView.findViewById(R.id.ad_headline));
        adView.setBodyView(adView.findViewById(R.id.ad_body));
        adView.setCallToActionView(adView.findViewById(R.id.ad_call_to_action));
        adView.setIconView(adView.findViewById(R.id.ad_app_icon));
        adView.setPriceView(adView.findViewById(R.id.ad_price));
        adView.setStarRatingView(adView.findViewById(R.id.ad_stars));
        adView.setStoreView(adView.findViewById(R.id.ad_store));
        adView.setAdvertiserView(adView.findViewById(R.id.ad_advertiser));

        // Some assets are guaranteed to be in every UnifiedNativeAd.
        ((TextView) adView.getHeadlineView()).setText(nativeAd.getHeadline());//title 题目
        ((TextView) adView.getBodyView()).setText(nativeAd.getBody());//内容
        ((TextView) adView.getCallToActionView()).setText(nativeAd.getCallToAction());//按钮文字内容 ps:访问网站

        // These assets aren't guaranteed to be in every UnifiedNativeAd, so it's important to
        // check before trying to display them.
        if (nativeAd.getIcon() == null) {//广告app图标  ps:facebook app
            adView.getIconView().setVisibility(View.GONE);
        } else {
            ((CircleImageView) adView.getIconView())
                    .setImageDrawable(nativeAd.getIcon().getDrawable());
            adView.getIconView().setVisibility(View.VISIBLE);
        }

        if (nativeAd.getPrice() == null) {//未知
            adView.getPriceView().setVisibility(View.GONE);
        } else {
            adView.getPriceView().setVisibility(View.GONE);
            ((TextView) adView.getPriceView()).setText(nativeAd.getPrice());
        }

        if (nativeAd.getStore() == null) {//未知
            adView.getStoreView().setVisibility(View.GONE);
        } else {
            adView.getStoreView().setVisibility(View.GONE);
            ((TextView) adView.getStoreView()).setText(nativeAd.getStore());
        }

        if (nativeAd.getStarRating() == null) {//评价 --星星图标
            adView.getStarRatingView().setVisibility(View.GONE);
        } else {
            ((RatingBar) adView.getStarRatingView())
                    .setRating(nativeAd.getStarRating().floatValue());
            adView.getStarRatingView().setVisibility(View.VISIBLE);
        }

        if (nativeAd.getAdvertiser() == null) {//广告商 ps:facebook
            adView.getAdvertiserView().setVisibility(View.GONE);
        } else {
            ((TextView) adView.getAdvertiserView()).setText(nativeAd.getAdvertiser());
            adView.getAdvertiserView().setVisibility(View.VISIBLE);
        }

        adView.setNativeAd(nativeAd);
        unifiedNativeAdViews.add(adView);
    }

这么多?不用看了。也是去谷歌给出的demo里面copy的,然后自己改改,绑定视图,就自己看了。可以自定义你想要的广告界面。还是很方便的,其中有一个mediaView和ImageView的切换,这里如果拿到的是视频的话就判断一下用mediaView,这里还是很好理解的,demo里面判断都给你写好了,不用操心。好了,我还把谷歌的demo地址给出来:

https://github.com/googleads/googleads-mobile-android-examples/tree/master/java/admob/NativeAdvancedExample


这里,demo里面没有,大概意思也猜的到,就是给adview添加监听的,比如广告出现了,广告隐藏了,被滑动了。这些,事件的返回,但是,没有点击事件的返回,对的没错,没有找到有这个事件的监听。试过很多方法也拿不到,最后我还是就放弃了,2333。

unifiedNativeAdViews.add(adView);一波操作完了之后,然后我就把我弄好的adView存到了我的list里面,前面说到的,判断我的广告拿全了之后,我就通过监听把list返回给了调用方,然后就完事儿了。接入还是很简单的,就具体说下可能遇到的坑。


先是说一下布局,布局是要由谷歌给的容器包裹起来,不然是会报错的。

然后就是网络的问题。多条广告请求的时候尤为重要,需要开vpn不然的话不容易拿到广告,测试广告也是如此,然后就是有时候谷歌就是不会给你返回广告的,你可以改改你的请求条数,来不断的试一下。

好了,完事儿。看起来好像遇到的坑并不多,但是英文不好,又要去慢慢翻英文的文档的时候,还是挺恼火的,还各种问题,比如换成自己id就拿不到广告,就迷惑了很久,最后才发现,emmm,真的是有点尴尬,如果读者还有什么问题,可以问我,可以一起讨论学习。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值