这里写自定义目录标题
最近项目在对接海外谷歌的年龄分级的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写了