unity出安卓年龄分级的arr包问题

这里写自定义目录标题

最近项目在对接海外谷歌的年龄分级的API,记录一下,

1.unity 代码

using UnityEngine;

public class AgeSignalsManager : MonoBehaviour

{

private AndroidJavaObject ageSignalsHelper;

复制代码
void Start()
{
    if (Application.platform == RuntimePlatform.Android)
    {
        // 获取Unity的Activity
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

        // 创建AgeSignalsHelper实例
        ageSignalsHelper = new AndroidJavaObject("com.example.agesignalslib.AgeSignalsHelper", activity);

        // 创建回调代理
        AgeSignalsCallbackProxy callback = new AgeSignalsCallbackProxy();
        Debug.Log("----01--------");
        Debug.Log("----01--------");
        // 调用getAgeSignals方法

        ageSignalsHelper.Call("getAgeSignals2");
        ageSignalsHelper.Call("getAgeSignals", callback);
    }
    else
    {
        Debug.Log("Age Signals only available on Android.");
    }
}

}

// 实现回调接口的代理类

public class AgeSignalsCallbackProxy : AndroidJavaProxy

{

public AgeSignalsCallbackProxy() : base("com.example.agesignalslib.AgeSignalsHelper$AgeSignalsCallback") {}

复制代码
// 成功回调
void onSuccess(string userStatus, int ageLower, int ageUpper, string installId, string mostRecentApprovalDate)
{
    Debug.Log("Age Signals Success:");
    Debug.Log("User Status: " + userStatus);
    Debug.Log("Age Range: " + ageLower + " - " + ageUpper);
    Debug.Log("Install ID: " + installId);
    Debug.Log("Most Recent Approval Date: " + mostRecentApprovalDate);

    // 在这里处理年龄信息,例如更新UI或游戏逻辑
}

// 失败回调
void onFailure(int errorCode, string errorMessage)
{
    Debug.LogError("Age Signals Error: " + errorCode + " - " + errorMessage);
}

}

2.安卓代码

package com.example.agesignalslib;

import android.content.Context;

import android.util.Log;

/*

import com.google.android.play.core.integrity.AgeSignalsManagerFactory;

import com.google.android.play.core.integrity.AgeSignalsRequest;

import com.google.android.play.core.integrity.IntegrityServiceException;

import com.google.android.play.core.integrity.model.AgeSignalsVerificationStatus;

*/

// 错误路径:

// import com.google.android.play.core.integrity.AgeSignalsManagerFactory;

// import com.google.android.play.core.integrity.AgeSignalsRequest;

// import com.google.android.play.core.integrity.IntegrityServiceException;

// import com.google.android.play.core.integrity.model.AgeSignalsVerificationStatus;

// 正确路径:

import com.google.android.play.agesignals.AgeSignalsManager;

import com.google.android.play.agesignals.AgeSignalsManagerFactory;

import com.google.android.play.agesignals.AgeSignalsRequest;

import com.google.android.play.agesignals.AgeSignalsException; // 注意:异常类名也不同

import com.google.android.play.agesignals.model.AgeSignalsVerificationStatus;

public class AgeSignalsHelper {

复制代码
private static final String TAG = "AgeSignals_Native_sjj";

// 定义一个简单的接口,方便 Unity 端实现 AndroidJavaProxy
public interface AgeSignalsCallback {
    void onSuccess(String userStatus, int ageLower, int ageUpper, String installId, String mostRecentApprovalDate);
    void onFailure(int errorCode, String errorMessage);
}

private Context context;

public AgeSignalsHelper(Context context) {
    this.context = context;
}

public void getAgeSignals(AgeSignalsCallback callback) {
    Log.i(TAG, "-sjj-Requesting age signals...");

    try {

        AgeSignalsManager ageSignalsManager = AgeSignalsManagerFactory.create(context);
        ageSignalsManager.checkAgeSignals(AgeSignalsRequest.builder().build())
                .addOnFailureListener(e -> {
                    if (e instanceof AgeSignalsException) {
                        int errorCode = ((AgeSignalsException) e).getErrorCode();
                        // 常见的代表"不支持"或"不可用"的错误码:
                        // -4 (PLAY_SERVICES_NOT_AVAILABLE): 设备没有 Google Play 服务或版本太低
                        // -6 (PLAY_STORE_VERSION_OUTDATED): Google Play 商店版本太旧
                        // -5 (CANNOT_BIND_TO_SERVICE): 无法连接到 Play 服务(常发生于非 GMS 设备)
                        Log.i("AgeSignals", "-sjj-设备不支持,错误码: " + errorCode);
                    }
                });
        Log.i(TAG, "-sjj-Requesting age signals02...");
        AgeSignalsManagerFactory.create(context.getApplicationContext())
                .checkAgeSignals(AgeSignalsRequest.builder().build())
                .addOnSuccessListener(ageSignalsResult -> {
                    Log.i(TAG, "-sjj-Age signals received successfully");

                    // 将 int 状态转换为易读的 String,方便 Unity 处理
                    String statusStr = convertStatusToString(ageSignalsResult.userStatus());

                    // 对于 Integer 对象,如果为空则传 -1,避免 Unity 处理 null 导致异常
                    int ageLower = (ageSignalsResult.ageLower() != null) ? ageSignalsResult.ageLower() : -1;
                    int ageUpper = (ageSignalsResult.ageUpper() != null) ? ageSignalsResult.ageUpper() : -1;

                    String installId = ageSignalsResult.installId();

                    // 转换日期
                    String approvalDate = "";
                    if (ageSignalsResult.mostRecentApprovalDate() != null) {
                        approvalDate = ageSignalsResult.mostRecentApprovalDate().toString();
                    }

                    if (callback != null) {
                        callback.onSuccess(statusStr, ageLower, ageUpper, installId, approvalDate);
                    }
                })
                .addOnFailureListener(e -> {
                    Log.e(TAG, "-sjj-Failed to get age signals: " + e.getMessage());
                    int errorCode = -100;

                    // 更改为 AgeSignalsException
                    if (e instanceof com.google.android.play.agesignals.AgeSignalsException) {
                        errorCode = ((com.google.android.play.agesignals.AgeSignalsException) e).getErrorCode();
                    }

                    if (callback != null) {
                        callback.onFailure(errorCode, e.getMessage());
                    }
                });
    } catch (Exception e) {
        Log.e(TAG, "-sjj-Fatal error: " + e.getMessage());
        if (callback != null) callback.onFailure(-999, e.getMessage());
    }
}

private String convertStatusToString(int status) {
    switch (status) {
        case AgeSignalsVerificationStatus.VERIFIED: return "VERIFIED";
        case AgeSignalsVerificationStatus.DECLARED: return "DECLARED";
        case AgeSignalsVerificationStatus.SUPERVISED: return "SUPERVISED";
        case AgeSignalsVerificationStatus.SUPERVISED_APPROVAL_PENDING: return "SUPERVISED_APPROVAL_PENDING";
        case AgeSignalsVerificationStatus.SUPERVISED_APPROVAL_DENIED: return "SUPERVISED_APPROVAL_DENIED";
        default: return "UNKNOWN";
    }
}

public void getAgeSignals2()
{
    Log.i(TAG, "getAgeSignals2---sjj---");

}

}

3.安卓的build.gradle

这个不知道哪个版本是对的,https://developer.android.com/google/play/age-signals/use-age-signals-api网上的信息说这个api网页里的内容是老的,谷歌实际的包体开发是快于api网页的更新,很多说是谷歌那边开发完了之后才会去更新api网页,所以我做的时候不知道是不是因为Use Play Age Signals API (beta) 是beta的缘故,很多的包体引用都对不上,这个也是拖延时间的重要原因,需要自己去实际测试是引用这个 implementation 'com.google.android.play:age-signals:0.0.3'

还是引用 implementation 'com.google.android.play:integrity:1.6.0' 网上说现在谷歌在做分离,所以当前的时间点并不稳定,这个着实是坑了一把

4.重点

dependencies {

// 核心 Play Integrity 库

implementation 'com.google.android.play:integrity:1.6.0'

implementation 'com.google.android.play:age-signals:0.0.3'

implementation 'com.google.android.gms:play-services-auth:21.5.1'

implementation 'com.android.support:multidex:1.0.3'

}

就算你在安卓的build里配置了依赖,但是如果导出AAR给unity使用,在某些unity项目的设置里会把这种依赖并没有真的打到apk里或者国内的原因没有下载到就会莫名奇妙的遇到 下图 的报错,很郁闷,所以需要把aar包一起放到plugin目录下边 ](https://i-blog.csdnimg.cn/direct/e342355842c740e69218ce772c982468.png)

最近感觉csdn怎么查资料老是收费,还是简书好用,以后不在CSDN写了

相关推荐
kejiashao3 小时前
Android View的绘制流程及事件分发机制
android
小蜜蜂嗡嗡3 小时前
flutter实现付费解锁内容的遮挡
android·flutter
进击的cc3 小时前
拒绝背诵!一文带你打穿 Android ANR 发生的底层全链路
android·面试
进击的cc4 小时前
App 启动优化全家桶:别再只盯着 Application 了,热启动优化你真的做对了吗?
android·面试
WMX10124 小时前
Holoens2开发报错记录02_unity项目常见错误
unity
彭波3964 小时前
安卓手机端安装xapk、apkm软件!怎样安装xapk软件?安卓的apk和XAPK的区别?附教程
android·智能手机
魔士于安4 小时前
宇宙版地球模拟器
游戏·unity·游戏引擎·贴图·模型
Yang-Never5 小时前
ADB ->adb shell perfetto 抓取 trace 指令
android·开发语言·adb·android studio
魔士于安6 小时前
氛围感游戏场景,天空盒,带地形,附赠一个空要塞
游戏·unity·游戏引擎·贴图