투케이2K

115. (TWOK/UTIL) [Android/kotlin] S_DeviceID - 단말기 고유값 지정 실시 본문

투케이2K 유틸파일

115. (TWOK/UTIL) [Android/kotlin] S_DeviceID - 단말기 고유값 지정 실시

투케이2K 2022. 12. 17. 17:52

[설 명]

프로그램 : 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 [클래스 종료]

 

반응형
Comments