투케이2K

2. (TWOK/UTIL) [Android/Java] S_DeviceID - 단말기 고유값 지정 실시 (와이드 빈 , AndroidID , Build info) 본문

투케이2K 유틸파일

2. (TWOK/UTIL) [Android/Java] S_DeviceID - 단말기 고유값 지정 실시 (와이드 빈 , AndroidID , Build info)

투케이2K 2022. 3. 20. 14:27

[설 명]

프로그램 : Android / Java

설 명 : 모바일 디바이스 단말기 고유값 저장 클래스

 

[소스 코드]

package com.example.javaproject;

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.UUID;

public 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 [클래스 명칭 선언 실시]
    private static final String ACTIVITY_NAME = "S_DeviceID";





    //TODO [디바이스 고유값 저장 메소드]
    public static void setDeviceID(final Context mContext) {
        try {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // TODO [하드웨어 기기 고유값 확인]
                        String deviceId = "";
                        deviceId = getHardWareID(mContext);


                        // TODO [디바이스 고유값 저장]
                        S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(deviceId));
                        S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(deviceId));


                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> setDeviceID() :: 디바이스 고유값 저장 확인 실시]");
                        Log.i("","\n"+"[Device :: "+String.valueOf(getDeviceID(mContext))+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");

                    }
                    catch (Exception e) {
                        Log.i("---","---");
                        Log.e("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> setDeviceID() :: 디바이스 고유값 저장 확인 실패]");
                        Log.i("","\n"+"[error :: "+String.valueOf(e.getMessage())+"]");
                        Log.i("","\n"+"[로 직 :: 일반 UUID 지정 실시]");
                        Log.e("//===========//","================================================");
                        Log.i("---","---");

                        // TODO [일반 UUID 랜덤 고유값 확인]
                        String randomUuid = String.valueOf(UUID.randomUUID());
                        randomUuid = randomUuid.replaceAll(" ", "");
                        S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(randomUuid));
                        S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(randomUuid));
                    }
                }
            });
            thread.start();
            thread.join();
        }
        catch (Exception e){
            e.printStackTrace();

            // TODO [일반 UUID 랜덤 고유값 확인]
            String randomUuid = String.valueOf(UUID.randomUUID());
            randomUuid = randomUuid.replaceAll(" ", "");
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(randomUuid));
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(randomUuid));
        }
    }





    //TODO[디바이스 하드웨어 고유값 추출 메소드]
    public static String getHardWareID(Context mContext) {

        // TODO [와이드 빈]
        String WideId = "";
        UUID WideUuid = null;


        // TODO [Android ID]
        String AndroidID = "";


        // TODO [빌드 정보]
        String BuildData = "";
        String Base64BuildData = "";


        // TODO [와이드 빈 추출]
        try {
            WideUuid = new UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L);
            MediaDrm mediaDrm = null;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
                mediaDrm = new 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).length>0){
                    WideId = Base64.encodeToString(mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID), 0).trim();
                }
                else {
                    WideId = "";
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();

            WideId = "";
        }


        // TODO [AndroidID 추출]
        try {
            AndroidID = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID);
            AndroidID = AndroidID.replaceAll(" ", "");
        }
        catch (Exception e){
            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 = String.valueOf(Build.BRAND.toLowerCase()) + ":"
                    + String.valueOf(Build.BOARD.toLowerCase()) + ":"
                    + String.valueOf(Build.HOST.toLowerCase()) + ":"
                    + String.valueOf(Build.MODEL.toLowerCase());
            try {
                BuildData += ":" + String.valueOf(Build.VERSION.RELEASE); // [안드로이드 OS 버전]
            }
            catch (Exception e){
                e.printStackTrace();
            }
            BuildData = BuildData.replaceAll(" ", "");
            Base64BuildData = Base64.encodeToString(BuildData.getBytes(),Base64.NO_WRAP);
        }
        catch (Exception e){
            e.printStackTrace();

            BuildData = "";
            Base64BuildData = "";
        }


        // TODO [일반 UUID 랜덤 고유값 확인]
        String randomUuid = String.valueOf(UUID.randomUUID());
        randomUuid = randomUuid.replaceAll(" ", "");


        // TODO [추출된 정보 확인 : 기본 Base64 데이터]
        Log.i("---","---");
        Log.d("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> getHardWareID() :: [기본 Base64] 디바이스 고유값 추출 정보 확인 실시]");
        Log.i("","\n"+"-----------------------------------------");
        Log.i("","\n"+"[WIDE BEAN :: "+String.valueOf(WideId)+"]");
        Log.i("","\n"+"-----------------------------------------");
        Log.i("","\n"+"[ANDROID ID :: "+String.valueOf(AndroidID)+"]");
        Log.i("","\n"+"-----------------------------------------");
        Log.i("","\n"+"[BUILD TOTAL [원본] :: "+String.valueOf(BuildData)+"]");
        Log.i("","\n"+"-----------------------------------------");
        Log.i("","\n"+"[BUILD TOTAL [Base64] :: "+String.valueOf(Base64BuildData)+"]");
        Log.i("","\n"+"-----------------------------------------");
        Log.i("","\n"+"[RANDOM UUID :: "+String.valueOf(randomUuid)+"]");
        Log.d("//===========//","================================================");
        Log.i("---","---");


        // TODO [UUID 변환 정보 확인 실시]
        String WIDEvalue = "";
        String WIDEdeviceId = "";
        if (String.valueOf(WideId) != null && String.valueOf(WideId).trim().equals("") == false
                && String.valueOf(WideId).trim().equals("null") == false && String.valueOf(WideId).trim().length()>0
                && String.valueOf(WideId).trim().contains("000000") == false && String.valueOf(WideId).trim().contains("111111") == false
                && String.valueOf(WideId).trim().contains("ffffff") == false && String.valueOf(WideId).trim().equals("0") == false){

            WIDEvalue = String.valueOf(WideId); // TODO [와이드 빈]
            UUID WIDEdeviceUuid = UUID.nameUUIDFromBytes(WIDEvalue.getBytes());
            WIDEdeviceId = String.valueOf(WIDEdeviceUuid.toString());
            WIDEdeviceId = WIDEdeviceId.replaceAll(" ", "");

        }


        String ANDROIDvalue = "";
        String ANDROIDdeviceId = "";
        if (String.valueOf(AndroidID) != null && String.valueOf(AndroidID).trim().equals("") == false
                && String.valueOf(AndroidID).trim().equals("null") == false && String.valueOf(AndroidID).trim().length()>0
                && String.valueOf(AndroidID).trim().contains("000000") == false && String.valueOf(AndroidID).trim().contains("111111") == false
                && String.valueOf(AndroidID).trim().contains("ffffff") == false && String.valueOf(AndroidID).trim().equals("0") == false){

            ANDROIDvalue = String.valueOf(AndroidID); // TODO [Android ID]
            UUID ANDROIDdeviceUuid = UUID.nameUUIDFromBytes(ANDROIDvalue.getBytes());
            ANDROIDdeviceId = String.valueOf(ANDROIDdeviceUuid.toString());
            ANDROIDdeviceId = ANDROIDdeviceId.replaceAll(" ", "");

        }


        String BUILDvalue = "";
        String BUILDdeviceId = "";
        if (String.valueOf(Base64BuildData) != null && String.valueOf(Base64BuildData).trim().equals("") == false
                && String.valueOf(Base64BuildData).trim().contains("null") == false && String.valueOf(Base64BuildData).trim().length()>0
                && String.valueOf(Base64BuildData).trim().contains("000000") == false && String.valueOf(Base64BuildData).trim().contains("111111") == false
                && String.valueOf(Base64BuildData).trim().contains("ffffff") == false){

            BUILDvalue = String.valueOf(Base64BuildData); // TODO [빌드 정보]
            UUID BUILDdeviceUuid = UUID.nameUUIDFromBytes(BUILDvalue.getBytes());
            BUILDdeviceId = String.valueOf(BUILDdeviceUuid.toString());
            BUILDdeviceId = BUILDdeviceId.replaceAll(" ", "");

        }


        Log.i("---","---");
        Log.w("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> getHardWareID() :: [UUID] 디바이스 고유값 리턴 정보 확인 실시]");
        Log.i("","\n"+"-----------------------------------------");
        Log.i("","\n"+"[WIDE BEAN :: "+String.valueOf(WIDEdeviceId)+"]");
        Log.i("","\n"+"-----------------------------------------");
        Log.i("","\n"+"[ANDROID ID :: "+String.valueOf(ANDROIDdeviceId)+"]");
        Log.i("","\n"+"-----------------------------------------");
        Log.i("","\n"+"[BUILD TOTAL :: "+String.valueOf(BUILDdeviceId)+"]");
        Log.i("","\n"+"-----------------------------------------");
        Log.i("","\n"+"[RANDOM UUID :: "+String.valueOf(randomUuid)+"]");
        Log.w("//===========//","================================================");
        Log.i("---","---");


        // TODO [리턴 데이터 결과 반환 실시]
        if(WIDEdeviceId != null
                && WIDEdeviceId.length() > 0
                && !WIDEdeviceId.trim().equals("")
                && !WIDEdeviceId.contains("null")
                && WIDEdeviceId.trim().contains("000000") == false
                && WIDEdeviceId.trim().contains("111111") == false
                && WIDEdeviceId.trim().contains("ffffff") == false){ // TODO 와이드 빈

            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> getHardWareID() :: [리턴] 디바이스 고유값 [와이드 빈] 선택 및 저장]");
            Log.i("","\n"+"-----------------------------------------");
            Log.i("","\n"+"[WIDE BEAN :: "+String.valueOf(WIDEdeviceId)+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");

            // TODO [디바이스 고유값 저장]
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(WIDEdeviceId));
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(WIDEdeviceId));

            return WIDEdeviceId;
        }
        else if(ANDROIDdeviceId != null
                && ANDROIDdeviceId.length() > 0
                && !ANDROIDdeviceId.trim().equals("")
                && !ANDROIDdeviceId.contains("null")
                && ANDROIDdeviceId.trim().contains("000000") == false
                && ANDROIDdeviceId.trim().contains("111111") == false
                && ANDROIDdeviceId.trim().contains("ffffff") == false){ // TODO 안드로이드 ID

            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> getHardWareID() :: [리턴] 디바이스 고유값 [안드로이드 ID] 선택 및 저장]");
            Log.i("","\n"+"-----------------------------------------");
            Log.i("","\n"+"[ANDROID ID :: "+String.valueOf(ANDROIDdeviceId)+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");

            // TODO [디바이스 고유값 저장]
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(ANDROIDdeviceId));
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(ANDROIDdeviceId));

            return ANDROIDdeviceId;
        }
        else if(randomUuid != null
                && randomUuid.length() > 0
                && !randomUuid.trim().equals("")
                && !randomUuid.contains("null")
                && randomUuid.trim().contains("000000") == false
                && randomUuid.trim().contains("111111") == false
                && randomUuid.trim().contains("ffffff") == false){ // TODO 안드로이드 ID

            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> getHardWareID() :: [리턴] 디바이스 고유값 [랜덤 UUID] 선택 및 저장]");
            Log.i("","\n"+"-----------------------------------------");
            Log.i("","\n"+"[RANDOM UUID :: "+String.valueOf(randomUuid)+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");

            // TODO [디바이스 고유값 저장]
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(randomUuid));
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(randomUuid));

            return randomUuid;
        }
        else if(BUILDdeviceId != null
                && BUILDdeviceId.length() > 0
                && !BUILDdeviceId.trim().equals("")
                && !BUILDdeviceId.contains("null")
                && BUILDdeviceId.trim().contains("000000") == false
                && BUILDdeviceId.trim().contains("111111") == false
                && BUILDdeviceId.trim().contains("ffffff") == false){ // TODO 빌드 정보

            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> getHardWareID() :: [리턴] 디바이스 고유값 [빌드 정보] 선택 및 저장]");
            Log.i("","\n"+"-----------------------------------------");
            Log.i("","\n"+"[BUILD TOTAL :: "+String.valueOf(BUILDdeviceId)+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");

            // TODO [디바이스 고유값 저장]
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(BUILDdeviceId));
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(BUILDdeviceId));

            return BUILDdeviceId;
        }
        else { //TODO 최총 기본값 하드 코딩
            String data = "02:00:00:00:00:00";
            String dataBase = Base64.encodeToString(data.getBytes(),Base64.NO_WRAP);
            String value = String.valueOf(dataBase);
            UUID deviceUuid = UUID.nameUUIDFromBytes(value.getBytes()); //고정값 생성
            String deviceId = deviceUuid.toString();

            Log.i("---","---");
            Log.e("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> getHardWareID() :: [리턴] 디바이스 고유값 [기본 하드코딩 값] 선택 및 저장]");
            Log.i("","\n"+"-----------------------------------------");
            Log.i("","\n"+"[deviceId :: "+String.valueOf(deviceId)+"]");
            Log.e("//===========//","================================================");
            Log.i("---","---");

            // TODO [디바이스 고유값 저장]
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(deviceId));
            S_DeviceID.setDeviceString(mContext,"DeviceSpecialDataTwok",String.valueOf(deviceId));

            return deviceId;
        }
    }






    //TODO [디바이스 하드웨어 고유값 영구 저장 메소드]
    public static void setDeviceString(Context context, String key, String value) {
        S_Preference.setString(context, key, value); // 프리퍼런스 데이터 저장
        S_Preference.setString(context, key, value); // 프리퍼런스 데이터 저장
    }





    //TODO [디바이스 하드웨어 고유값 확인 메소드]
    public static String getDeviceID(Context context) {
        String returnData = String.valueOf(S_Preference.getString(context, "DeviceSpecialDataTwok"));
        if (returnData != null
                && returnData.length() > 0
                && returnData.equals("") == false
                && returnData.contains("null") == false) {
            return returnData;
        }
        else {
            return "";
        }
    }



} // TODO [클래스 종료]
 

[결과 출력]

 

 

반응형
Comments