Notice
Recent Posts
Recent Comments
Link
투케이2K
115. (TWOK/UTIL) [Android/kotlin] S_DeviceID - 단말기 고유값 지정 실시 본문
[설 명]
프로그램 : Android / Kotlin
설 명 : S_DeviceID - 단말기 고유값 지정 실시
[소스 코드]
package com.example.kotlinproject
import android.content.Context
import android.media.MediaDrm
import android.os.Build
import android.provider.Settings
import android.util.Base64
import android.util.Log
import java.util.*
class S_DeviceID {
/**
* // -----------------------------------------
* TODO [클래스 설명]
* // -----------------------------------------
* 1. 단말기 고유값을 추출하는 클래스
* // -----------------------------------------
* 2. 호출 방법 :
* S_DeviceID.setDeviceID(A_Main.this); //TODO 단말기 고유값 지정
* S_DeviceID.getDeviceID(A_Main.this); //TODO 저장된 단말기 고유값 호출
* // -----------------------------------------
* 3. 저장 확인 :
* String DeviceID = "";
* DeviceID = S_DeviceID.getDeviceID(A_Main.this);
* // TODO IF 저장된 단말기값이 널이 아닌 경우 / ELSE 널인 경우
* if(DeviceID != null && DeviceID.length() > 0 && !DeviceID.equals("") && !DeviceID.contains("null")) { } else { }
* // -----------------------------------------
* 4. 로직 : Widevine 값 > Anroid ID 값 > 랜덤 UUID > 빌드 정보 > 기본 값
* // -----------------------------------------
* 5. Widevine ID :
* - 앱 삭제 or 데이터 삭제해도 변경되지 않음
* - DRM 모듈은 글로벌 범위에서 유일한 GUID값을 갖는다
* - DRM 모듈이 없는 디바이스에서는 사용이 불가능하다
* - 안드로이드 4.3 미만은 사용이 불가능하다
* - 디바이스 초기화 시 값이 변경됨
* // -----------------------------------------
* 6. Anroid ID : 기기 부팅 시 최초로 생성되는 고유값
* - 오레오 버전 이상 부터 배포용, 디버깅용 APK 파일 고유값이 다르게 지정됨
* - 디바이스 초기화 시 값이 변경됨
* // -----------------------------------------
* 7. 빌드 정보 : 사용자 모바일 빌드 정보를 조합해서 디바이스 고유값을 만듦
* // -----------------------------------------
* */
// TODO [companion object >> static 선언 실시]
companion object {
// TODO [클래스 명칭 선언 실시]
private val ACTIVITY_NAME = "S_DeviceID"
//TODO [디바이스 고유값 저장 메소드]
fun setDeviceID(mContext: Context) {
try {
val thread = Thread {
try {
// TODO [하드웨어 기기 고유값 확인]
var deviceId = ""
deviceId = getHardWareID(mContext)
// TODO [디바이스 고유값 저장]
setDeviceString(mContext, "DeviceSpecialDataTwok", deviceId)
setDeviceString(mContext, "DeviceSpecialDataTwok", deviceId)
Log.i("---","---" + "\n")
Log.e("//===========//","================================================")
Log.i("","\n"+"["+ACTIVITY_NAME+" >> setDeviceID() :: 디바이스 고유값 저장 확인 실패]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[Device :: "+ getDeviceID(mContext) +"]")
Log.e("//===========//","================================================")
Log.i("---","---" + "\n")
}
catch (ex: Exception) {
ex.printStackTrace()
Log.i("---","---" + "\n")
Log.w("//===========//","================================================")
Log.i("","\n"+"["+ACTIVITY_NAME+" >> setDeviceID() :: 디바이스 고유값 저장 확인 실시]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[error :: "+ ex.message +"]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[로 직 :: "+ "일반 UUID 지정 실시" +"]")
Log.w("//===========//","================================================")
Log.i("---","---" + "\n")
// TODO [일반 UUID 랜덤 고유값 확인]
var randomUuid = UUID.randomUUID().toString()
randomUuid = randomUuid.replace(" ".toRegex(), "")
setDeviceString(mContext, "DeviceSpecialDataTwok", randomUuid)
setDeviceString(mContext, "DeviceSpecialDataTwok", randomUuid)
}
}
thread.start()
thread.join()
} catch (e: Exception) {
e.printStackTrace()
// TODO [일반 UUID 랜덤 고유값 확인]
var randomUuid = UUID.randomUUID().toString()
randomUuid = randomUuid.replace(" ".toRegex(), "")
setDeviceString(mContext, "DeviceSpecialDataTwok", randomUuid)
setDeviceString(mContext, "DeviceSpecialDataTwok", randomUuid)
}
}
//TODO [디바이스 하드웨어 고유값 추출 메소드]
fun getHardWareID(mContext: Context): String {
// TODO [와이드 빈]
var WideId = ""
var WideUuid: UUID? = null
// TODO [Android ID]
var AndroidID = ""
// TODO [빌드 정보]
var BuildData = ""
var Base64BuildData = ""
// TODO [와이드 빈 추출]
try {
WideUuid = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L)
var mediaDrm: MediaDrm? = null
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
mediaDrm = MediaDrm(WideUuid)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
if (mediaDrm != null && mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID) != null
&& mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID).size > 0) {
WideId = Base64.encodeToString(mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID), 0).trim()
}
else {
WideId = ""
}
}
} catch (e: Exception) {
e.printStackTrace()
WideId = ""
}
// TODO [AndroidID 추출]
try {
AndroidID = Settings.Secure.getString(mContext.contentResolver, Settings.Secure.ANDROID_ID)
AndroidID = AndroidID.replace(" ", "")
} catch (e: Exception) {
e.printStackTrace()
AndroidID = ""
}
// TODO [빌드 정보 추출]
try {
/**
* // -----------------------------------------
* Log.d("[BRAND] ","samsung");
* Log.d("[BOARD] ", "MSM8916");
* Log.d("[ID] ","MMB29M");
* Log.d("[DEVICE] ","a5ulteskt");
* Log.d("[DISPLAY] ","MMB29M.A500SKSU1CQB1");
* Log.d("[HOST] ","SWDG5309");
* Log.d("[MANUFACTURER] ","samsung");
* Log.d("[MODEL] ","SM-A500S");
* Log.d("[PRODUCT] ","a5ulteskt");
* Log.d("[TAGS] ","release-keys");
* Log.d("[TYPE] ","user");
* Log.d("[USER] ","dpi");
* Log.d("[BOOTLOADER] ","A500SKSU1CQB1");
* // -----------------------------------------
*/
BuildData = Build.BRAND.toLowerCase() + ":" + Build.BOARD.toLowerCase() + ":" + Build.HOST.toLowerCase() + ":" + Build.MODEL.toLowerCase()
try {
BuildData += ":" + Build.VERSION.RELEASE.toString() // [안드로이드 OS 버전]
}
catch (e: Exception) {
e.printStackTrace()
}
BuildData = BuildData.replace(" ", "")
Base64BuildData = Base64.encodeToString(BuildData.toByteArray(), Base64.NO_WRAP)
}
catch (e: Exception) {
e.printStackTrace()
BuildData = ""
Base64BuildData = ""
}
// TODO [일반 UUID 랜덤 고유값 확인]
var randomUuid = UUID.randomUUID().toString()
randomUuid = randomUuid.replace(" ", "")
// TODO [추출된 정보 확인 : 기본 Base64 데이터]
Log.i("---", "---")
Log.d("//===========//", "================================================")
Log.i("","\n"+"["+ACTIVITY_NAME+" >> getHardWareID() :: [기본 Base64] 디바이스 고유값 추출 정보 확인 실시]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[WIDE BEAN :: "+ WideId +"]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[ANDROID ID :: "+ AndroidID +"]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[BUILD TOTAL [원본] :: "+ BuildData +"]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[BUILD TOTAL [Base64] :: "+ Base64BuildData +"]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[RANDOM UUID :: "+ randomUuid +"]")
Log.d("//===========//", "================================================")
Log.i("---", "---")
// TODO [UUID 변환 정보 확인 실시]
var WIDEvalue = ""
var WIDEdeviceId = ""
if (WideId != null && WideId.trim().equals("") == false && WideId.trim().equals("null") == false && WideId.trim().length > 0
&& WideId.trim().contains("000000") == false && WideId.trim().contains("111111") == false
&& WideId.trim().contains("ffffff") == false && WideId.trim().equals("0") == false) {
WIDEvalue = WideId // TODO [와이드 빈]
val WIDEdeviceUuid = UUID.nameUUIDFromBytes(WIDEvalue.toByteArray())
WIDEdeviceId = WIDEdeviceUuid.toString()
WIDEdeviceId = WIDEdeviceId.replace(" ".toRegex(), "")
}
var ANDROIDvalue = ""
var ANDROIDdeviceId = ""
if (AndroidID != null && AndroidID.trim().equals("") == false && AndroidID.trim().equals("null") == false && AndroidID.trim().length > 0
&& AndroidID.trim().contains("000000") == false && AndroidID.trim().contains("111111") == false
&& AndroidID.trim().contains("ffffff") == false && AndroidID.trim().equals("0") == false) {
ANDROIDvalue = AndroidID // TODO [Android ID]
val ANDROIDdeviceUuid = UUID.nameUUIDFromBytes(ANDROIDvalue.toByteArray())
ANDROIDdeviceId = ANDROIDdeviceUuid.toString()
ANDROIDdeviceId = ANDROIDdeviceId.replace(" ".toRegex(), "")
}
var BUILDvalue = ""
var BUILDdeviceId = ""
if (Base64BuildData != null && Base64BuildData.trim().equals("") == false && Base64BuildData.trim().equals("null") == false && Base64BuildData.trim().length > 0
&& Base64BuildData.trim().contains("000000") == false && Base64BuildData.trim().contains("111111") == false
&& Base64BuildData.trim().contains("ffffff") == false && Base64BuildData.trim().equals("0") == false) {
BUILDvalue = Base64BuildData // TODO [빌드 정보]
val BUILDdeviceUuid = UUID.nameUUIDFromBytes(BUILDvalue.toByteArray())
BUILDdeviceId = BUILDdeviceUuid.toString()
BUILDdeviceId = BUILDdeviceId.replace(" ".toRegex(), "")
}
Log.i("---", "---")
Log.w("//===========//", "================================================")
Log.i("","\n"+"["+ACTIVITY_NAME+" >> getHardWareID() :: [UUID] 디바이스 고유값 리턴 정보 확인 실시]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[WIDE BEAN :: "+ WIDEdeviceId +"]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[ANDROID ID :: "+ ANDROIDdeviceId +"]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[BUILD TOTAL :: "+ BUILDdeviceId +"]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[RANDOM UUID :: "+ randomUuid +"]")
Log.w("//===========//", "================================================")
Log.i("---", "---")
// TODO [리턴 데이터 결과 반환 실시]
if (WIDEdeviceId != null && WIDEdeviceId.trim().equals("") == false && WIDEdeviceId.trim().equals("null") == false && WIDEdeviceId.trim().length > 0
&& WIDEdeviceId.trim().contains("000000") == false && WIDEdeviceId.trim().contains("111111") == false
&& WIDEdeviceId.trim().contains("ffffff") == false && WIDEdeviceId.trim().equals("0") == false) { // TODO 와이드 빈
Log.i("---", "---")
Log.d("//===========//", "================================================")
Log.i("","\n"+"["+ACTIVITY_NAME+" >> getHardWareID() :: [리턴] 디바이스 고유값 [와이드 빈] 선택 및 저장]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[WIDE BEAN :: "+ WIDEdeviceId +"]")
Log.d("//===========//", "================================================")
Log.i("---", "---")
// TODO [디바이스 고유값 저장]
setDeviceString(mContext, "DeviceSpecialDataTwok", WIDEdeviceId)
setDeviceString(mContext, "DeviceSpecialDataTwok", WIDEdeviceId)
return WIDEdeviceId
}
else if (ANDROIDdeviceId != null && ANDROIDdeviceId.trim().equals("") == false && ANDROIDdeviceId.trim().equals("null") == false && ANDROIDdeviceId.trim().length > 0
&& ANDROIDdeviceId.trim().contains("000000") == false && ANDROIDdeviceId.trim().contains("111111") == false
&& ANDROIDdeviceId.trim().contains("ffffff") == false && ANDROIDdeviceId.trim().equals("0") == false) { // TODO 안드로이드 ID
Log.i("---", "---")
Log.d("//===========//", "================================================")
Log.i("","\n"+"["+ACTIVITY_NAME+" >> getHardWareID() :: [리턴] 디바이스 고유값 [안드로이드 ID] 선택 및 저장]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[ANDROID ID :: "+ ANDROIDdeviceId +"]")
Log.d("//===========//", "================================================")
Log.i("---", "---")
// TODO [디바이스 고유값 저장]
setDeviceString(mContext, "DeviceSpecialDataTwok", ANDROIDdeviceId)
setDeviceString(mContext, "DeviceSpecialDataTwok", ANDROIDdeviceId)
return ANDROIDdeviceId
}
else if (randomUuid != null && randomUuid.trim().equals("") == false && randomUuid.trim().equals("null") == false && randomUuid.trim().length > 0
&& randomUuid.trim().contains("000000") == false && randomUuid.trim().contains("111111") == false
&& randomUuid.trim().contains("ffffff") == false && randomUuid.trim().equals("0") == false) { // TODO 안드로이드 ID
Log.i("---", "---")
Log.d("//===========//", "================================================")
Log.i("","\n"+"["+ACTIVITY_NAME+" >> getHardWareID() :: [리턴] 디바이스 고유값 [랜덤 UUID] 선택 및 저장]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[RANDOM UUID :: "+ randomUuid +"]")
Log.d("//===========//", "================================================")
Log.i("---", "---")
// TODO [디바이스 고유값 저장]
setDeviceString(mContext, "DeviceSpecialDataTwok", randomUuid)
setDeviceString(mContext, "DeviceSpecialDataTwok", randomUuid)
return randomUuid
}
else if (BUILDdeviceId != null && BUILDdeviceId.trim().equals("") == false && BUILDdeviceId.trim().equals("null") == false && BUILDdeviceId.trim().length > 0
&& BUILDdeviceId.trim().contains("000000") == false && BUILDdeviceId.trim().contains("111111") == false
&& BUILDdeviceId.trim().contains("ffffff") == false && BUILDdeviceId.trim().equals("0") == false) { // TODO 빌드 정보
Log.i("---", "---")
Log.d("//===========//", "================================================")
Log.i("","\n"+"["+ACTIVITY_NAME+" >> getHardWareID() :: [리턴] 디바이스 고유값 [빌드 정보] 선택 및 저장]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[BUILD TOTAL :: "+ BUILDdeviceId +"]")
Log.d("//===========//", "================================================")
Log.i("---", "---")
// TODO [디바이스 고유값 저장]
setDeviceString(mContext, "DeviceSpecialDataTwok", BUILDdeviceId)
setDeviceString(mContext, "DeviceSpecialDataTwok", BUILDdeviceId)
return BUILDdeviceId
}
else { //TODO 최총 기본값 하드 코딩
val data = "02:00:00:00:00:00"
val dataBase = Base64.encodeToString(data.toByteArray(), Base64.NO_WRAP)
val value = dataBase.toString()
val deviceUuid = UUID.nameUUIDFromBytes(value.toByteArray()) //고정값 생성
val deviceId = deviceUuid.toString()
Log.i("---", "---")
Log.d("//===========//", "================================================")
Log.i("","\n"+"["+ACTIVITY_NAME+" >> getHardWareID() :: [리턴] 디바이스 고유값 [기본 하드코딩 값] 선택 및 저장]")
Log.i("","\n"+"-----------------------------------------")
Log.i("","\n"+"[deviceId :: "+ deviceId +"]")
Log.d("//===========//", "================================================")
Log.i("---", "---")
// TODO [디바이스 고유값 저장]
setDeviceString(mContext, "DeviceSpecialDataTwok", deviceId)
setDeviceString(mContext, "DeviceSpecialDataTwok", deviceId)
return deviceId
}
}
//TODO [디바이스 하드웨어 고유값 영구 저장 메소드]
fun setDeviceString(context: Context?, key: String?, value: String?) {
S_Preference.setString(context!!, key!!, value) // 프리퍼런스 데이터 저장
S_Preference.setString(context, key, value) // 프리퍼런스 데이터 저장
}
//TODO [디바이스 하드웨어 고유값 확인 메소드]
fun getDeviceID(context: Context): String {
val returnData = S_Preference.getString(context!!, "DeviceSpecialDataTwok")
if (returnData != null && returnData.length > 0 && returnData.trim().equals("") == false && returnData.trim().contains("null") == false) {
return returnData
} else {
return ""
}
}
} // [companion 종료]
} // TODO [클래스 종료]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments