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