Unity Android获取OAID码

写下这篇博客是因为,我最近在尝试实现游戏内置广告,试的是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个,大家别错漏了。
在这里插入图片描述

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值