Unity接入Android广告: 三、Android端接入小米广告SDK

1、导入小米广告SDK

SDK在 小米开发者平台 中可以下载
导入MimoSdk.jar,右击jar包,Add As Library
在这里插入图片描述

在Module的AndroidManifest.xml中加入SDK demo 中的相应权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test.testaar" >
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_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.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
</manifest>

导入Assets中的apk文件
在这里插入图片描述

2、编写加载广告的代码

package com.test.testaar;

import android.app.Activity;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.miui.zeus.mimo.sdk.MimoSdk;
import com.miui.zeus.mimo.sdk.ad.AdWorkerFactory;
import com.miui.zeus.mimo.sdk.ad.IAdWorker;
import com.miui.zeus.mimo.sdk.listener.MimoAdListener;
import com.xiaomi.ad.common.pojo.AdType;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class AdsTest {
    // 请注意,千万要把以下的 APP_ID 替换成您在小米开发者网站上申请的 AppID。否则,可能会影响你的应用广告收益。
    private static final String APP_ID = "2882303761517411490";
    // 以下两个没有的话就按照以下传入
    private static final String APP_KEY = "fake_app_key";
    private static final String APP_TOKEN = "fake_app_token";

    private Activity _unityActivity;
    /** * 获取unity项目的上下文 * @return */
    Activity getActivity(){
        if(null == _unityActivity) {
            try {
                Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
                Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
                _unityActivity = activity;
            } catch (ClassNotFoundException e) {

            } catch (IllegalAccessException e) {

            } catch (NoSuchFieldException ignored) {

            }
        }
        return _unityActivity;
    }

    static boolean callUnity(String gameObjectName, String functionName, String args){
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
            method.invoke(classtype,gameObjectName,functionName,args);
            return true;
        } catch (ClassNotFoundException e) {

        } catch (NoSuchMethodException e) {

        } catch (IllegalAccessException e) {

        } catch (InvocationTargetException e) {

        }
        return false;
    }

    public void Init(){
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                callUnity("Main Camera","FromAndroid", " android Init ");

                MimoSdk.setDebugOn();
                // 正式上线时候务必关闭stage
                MimoSdk.setStageOn();

                // 如需预置插件请在assets目录下添加mimo_assets.apk
                MimoSdk.init(getActivity().getApplicationContext(), APP_ID, APP_KEY, APP_TOKEN);

                // 如果api >= 23 需要显式申请权限
// if (Build.VERSION.SDK_INT >= 23) {
// if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED
// || ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
// || ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
// Manifest.permission.READ_PHONE_STATE, Manifest.permission.INTERNET}, 0);
// }
// }
            }
        });
    }

    public void ShowBanner(){
        callUnity("Main Camera","FromAndroid", "ShowBanner");

        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                FrameLayout layout = new FrameLayout(getActivity());
                FrameLayout.LayoutParams frameLayout = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
                frameLayout.gravity=Gravity.BOTTOM|Gravity.CENTER;
                getActivity().addContentView(layout, frameLayout);//显示布局管理器
                try {
                    MimoAdListener listener = new MimoAdListener() {
                        @Override
                        public void onAdPresent() {

                        }

                        @Override
                        public void onAdClick() {

                        }

                        @Override
                        public void onAdDismissed() {

                        }

                        @Override
                        public void onAdFailed(String s) {
                            callUnity("Main Camera","FromAndroid", "onAdFailed");
                        }

                        @Override
                        public void onAdLoaded(int i) {
                            callUnity("Main Camera","FromAndroid", "onAdLoaded");
                        }

                        @Override
                        public void onStimulateSuccess() {

                        }
                    };

                    IAdWorker mBannerAd = AdWorkerFactory.getAdWorker(getActivity(), layout, listener, AdType.AD_BANNER );
                    mBannerAd.loadAndShow("802e356f1726f9ff39c69308bfd6f06a");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

3、在Unity中编写相应接口

using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour {

    public Text m_TextLog;

    private AndroidJavaObject _ajoAds = null;

    private void Start()
    {
        _ajoAds = new AndroidJavaObject("com.test.testaar.AdsTest");
        _ajoAds.Call("Init");
        AddText("Init Ads");
    }

    public void OnBannerClick()
    {
        _ajoAds.Call("ShowBanner");
        AddText("OnBannerClick");
    }

    //接收Android 发过来的消息
    public void FromAndroid(string content)
    {
        AddText(content);
    }

    private void AddText(string content)
    {
        m_TextLog.text += content + " -->> ";
        Debug.Log(content);
    }
}

创建一个Button 用于显示广告
在这里插入图片描述

4、Android导出Aar放入Unity中,真机测试

在这里插入图片描述

这样 Banner 广告就可以显示出来了, 其他类型的广告,按照sdk demo中的实例,也同样可以显示出来

【下载Unity与Android项目】

Unity版本: 2018.2.0
AndroidStudio版本:3.2
参考文章链接:
1.Unity与Android交互方案优化版
2.小米广告接入unity MimoSdk
3.Unity直接调用Android Native Code