写下这篇博客是因为,我最近在尝试实现游戏内置广告,试的是tap tap的路径。
接入广告建议获取用户的OAID码,追踪用户后续的注册、购买情况,广告数据就会好看一点,游戏开发者的收入就多一点。
获取用户的OAID码,官方的方法是去MSA注册企业账号,申请,获取SDK。但我不是企业,我是个人,我就拿不到。所幸GitHub上有大佬提供了无版权风险的开源方案,我用他的SDK获取OAID,感恩。
但是呢,这个方案主要是接Android Studio的,unity安卓这边的参考资料比较少、杂、旧,所以写这篇博客补充一下。
前置条件
unity 2022.3.12f1c1
先创建unity项目,把打包平台切换到安卓,在Edit→Player→安卓栏→Publishing Settings→Build中勾选这三样,确保生成Asset/Plugin/Android文件夹和对应的文本文件,再继续阅读哦
获取并部署安卓SDK
声明,我是个人开发者,我没有企业身份去申请MSA的账号和下载那边提供的SDK。
所以我用了开源方案Android_CN_OAID,下载.aar包,把.aar包直接拖入unity项目的Asset/Plugin/Android文件夹中。
如果是其它.arr包,这时候是可以直接用了的,不需要其它配置。但是呢获取OAID还需要继续搞。
配置unity安卓打包
询问权限
打开Assets\Plugins\Android\AndroidManifest.xml
在xmlns:tools=...
之下,<application>
之上,添加以下内容。作用是当用户启动软件时,软件自动询问获取手机权限,包括获取OAID码。
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
配置maven
如果不配置这一步,华为/荣耀手机会拿不到OAID码。报错Unity Android Plugin Error: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/hihonor/ads/identifier/AdvertisingIdClient;
,意思是找不到类定义。大家可以在这个issue找到解决方案。
对应到unity的操作:打开Assets\Plugins\Android\settingsTemplate.gradle,添加以下内容,粘贴两次,位置如图所示。
maven { url 'https://developer.huawei.com/repo/' }
maven { url 'https://developer.hihonor.com/repo' }
java开发
这个SDK获取oaid码是异步的,首先需要调用注册函数,其参数传入application,然后获取OAID。
我们在C#脚本里可以直接调,但是写起来很别扭,并且debug会很困难。所以,先写个.java文件封装一层,再用C#开袋即食。
在Assets\Plugins\Android\下新建OaidWrapper.java。以下是我觉得需要注意的点:
- 我们需要在.java文件的第一行声明package,以此在C#文件中查找到它。我随手起了个包名叫com.custom,如果你有更好的想法请自行修改。
- unity自带静态函数
UnityPlayer.currentActivity
来获取unity安卓程序本身的activity。然后,我们可以用.getApplication()
把它转成我们需要的application。
package com.custom;
import android.app.Application;
import android.app.Activity;
import com.unity3d.player.UnityPlayer;
import com.github.gzuliyujiang.oaid.DeviceIdentifier;
import com.github.gzuliyujiang.oaid.IRegisterCallback;
public class OaidWrapper
{
private Application application;
public void register()
{
application = UnityPlayer.currentActivity.getApplication();
DeviceIdentifier.register(application, false, new IRegisterCallback() {
@Override
public void onComplete(String clientId, Exception error) {
// do something
}
});
}
public String getOAID()
{
return DeviceIdentifier.getOAID(application);
}
}
unity调用java代码
我属实是没搞懂这个异步应该怎么安排,自认为代码写得很烂。所以只放出重要的代码块。其它内容就交给大家设计了。
我按常规项目新建了一个C#脚本,名叫OaidGetter,用于调用我封装的java文件。
首先,你需要问询用户是否授予权限,允许你获取OAID码?
接着,等待用户反馈是否授权。我的方法是直接await Task.Delay(3000);
瞎等…如果有更好的方法请大佬教教orz
然后执行:
if(Permission.HasUserAuthorizedPermission("android.permission.READ_PHONE_STATE"))
OaidGetter.Register();
调用注册函数的代码如下:
private static AndroidJavaObject jo;
public static void Register()
{
if (Application.platform == RuntimePlatform.Android)
{
jo = new AndroidJavaObject("com.custom.OaidWrapper");
jo.Call("register");
}
}
最后获取OAID
jo.Call<string>("getOAID");
真机调试
网上有很多关于unity真机调试方法的博客,写得很完善,我就不赘述了。
最后,这个博客提到的、创建的、重要的文件如图所示5个,大家别错漏了。