Android工程中imei和oaid的获取_ER280652的博客-程序员宅基地_oaid获取

技术标签: android  oaid  Android  

IMEI的获取

一:创建工具类ImeiUtils

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.telephony.TelephonyManager;

public class ImeiUtils {

    /**
     * 获取设备Imei号
     *
     * 注意:获取imei需要动态申请 READ_PHONE_STATE 权限
     *
     * Android 10 及以上获取不到imei
     *
     * @param context
     * @return
     */
    @SuppressLint({"MissingPermission", "HardwareIds"})
    public static String getImei(Context context) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {
            return null;
        } else {
            try {
                TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                String deviceId = telephonyManager.getDeviceId();
                return deviceId;
            } catch (Exception e) {
                return null;
            }
        }
    }
}

二:获取imei

String imei = ImeiUtils.getImei(this);
Log.d("IMEI", "imei:" + imei);

OAID的获取

前言:

该文档只演示了最基础的oaid_sdk的接入和获取,详细的使用说明请查看官方文档。

官方文档下载:TAF移动安全工作委员会

一、申请证书

请至“移动安全联盟”官网申请

链接:TAF移动安全工作委员会

二、下载demo、oaid_sdk_1.1.0.aar 和 supplierconfig.json

链接:https://pan.baidu.com/s/1JE8EJnYGI9gCG-ttyX0XuQ?pwd=zz66

提取码:zz66

三、在工程中接入oaid_sdk_1.1.0

1:在app/src/main下创建assets文件夹(有的话就不需要再创建了)

2:将申请到的证书和supplierconfig.json放入到工程中的assets文件夹

3:将oaid_sdk_1.1.0.aar放入到app/libs文件夹中

4:在app/build.gradle中的dependencies下添加依赖

implementation files("libs/oaid_sdk_1.1.0.aar")

注意:添加完成后,点击右上角的Sync Now(没有的话就不用点,重启一下AndroidStudio也是同样的效果)

5:在app/proguard-rules.pro里面添加混淆配置:

## oaidSdk混淆配置
-keep class com.bun.miitmdid.** { *; }
-keep interface com.bun.supplier.** { *; }
# asus
-keep class com.asus.msa.SupplementaryDID.** { *; }
-keep class com.asus.msa.sdid.** { *; }
# freeme
-keep class com.android.creator.** { *; }
-keep class com.android.msasdk.** { *; }
# huawei
-keep class com.huawei.hms.ads.** { *; }
-keep interface com.huawei.hms.ads.** {*; }
# lenovo
-keep class com.zui.deviceidservice.** { *; }
-keep class com.zui.opendeviceidlibrary.** { *; }
# meizu
-keep class com.meizu.flyme.openidsdk.** { *; }
# nubia
-keep class com.bun.miitmdid.provider.nubia.NubiaIdentityImpl
{ *; }
# oppo
-keep class com.heytap.openid.** { *; }
# samsung
-keep class com.samsung.android.deviceidservice.** { *; }
# vivo
-keep class com.vivo.identifier.** { *; }
# xiaomi
-keep class com.bun.miitmdid.provider.xiaomi.IdentifierManager
{ *; }
# zte
-keep class com.bun.lib.** { *; }
# coolpad
-keep class com.coolpad.deviceidsupport.** { *; }

6:编写获取oaid的代码:

import android.content.Context;
import android.util.Log;
import com.bun.miitmdid.core.MdidSdkHelper;
import com.bun.miitmdid.interfaces.IIdentifierListener;
import com.bun.miitmdid.interfaces.IdSupplier;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class GetOaidObject {

    private static final String TAG = "GetOaidObject";

    private static final GetOaidObject instance = new GetOaidObject();

    private boolean isCertInit = false;  // oaid证书是否初始化

    private String oaid = null;

    private GetOaidObject() {
    }

    private void setOaid(String oaid) {
        this.oaid = oaid;
    }

    public String getOaid() {
        return this.oaid;
    }

    public static GetOaidObject getInstance() {
        return instance;
    }

    public void initOaidSdk(Context context) {
        System.loadLibrary("msaoaidsec");  // 加固版本在调用前必须载入SDK安全库

        // 初始化SDK证书
        if (!isCertInit) {  // 证书只需初始化一次
            // 证书为PEM文件中的所有文本内容(包括首尾行、换行符)
            try {
                /*
                 * 注意!!!!!
                 *
                 * 这里的"com.example.oaidtest2.cert.pem"一定要换成你们自己的证书名!证书需要自己到官网上申请!
                 *
                 * 证书名的格式是 "你的工程包名.cert.pem"
                 *
                 * 移动安全联盟官网地址:http://www.msa-alliance.cn/col.jsp?id=120
                 */
                isCertInit = MdidSdkHelper.InitCert(context, loadPemFromAssetFile(context, "com.example.oaidtest2.cert.pem"));
            } catch (Error e) {
                e.printStackTrace();
            }
            if (!isCertInit) {
                Log.w(TAG, "getDeviceIds: cert init failed");
            }
        }

        //(可选)设置InitSDK接口回调超时时间(仅适用于接口为异步),默认值为5000ms.
        // 注:请在调用前设置一次后就不再更改,否则可能导致回调丢失、重复等问题
        try {
            MdidSdkHelper.setGlobalTimeout(5000);
        } catch (Error e) {
            e.printStackTrace();
        }

        int code = 0;
        code = MdidSdkHelper.InitSdk(context, false, new IIdentifierListener() {
            @Override
            public void onSupport(IdSupplier idSupplier) {
                if (idSupplier== null) {
                    Log.e(TAG, "OAIDManager: supplier == null");
                } else {
                    Log.d(TAG, "supplier.oaid:"+idSupplier.getOAID());
                    oaid = idSupplier.getOAID();
                }
            }
        });
        Log.d(TAG, "InitOaidSdk_code:" + code);

        /*
         * InitOaidSdk_code:
         *
         * 1008610 调用成功,获取接口是同步的
         * 1008614 调用成功,获取接口是异步的
         * 1008616 证书未初始化或证书无效
         * 1008611 不支持的厂商
         * 1008612 不支持的设备
         * 1008613 加载配置文件出错
         * 1008615 sdk 调用出错
         */
    }

    /**
     * 从asset文件读取证书内容
     *
     * @param context
     * @param assetFileName
     * @return 证书字符串
     */
    private 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 "";
        }
    }
}

7:初始化oaid,建议在APP启动完成后,尽可能早的初始化oaid

// 初始化oaidSdk
GetOaidObject.getInstance().initOaidSdk(this);

8:调用oaid

注意:因为oaid的获取是异步,所以初始化oaid和获取oaid的间隔要尽量大于2秒!

// 调用oaid
String oaid = GetOaidObject.getInstance().getOaid();

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41361738/article/details/125456522

智能推荐

STM32第二功能引脚映射_JCY-JCY的博客-程序员宅基地_stm32 引脚第二功能

STM32部分外设的第二功能引脚映射作者:JCY时间:2012年12月11日STM32F是ST(意法半导体公司)的产品,本芯片的设计支持了芯片上部分外设第二功能的引脚映射。这为设计STM32的电路板提供了方面,大大简化了电路的设计。当第一次看到AFIO功能的时候感到很困惑,一直不理解,但是最近突然明白了。不敢独享,写此文章与大家分享。本文章纯属个人的理解,如有任何的错误之处请指正,

Oracle在windows新建表,Windows下手动创建Oracle实例_小可爱1号嘻嘻的博客-程序员宅基地

环境版本:Oracle 11g R2Windows 7旗舰版X32步骤目录:1.确定数据库和实例名称2.确认数据库认证方式3.创建数据库初始化参数文件4.创建实例5.连接并启动实例6.使用create database创建数据库7.创建数据库附加表空间8.运行脚本创建数据字典视图9.创建服务器初始化文件具体实施:1.确定数据库和实例名称DB_NAME = DBByManualSID = DBByM...

集合框架AbstractMap_小马和小金的博客-程序员宅基地

AbstractMap:  AbstractMap          AbstractMap继承了Map,但没有实现entrySet()方法(该方法还是abstract修饰),如果要继承AbstractMap,需要自己实现entrySet()方法。没有真正实现put(K key, V value)方法,这里“没有真正实现”的意思是,该方法在形式上已经实现了,即没有用ab...

360手机助手关于签名校验的分析_weixin_30567225的博客-程序员宅基地

360手机助手中软件更新0x01:分析过程使用wireshark抓包分析更新时请求的是一个配置文件,请求url:update.api.sj.360.cn/mintf/getAppsByPackNames后面是参数,请求方式为POST,内容如下:可以看到其中包含了几个关键的参数down_url,apk_md5,signature_md5,size,其中比较关...

代码重构-1_战争迷雾的博客-程序员宅基地_代码重构原则

代码重构的动力:任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。抽取完成复杂功能的函数并简化,把功能分离成其他函数,抽取需改变的变量作为参数。修改变量名称,使变量名称易于理解。如下示例(一) 命名风格 1. 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例:_name / __name / Objec...

内存中栈和堆的作用和区别_藤原豆腐店-的博客-程序员宅基地_堆与栈的作用

首先内存中的堆栈和数据结构中的堆栈是不同的两个东西。内存中分为栈和堆,以及静态存储区、程序代码区等。 内存模型: 从空间上和存放内容上来说:栈:内存空间小一些,栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题。主要存放函数体的地址、函数的参数、局部变量临时变量等。堆:内存空...

随便推点

搭建lnmp--201906_snow12138的博客-程序员宅基地

yum安装基础包 yum -y installvim gcc gcc-c++ bison bison-devel zlib-devel libmcrypt-devel mcrypt mhash-devel openssl openssl-devel libxml2-devel libcurl-devel bzip2 bzip2-devel readline-devel libedit-deve...

肉包后记_LinDaiuuj的博客-程序员宅基地

2020.05.03 肉包的肚子一天比一天大 怀疑是腹水 去医院检查了 确定是 之前老板娘的一只猫咪得了传腹 没想到也会发生在我们自己家的肉包身上 本来都体弱 折耳有先天性遗传疾病 骨头不好 疼痛 去医院检查了了一下 从肚子里吸了半瓶矿泉水那么多 看着他忍受的痛苦 真的想安乐了 让他减少痛苦 鉴于他还能吃喝 决定再等等看 可怜 心疼 那么乖的小肉包 虽然很高冷 不亲人 但是真的好乖 从来不咬不抓...

处理textarea中的换行和空格_yecengxiangshi0426的博客-程序员宅基地_js textarea 换行被转换成了空格

当我们使用 textarea 在前台编辑文字,并用 js 提交到后台的时候,空格和换行是我们最需要考虑的问题。在textarea 里面,空格和换行会被保存为/s和/n,如果我们前台输入和前台显示的文字都是在 textarea 里面,其实并不需要做任何处理,你在 textarea 里面编写的样式会按照你之前编辑时候的样式,正确的显示出来。那么如果你需要 textarea 编辑提交的文字,从后台返回之后,不是显示在 textarea 里面,那么就需要考虑处理空格和换行啦。其实之前在接触的时候,完全没有考

C#中对"Cross-thread operation not valid"错误的处理办法_FireFrame的博客-程序员宅基地_c#挂起类型cross thread

Windows Forms 控件通常不是thread-safe(直接或间接继承于System.Windows.Forms.Control),因此.NET Framework为防止multithread下对控件的存取可能导致控件状态的不一致,在调试时,CLR-Debugger会抛出一个InvalidOperationException以‘建议‘程序员程序可能存在的风险。 问题的关键在于,动机

Windows 10下高效工作——快捷键一览_zorchp的博客-程序员宅基地

本人在Windows10系统使用中总结出的一些快捷键以及技巧总结。

ActiveMQ-基本流程_wait_for_eva的博客-程序员宅基地_activemq的工作流程

基本角色nameactorConnectionFactory链接工厂创建链接Connection远程连接创建会话Session活跃会话具体处理Destination目的地Producer生产者Consuer消费者Message消息基本时序连接目的地ConnectionFactoryConnectionSessionD...

推荐文章

热门文章

相关标签