背景
安卓10及以上,不再支持獲取imei,但是各個(gè)app還是需要獲取一個(gè)唯一的設(shè)備id,那怎么辦? 工信部牽頭搞了個(gè)移動(dòng)安全聯(lián)盟,里面提供了個(gè)方案。主要是讓各個(gè)手機(jī)廠商提供獲取方法,他們出個(gè)統(tǒng)一sdk方便普通廠商調(diào)用。
工信部的sdk:http://www.msa-alliance.cn/col.jsp?id=120
下面還有兩個(gè)開源的,也一樣能獲取各大廠商的設(shè)備id方案:
https://github.com/gzu-liyujiang/Android_CN_OAID
https://github.com/shuzilm-open-source/Get_Oaid_CNAdid
實(shí)際上,大家都是調(diào)用各個(gè)廠商提供的接口,以調(diào)用努比亞的為例:
import android.content.Context
import android.net.Uri
import android.os.Build
import android.os.Bundle
class NubiaDeviceIDHelper(private val mContext: Context) {
val nubiaID: String?
get() {
var oaid: String? = null
val bundle: Bundle?
val uri = Uri.parse("content://cn.nubia.identity/identity")
try {
if (Build.VERSION.SDK_INT > 17) {
val contentProviderClient =
mContext.contentResolver.acquireContentProviderClient(uri)
bundle = contentProviderClient!!.call("getOAID", null, null)
if (contentProviderClient != null) {
if (Build.VERSION.SDK_INT >= 24) {
contentProviderClient.close()
} else {
contentProviderClient.release()
}
}
} else {
bundle = mContext.contentResolver.call(uri, "getOAID", null, null)
}
val code = bundle!!.getInt("code", -1)
if (code == 0) {
oaid = bundle.getString("id")
return oaid
}
return oaid
} catch (e: Exception) {
e.printStackTrace()
}
return oaid
}
}
不同廠商的調(diào)用方式不一樣,詳見上述開源項(xiàng)目。