Android工程中imei和oaid的获取

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(context);
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文件夹(有的话就不需要再创建了)

Android工程中imei和oaid的获取_第1张图片

Android工程中imei和oaid的获取_第2张图片

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

Android工程中imei和oaid的获取_第3张图片

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

Android工程中imei和oaid的获取_第4张图片

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

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

Android工程中imei和oaid的获取_第5张图片

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

Android工程中imei和oaid的获取_第6张图片

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.** { *; }

Android工程中imei和oaid的获取_第7张图片

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();

Android工程中imei和oaid的获取_第8张图片

你可能感兴趣的:(Android,oaid,android)