사용자의 단말을 특정하기 위해서 예전부터 사용해오던 것들은 점차적으로 구글이 보안을 강화하는 정책으로 변경되면서 사용이 불가하게 변화하고 있다.
deviceId, imei, meid, ANDROID_ID, SERIAL, MAC address 등이 많이 사용되어 왔는데
대부분 deprecated되었고 ANDROID_ID는 기기 재설정시 변경되고 SERIAL은 Android10부터 'unknown'을 반환한다.
2021년 현재는 SSAID가 대체재로서 사용 가능하다.
동일단말에서 같은 개발자의 키스토어로 빌드된 앱들 끼리는 같은 SSAID를 사용할 수 있다.
아래 코드는 안드로이드 버번과 상관없이 항상 유니크한 아이디를 반환해주는 메서드이다.
private fun getUniqueDeviceIdentifier(): String? {
val telephonyManager: TelephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
var uniqueId: String? = null
try {
telephonyManager.deviceId?.let {
uniqueId = it
}
if (uniqueId==null && Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
telephonyManager.imei?.let { uniqueId = it }
if (uniqueId==null) {
telephonyManager.meid?.let { uniqueId = it }
}
}
} catch(e: Exception) {}
if (uniqueId==null) {
uniqueId = Build.SERIAL
}
if (uniqueId==null || uniqueId=="unknown") {
val wifiManager: WifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager
val wifiInfo = wifiManager.connectionInfo
uniqueId = wifiInfo.macAddress
}
if (uniqueId==null || uniqueId=="02:00:00:00:00:00") {
uniqueId = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID)
}
return uniqueId
}