Notice
Recent Posts
Recent Comments
Link
투케이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 [클래스 종료]
[결과 출력]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments