Unity与Android交互-案例演示接入穿山甲广告SDK(二)

5 篇文章 1 订阅
4 篇文章 1 订阅

一.前序

根据上一章内容:https://blog.csdn.net/jiaxunnanling/article/details/90448454

有几个关键点

        对SDK初始化抽象的一个单例TTAdManagerHolder

        Reward Vedio广告初始化流程分五个步骤,详细内容可以参考说明文档

                1.持有管理对象,初始化

TTAdManager ttAdManager = TTAdManagerHolder.get();
        2.申请权限
TTAdManagerHolder.get().requestPermissionIfNecessary(this);

               3.持有广告请求接口

  mTTAdNative = ttAdManager.createAdNative(getApplicationContext());

              4.对广告请求属性的配置,详细参数内容参考说明文档

        AdSlot adSlot = new AdSlot.Builder()
                .setCodeId(codeId)
                .setSupportDeepLink(true)
                .setImageAcceptedSize(1080, 1920)
                .setRewardName("金币") //奖励的名称
                .setRewardAmount(3)  //奖励的数量
                .setUserID("user123")//用户id,必传参数
                .setMediaExtra("media_extra") //附加参数,可选
                .setOrientation(orientation) //必填参数,期望视频的播放方向:TTAdConstant.HORIZONTAL 或 TTAdConstant.VERTICAL
                .build();

            5.发送广告请求,并监听各种回调TTAdNative.RewardVideoAdListener 

  mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {...});

     通过TTRewardVideoAd对象的方法showRewardVideoAd显示视频内容,视频内容的缓存在请求高广告回调中能确定是否加载完成。

二.制作供给Unity使用的广告服务

通过扩展Unity的MainActivity接入广告服务内容,关于扩展Unity的MainActivity,可以参考:https://blog.csdn.net/jiaxunnanling/article/details/90201312

新建Android工程,添加模块Advertisement 

引入Unity内置的Jar包

根据广告说明文档,导入两个文件

根据说明文档,修改模块build.gradle内容如下

 

新建一个对象,编写初始化的内容,或者把之前提到过的 TTAdManagerHolder移植到模块中

package com.huowu.advertisement;

import android.content.Context;

import com.bytedance.sdk.openadsdk.TTAdConfig;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdManager;
import com.bytedance.sdk.openadsdk.TTAdSdk;

/**
 * 可以用一个单例来保存TTAdManager实例,在需要初始化sdk的时候调用
 */
public class TTAdManagerHolder {

    private static boolean sInit;

    public static TTAdManager get() {
        if (!sInit) {
            throw new RuntimeException("TTAdSdk is not init, please check.");
        }

        return TTAdSdk.getAdManager();
    }

    public static void init(Context context) {
        doInit(context);
    }

    //step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明
    private static void doInit(Context context) {
        if (!sInit) {
            TTAdSdk.init(context, buildConfig(context));
            sInit = true;
        }
    }

    private static TTAdConfig buildConfig(Context context) {
        return new TTAdConfig.Builder()
                .appId("5001121")
                .useTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView
                .appName("APP测试媒体")
                .titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)
                .allowShowNotify(true) //是否允许sdk展示通知栏提示
                .allowShowPageWhenScreenLock(true) //是否在锁屏场景支持展示广告落地页
                .debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用
                .directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允许直接下载的网络状态集合
                .supportMultiProcess(false)
                .build();
    }
}

 

 新建一个MainActivity对象,并继承于UnityPlayerActivity,内容如下

package com.huowu.advertisement;

import android.content.Context;

import android.os.Bundle;
import android.widget.Toast;

import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdManager;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTRewardVideoAd;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;


import java.net.ContentHandler;

public class MainActivity extends UnityPlayerActivity {

    //广告接口持有者
    private TTAdNative mTTAdNative;

    //视频播放持有者
    private TTRewardVideoAd mttRewardVideoAd;


    //是否加载完成
    private boolean mHasShowDownloadActive = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Unity启动活动的时候,初始化SDK
        TTAdManagerHolder.init(this);
    }

    //初始化广告配置
    public  void Init()
    {

        //step1:初始化sdk
        TTAdManager ttAdManager = TTAdManagerHolder.get();
        //step2:(可选,强烈建议在合适的时机调用):申请部分权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题。
        TTAdManagerHolder.get().requestPermissionIfNecessary(this);
        //step3:创建TTAdNative对象,用于调用广告请求接口
        mTTAdNative = ttAdManager.createAdNative(getApplicationContext());

    }

    //加载横条广告
    public void LoadHorizontalAD()
    {
        loadAd("901121430", TTAdConstant.HORIZONTAL);

    }

    //加载竖条广告
    public void LoadVerticalAD()
    {

        loadAd("901121365", TTAdConstant.VERTICAL);
    }

    //加载完成,显示广告内容
    public void ShowVedio()
    {
        //在Android的UI线程显示
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mttRewardVideoAd != null) {
                    //step6:在获取到广告后展示
                    TToast(MainActivity.this,"加载成功显示");
                    mttRewardVideoAd.showRewardVideoAd(MainActivity.this);
                    TToast(MainActivity.this,"显示调用完成");
                    mttRewardVideoAd = null;
                } else {
                    TToast(MainActivity.this,"请先加载广告");
                }
            }
        });

    }

    //TToast显示信息
    public void TToast(final Context context, final String msg)
    {
        //在Android的UI线程显示
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();
            }
        });
    }

    //配置广告配置,请求广告。
    private void loadAd(String codeId, int orientation) {
        //step4:创建广告请求参数AdSlot,具体参数含义参考文档
        AdSlot adSlot = new AdSlot.Builder()
                .setCodeId(codeId)
                .setSupportDeepLink(true)
                .setImageAcceptedSize(1080, 1920)
                .setRewardName("金币") //奖励的名称
                .setRewardAmount(3)  //奖励的数量
                .setUserID("user123")//用户id,必传参数
                .setMediaExtra("media_extra") //附加参数,可选
                .setOrientation(orientation) //必填参数,期望视频的播放方向:TTAdConstant.HORIZONTAL 或 TTAdConstant.VERTICAL
                .build();
        //step5:请求广告
        mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {
            @Override
            public void onError(int code, String message) {
                TToast(MainActivity.this, message);
            }

            //视频广告加载后,视频资源缓存到本地的回调,在此回调后,播放本地视频,流畅不阻塞。
            @Override
            public void onRewardVideoCached() {
                TToast(MainActivity.this, "rewardVideoAd video cached");
            }

            //视频广告的素材加载完毕,比如视频url等,在此回调后,可以播放在线视频,网络不好可能出现加载缓冲,影响体验。
            @Override
            public void onRewardVideoAdLoad(TTRewardVideoAd ad) {
                TToast(MainActivity.this, "rewardVideoAd loaded");
                mttRewardVideoAd = ad;
//                mttRewardVideoAd.setShowDownLoadBar(false);
                mttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() {

                    @Override
                    public void onAdShow() {
                        TToast(MainActivity.this, "rewardVideoAd show");
                    }

                    @Override
                    public void onAdVideoBarClick() {
                        TToast(MainActivity.this, "rewardVideoAd bar click");
                    }

                    @Override
                    public void onAdClose() {
                        TToast(MainActivity.this, "rewardVideoAd close");
                    }

                    //视频播放完成回调
                    @Override
                    public void onVideoComplete() {
                        TToast(MainActivity.this, "rewardVideoAd complete");
                    }

                    @Override
                    public void onVideoError() {
                        TToast(MainActivity.this, "rewardVideoAd error");
                    }

                    //视频播放完成后,奖励验证回调,rewardVerify:是否有效,rewardAmount:奖励梳理,rewardName:奖励名称
                    @Override
                    public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName) {
                        TToast(MainActivity.this, "verify:" + rewardVerify + " amount:" + rewardAmount +
                                " name:" + rewardName);
                    }
                });
                mttRewardVideoAd.setDownloadListener(new TTAppDownloadListener() {
                    @Override
                    public void onIdle() {
                        mHasShowDownloadActive = false;
                    }

                    @Override
                    public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
                        if (!mHasShowDownloadActive) {
                            mHasShowDownloadActive = true;
                            TToast(MainActivity.this, "下载中,点击下载区域暂停");
                        }
                    }

                    @Override
                    public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
                        TToast(MainActivity.this, "下载暂停,点击下载区域继续");
                    }

                    @Override
                    public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
                        TToast(MainActivity.this, "下载失败,点击下载区域重新下载");
                    }

                    @Override
                    public void onDownloadFinished(long totalBytes, String fileName, String appName) {
                        TToast(MainActivity.this, "下载完成,点击下载区域重新下载");
                    }

                    @Override
                    public void onInstalled(String fileName, String appName) {
                        TToast(MainActivity.this, "安装完成,点击下载区域打开");
                    }
                });
            }
        });
    }
}

供给Unity使用的方法,初始化广告Init,以及请求横屏广告LoadHorizontalAD(),竖屏广告LoadVerticalAD(),显示广告内容ShowVedio()。

 修改AdroidManifest,如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.huowu.advertisement">

    <!--权限内容可以参考说明文档-->
    <!--minSdkVersion为9时的合并-->
    <uses-sdk  tools:overrideLibrary="android.support.v7.appcompat, android.support.v7.recyclerview,com.dingmouren.layoutmanagergroup,
                                        com.squareup.leakcanary, com.squareup.leakcanary.analyzer, com.squareup.leakcanary.android.noop" />
    <!-- 如果有视频相关的广告且使用textureView播放,请务必添加,否则黑屏 -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <!--必须要有的权限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <!--最好能提供的权限-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <application
        android:label="@string/app_name"
        android:usesCleartextTraffic="true">
        <activity
            android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="unityplayer.UnityActivity"
                android:value="true" />
        </activity>

        <provider
            android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
            android:authorities="${applicationId}.TTMultiProvider"
            android:exported="false" />
    </application>
</manifest>

 

导出Arr包,供给Unity使用

  

三.Unity接入穿山甲广告服务

使用7z压缩器,打开Arr包,把AndroidManifest复制一份出来,用于替换Unity默认的AndroidManifest。

 把Arr包与AndroidManifest放入Unity工程的Plugins/Android目录下(不存在则创建目录)

由于导出的Arr包并没有把open_ad_sdk.aar包封装进去,所以open_ad_sdk.aar包也要放入Plugings/Android目录下

 

搭建UI界面

 

 新建脚本TTAdHolder,并挂载到UI的Gameobject身上,内容如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TTAdHolder : MonoBehaviour
{

    /// <summary>
    /// Android类型
    /// </summary>
    private AndroidJavaClass androidJavaClass;
    /// <summary>
    /// Android对象实例
    /// </summary>
    private AndroidJavaObject currentActivity;

    /// <summary>
    /// 初始化按钮
    /// </summary>
    public Button initBtn;
    /// <summary>
    /// 加载横条广告按钮
    /// </summary>
    public Button horizontalBtn;
    /// <summary>
    /// 加载竖屏广告按钮
    /// </summary>
    public Button verticalBtn;
    /// <summary>
    /// 显示广告内容视频按钮
    /// </summary>
    public Button showVedioBtn;

    public void Awake()
    {
#if UNITY_ANDROID
        //获取Unity的MainActivity的固定写法
        androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        currentActivity = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");
#endif
        //注册事件
        initBtn.onClick.AddListener(InitBtnClick);
        horizontalBtn.onClick.AddListener(HorizontalBtnClick);
        verticalBtn.onClick.AddListener(VerticalBtnClick);
        showVedioBtn.onClick.AddListener(ShowVedioBtnClick);

    }

    /// <summary>
    /// 初始化广告服务
    /// </summary>
    public void InitBtnClick()
    {
        if (currentActivity != null)
        {
            currentActivity.Call("Init");
        }
    }

    /// <summary>
    /// 加载横条广告
    /// </summary>
    public void HorizontalBtnClick()
    {
        if (currentActivity != null)
        {
            currentActivity.Call("LoadHorizontalAD");
        }
    }

    /// <summary>
    /// 加载竖屏广告
    /// </summary>
    public void VerticalBtnClick()
    {
        if (currentActivity != null)
        {
            currentActivity.Call("LoadVerticalAD");
        }
    }

    /// <summary>
    /// 显示广告视频内容
    /// </summary>
    public void ShowVedioBtnClick()
    {
        if (currentActivity != null)
        {
            currentActivity.Call("ShowVedio");
        }
    }

}

 

配置好脚本的按钮的引用,打包APK,在模拟器运行如下

 

点击初始化,加载横条广告

显示视频内容

四.总结 

接入Android的SDK,从Demo出发,再配合说明文档,了解SDK的执行流程。

从Demo中分析几个关键流程,初始化或者一些其他配置等。 

从Demo中寻找有用的的工具,例如 TTAdManagerHolder

AndroidStudio导出的Arr包不含有引入的Arr内容,例如 open_ad_sdk.aar需要导入到Unity中

 

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨守星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值