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…

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

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

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

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

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

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

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…

如何精准选择Yandex关键词

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

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

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

jmeter附件上传

可以采用录制的方式获取附件上传的http请求 普通参数 附件参数 文件名称: 方式一:如果只添项目名称,默认充jmeter的bin目录下获取 方式二:点击文件名称,再点击浏览,可以自己选择文件信息

OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 VIT 跟踪器由于特殊的模型结构而变得更快且极其轻量级,模型文件大约为 767KB。模型下载链接:https://github.com/opencv/…

如何用Python同时抓取多个网页:深入ThreadPoolExecutor

背景介绍 在信息化时代,数据的实时性和获取速度是其核心价值所在。对于体育赛事爱好者、数据分析师和投注行业而言,能否快速、稳定地抓取到实时比赛信息显得尤为重要。特别是在五大足球联赛中,能够在比赛进行时获得比分、控球率等实时数据&a…

【UBuntu20 配置usb网卡】 记录Ubuntu20配置usb网卡(特别是建立热点)

【UBuntu20 配置usb网卡】 Ubuntu20配置usb网卡(特别是建立热点) 一、 闲言碎语的前言 usb的外置网卡,相比Windows即插即用,Linux买回来一顿折腾,准备把过程梳理一下记录起来。 网卡的方案其实就那几家,…

前端开发模块VUE-Element UI学习笔记

前端开发模块VUE-Element UI学习笔记 文章目录 前端开发模块VUE-Element UI学习笔记 1、Element UI 简介2、Element UI 安装3、Icon 图标4、Button 按钮5、Link 超链接6、Radio 单选框7、Checkbox 多选框8、Input 输入框9、Select 下拉框10、Switch 开关 1、Element UI 简介 基…

Java面试经典 150 题.P169. 多数元素(005)

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int majorityElement(int[] nums) …

如何在Python爬虫等程序中设置和调用http代理

在Python爬虫中为了更好地绕过反爬机制,获取网页信息,有时可能需要在Python中应用代理服务,这样做的目的就是防止自己的ip被服务器封禁,造成程序运行时中断连接,那么如何在python中设置代理呢? 我们通过几个…

海思MPP音视频总结

基础篇 1.常用图像格式介绍 常用图像像素格式 RGB 和 YUV。 1.1RGB RGB分类通常指的是将图像或颜色按照RGB(红、绿、蓝)颜色空间进行分组或分类。RGB图像格式通常包括RGB24(RGB888)、RGB32、RGBA、RGB565等。 RGB24是一种常用…

预览 PDF 文档

引言 在现代Web应用中,文件预览功能是非常常见的需求之一。特别是在企业级应用中,用户经常需要查看各种类型的文件,如 PDF、Word、Excel 等。本文将详细介绍如何在Vue项目中实现 PDF 文档的预览功能。 实现原理 后端API 后端需要提供一个…

【c++ gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试

【c gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试 下载谷歌提供的c测试库在VsCode中安装抖音AI大模型找到c项目文件夹,使用VsCode和VS进行双开生成gtest代码进行c单例测试 下载谷歌提供的c测试库 在谷歌浏览器搜索github gtest, 第…