Android 获取OAID

获取OAID

老规矩,直接上:

implementation 'com.huawei.hms:opendevice:6.11.0.300' // 要获取华为vaid 和aaid,还需添加opendevice 依赖implementation(name: 'oaid_sdk_2.5.0', ext: 'aar')
import android.content.Context;
import android.util.Log;import com.bun.miitmdid.core.InfoCode;
import com.bun.miitmdid.core.MdidSdkHelper;
import com.bun.miitmdid.interfaces.IIdentifierListener;
import com.bun.miitmdid.interfaces.IdSupplier;
import com.bun.miitmdid.pojo.IdSupplierImpl;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;/*** MiitHelper.Init(this, new MiitHelper.AppIdsUpdater(){*             @Override*             public void onIdsValid(String oaid){*                 AppActivity.oaid = oaid;*             }*         });*/
public class MyMiitHelper implements IIdentifierListener {public static final String TAG = "MiitHelper";public static final int HELPER_VERSION_CODE = 20210928; // DemoHelper版本号private AppIdsUpdater appIdsUpdater;private boolean isCertInit = false;private static MyMiitHelper instance;public final boolean isSDKLogOn = true;                           // 1)设置 是否开启sdk日志public static String ASSET_FILE_NAME_CERT = "";             // 2)设置 asset证书文件名public static MyMiitHelper getInstance(Context context) {if(instance == null) {synchronized(MyMiitHelper.class) {if(instance == null) {instance = new MyMiitHelper(context);}}}return instance;}public MyMiitHelper(Context context){ASSET_FILE_NAME_CERT = context.getPackageName()+".cert.pem";Log.e(TAG,ASSET_FILE_NAME_CERT);//        System.loadLibrary("nllvm1632808251147706677");  // 加固版本在调用前必须载入SDK安全库// TODO (3)加固版本在调用前必须载入SDK安全库,因为加载有延迟,推荐在application中调用loadLibrary方法System.loadLibrary("msaoaidsec");if(MdidSdkHelper.SDK_VERSION_CODE != HELPER_VERSION_CODE){Log.w(TAG,"SDK version not match.");throw new RuntimeException("SDK version not match.");}// 获取设备号getDeviceIds(context);}public AppIdsUpdater getAppIdsUpdater() {return appIdsUpdater;}public void setAppIdsUpdater(AppIdsUpdater appIdsUpdater) {this.appIdsUpdater = appIdsUpdater;}/*** 获取OAID* @param cxt*/public void getDeviceIds(Context cxt){// TODO (4)初始化SDK证书if(!isCertInit){ // 证书只需初始化一次// 证书为PEM文件中的所有文本内容(包括首尾行、换行符)isCertInit = MdidSdkHelper.InitCert(cxt, loadPemFromAssetFile(cxt, ASSET_FILE_NAME_CERT));if(!isCertInit){Log.w(TAG, "getDeviceIds: cert init failed");}}//(可选)设置InitSDK接口回调超时时间(仅适用于接口为异步),默认值为5000ms.// 注:请在调用前设置一次后就不再更改,否则可能导致回调丢失、重复等问题MdidSdkHelper.setGlobalTimeout(5000);// TODO (5)调用SDK获取IDint code = MdidSdkHelper.InitSdk(cxt, isSDKLogOn, this);// TODO (6)根据SDK返回的code进行不同处理IdSupplierImpl unsupportedIdSupplier = new IdSupplierImpl();if(code == InfoCode.INIT_ERROR_CERT_ERROR){                         // 证书未初始化或证书无效,SDK内部不会回调onSupport// APP自定义逻辑Log.w(TAG,"cert not init or check not pass");onSupport(unsupportedIdSupplier);}else if(code == InfoCode.INIT_ERROR_DEVICE_NOSUPPORT){             // 不支持的设备, SDK内部不会回调onSupport// APP自定义逻辑Log.w(TAG,"device not supported");onSupport(unsupportedIdSupplier);}else if( code == InfoCode.INIT_ERROR_LOAD_CONFIGFILE){            // 加载配置文件出错, SDK内部不会回调onSupport// APP自定义逻辑Log.w(TAG,"failed to load config file");onSupport(unsupportedIdSupplier);}else if(code == InfoCode.INIT_ERROR_MANUFACTURER_NOSUPPORT){      // 不支持的设备厂商, SDK内部不会回调onSupport// APP自定义逻辑Log.w(TAG,"manufacturer not supported");onSupport(unsupportedIdSupplier);}else if(code == InfoCode.INIT_ERROR_SDK_CALL_ERROR){             // sdk调用出错, SSDK内部不会回调onSupport// APP自定义逻辑Log.w(TAG,"sdk call error");onSupport(unsupportedIdSupplier);} else if(code == InfoCode.INIT_INFO_RESULT_DELAY) {             // 获取接口是异步的,SDK内部会回调onSupportLog.i(TAG, "result delay (async)");}else if(code == InfoCode.INIT_INFO_RESULT_OK){                  // 获取接口是同步的,SDK内部会回调onSupportLog.i(TAG, "result ok (sync)");}else {// sdk版本高于DemoHelper代码版本可能出现的情况,无法确定是否调用onSupport// 不影响成功的OAID获取Log.w(TAG,"getDeviceIds: unknown code: " + code);}}/*** APP自定义的getDeviceIds(Context cxt)的接口回调* @param supplier*/@Overridepublic void onSupport(IdSupplier supplier) {if(supplier==null) {Log.w(TAG, "onSupport: supplier is null");return;}if(appIdsUpdater ==null) {Log.w(TAG, "onSupport: callbackListener is null");return;}// 获取Id信息// 注:IdSupplier中的内容为本次调用MdidSdkHelper.InitSdk()的结果,不会实时更新。 如需更新,需调用MdidSdkHelper.InitSdk()boolean isSupported = supplier.isSupported();boolean isLimited  = supplier.isLimited();String oaid=supplier.getOAID();String vaid=supplier.getVAID();String aaid=supplier.getAAID();//TODO (7) 自定义后续流程,以下显示到UI的示例String idsText= "support: " + (isSupported ? "true" : "false") +"\nlimit: " + (isLimited ? "true" : "false") +"\nOAID: " + oaid +"\nVAID: " + vaid +"\nAAID: " + aaid + "\n";Log.d(TAG, "onSupport: ids: \n" + idsText);appIdsUpdater.onIdsValid(oaid);}public interface AppIdsUpdater {void onIdsValid(String oaid);}/*** 从asset文件读取证书内容* @param context* @param assetFileName* @return 证书字符串*/public static String loadPemFromAssetFile(Context context, String assetFileName){try {InputStream is = context.getAssets().open(assetFileName);BufferedReader in = new BufferedReader(new InputStreamReader(is));StringBuilder builder = new StringBuilder();String line;while ((line = in.readLine()) != null){builder.append(line);builder.append('\n');}return builder.toString();} catch (IOException e) {Log.e(TAG, "loadPemFromAssetFile failed");return "";}}
}

oaid_sdk_2.5.0.aar在资源里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日互动基于 Apache DolphinScheduler 从容应对ClickHouse 大数据入库瓶颈

引言 大家好,我叫张琦,来自每日互动,担任大数据平台架构师。今天我将分享我们团队在基于Apache DolphinScheduler实现ClickHouse零压入库过程中的实践经验。 这个实践项目涉及到两个关键组件:Apache DolphinScheduler和ClickHous…

[vulnhub] Brainpan1

https://www.vulnhub.com/entry/brainpan-1,51/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的,所以靶机IP是166 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-1…

JAVA的设计模式都有那些

Java设计模式是为了解决软件开发中常见的问题而创建的一系列最佳实践。它们提供了一种在特定情境下解决问题的方法论,并且已经被广泛验证和应用。这些模式不是具体的代码,而是关于如何组织代码以达到某种目的的高层次描述。设计模式通常分为三大类&#…

一致校验矩阵计算

目录 T1T2T3 T1 设二元(7,4)码的生成矩阵为: G [ 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 1 1 1 0 ] G\begin{bmatrix}1&0&0&0&1&1&1\\0&1&0&0&1&0&1\\0&0&1&0&0&1&1\\0&…

数学建模与优化算法:从基础理论到实际应用

数学建模和优化算法,它们不仅帮助我们理解和描述复杂系统的行为,还能找到系统性能最优化的解决方案。本文将从基础的数学理论出发,逐步深入到各种优化算法,并探讨它们在实际问题中的应用。 思维导图文件可获取:https:…

关于使用K8s实现容器化作业的总时效最优调度

一、Kubernetes对总时效最优调度实现的情况 Kubernetes 可以帮助实现一定程度的时效性优化,但要达到“总时效性最优”还需要一些额外的配置和调度策略。以下是一些可以提升整体时效性的策略: 1. 资源请求和限制设置 为每个容器设置合适的资源请求和限制…

判断对象、数组的方法

判断对象的方法 Object.prototype.toString.call(obj) ‘[object Object]’ 推荐指数 :五颗星obj instanceof Object 推荐指数 :四颗星typeof obj Object 推荐指数 :三颗星 注意:null也是一个对象 typeof(null) Object obj…

基于Intel Gaudi AI加速器的大语言模型微调与推理优化赛题等你挑战 | CCF BDCI进行时

一年一度的行业盛事2024 CCF大数据与计算智能大赛(简称2024 CCF BDCI)又在激烈进行中啦! 多个赛题等你挑战还没有报名的伙伴们抓紧时间咯,叫上你伙伴练起来吧! 2024 CCF大数据与计算智能大赛 CCF大数据与计算智能大…

使用 FastGPT 工作流搭建 GitHub Issues 自动总结机器人

如今任何项目开发节奏都很快,及时掌握项目动态是很重要滴,GitHub Issues 一般都是开发者和用户反馈问题的主要渠道。 然而,随着 Issue 数量的增加,及时跟进每一个问题会变得越来越困难。 为了解决这个痛点,我们开发了…

GEE 高阶应用:下载全球任何国家的森林损失保存到assets中

目录 简介 数据 函数 filterMetadata(name, operator, value) Arguments: Returns: Collection aggregate_array(property) Arguments: Returns: List ee.Number.parse(input, radix) Arguments: Returns: Number clipToCollection(collection) Arguments: Retu…

C++ 在项目中使用vim

一:概述 除了掌握 Vim 的基本操作,利用 Vim 阅读项目源码的方法同样重要,这对实际项目开发大有裨益。虽然现在有许多人选择使用 VSCode,但在某些环境中,可能无法安装 VSCode 或联网下载插件,这时使用 Vim 就…

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(一)认识和了解Build.cs

目录 引言 一、创建一个C插件TextureReader插件 二、Build.cs文件 三、ModuleRules 四、TextureReader插件的构造 4.1ReadOnlyTargetRules的作用 4.2TextureReaderd的构造调用 4.3设置当前类的预编译头文件的使用模式 4.4PublicIncludePaths.AddRange与PrivateInclude…

探索C嘎嘎:初步接触STL

#1024程序员节|征文# 前言: 在前文小编讲述了模版初阶,其实讲述模版就是为了给讲STL提前铺垫,STL是C中很重要的一部分,各位读者朋友要知道它的份量,下面废话不多说,开始走进STL的世界。 目录&am…

指令系统 I(指令的格式、寻址)

一、指令系统 1. 指令集体系结构 指令(机器指令)是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统,也称指令集。 指令系统是指令集体系结构(ISA&#xf…

说一说QWidget

目录 关于QWidget 作为界面组件时,你需要有印象的 1. 控制属性 2. 组件状态与交互属性 3. 外观和样式属性 4. 布局与子组件管理属性 5. 图标和光标属性 6. 大小策略属性 作为单独的窗体的属性 写Qt快两年了,也写过一些规模偏大的软件&#xff0c…

刘艳兵-DBA015-对于属于默认undo撤销表空间的数据文件的丢失,哪条语句是正确的?

对于属于默认undo撤销表空间的数据文件的丢失,哪条语句是正确的? A 所有未提交的交易都将丢失。 B 数据库实例中止。 C 数据库处于MOUNT状态,需要恢复才能打开。 D 数据库保持打开状态以供查询,但除具有SYSDBA特权的用…

如何精准选择Yandex关键词

Hey小伙伴们👋,今天来聊聊如何精准选择Yandex关键词,让你的广告投放效果最大化!🔍 1.使用Yandex关键词工具:Yandex提供了关键词工具,如Yandex Keyword Planner和Yandex Wordstat&#xff0…

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐: 随着 AI 技术的不断发展,视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中,图像与文字的交互需求愈发旺盛,很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

go语言回调函数的使用

前言 在 Go 语言中,回调函数是一种将一个函数作为参数传递给另一个函数,在特定的事件发生时被调用的编程模式。 一、回调函数的定义 type OnTaskHandler func(r []byte)type remoteTaskClient struct {sync.RWMutexonTask OnTaskHandler } 以上定义了…

Kubernetes(k8s)挂载hostPath和emptyDir两种volume的区别

Kubernetes挂载可以指定多种类型的volume,这篇文章聊一下hostPath和emptyDir两种volume的区别。 hostPath类型是将宿主机的目录或者文件挂载到容器中,这样容器写入和读取的数据是直接反映在宿主机上的,这种方式产生的数据可以在不同pod之间共…