一:创建工具类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_sdk的接入和获取,详细的使用说明请查看官方文档。
官方文档下载:TAF移动安全工作委员会
请至“移动安全联盟”官网申请
链接:TAF移动安全工作委员会
链接:https://pan.baidu.com/s/1JE8EJnYGI9gCG-ttyX0XuQ?pwd=zz66
提取码:zz66
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();