스터디/Android+Java

Android 고유ID(UUID) 만들기 (2012.04.11)

Dalmangyi 2017. 10. 7.

고유한 ID를 만들때 IP주소를 참고해서 만들어 볼까 생각했지만, 폰에서 얻을 수 있는 ip주소는 결국 최상단의 대표 IP주소와 내부 IP주소만 나올뿐..실질적으로 통신사로부터 할당된 IP주소가 아니기에 쓸 수 없는 데이터였습니다. 

1개의 방에서 1개의 wifi를 통해서 여러개의 휴대폰이 접속하거나 
dhcp(공유기에서 사용하는 내부 ip 자동할당)기능을 꺼놓고 다른 기기에다가 이전에 사용했던 내부 ip를 할당하게 된다면 
ip주소를 고유한 ID로 할당하기에는 적합하지 않았습니다

MacAddress도 네트워크 카드마다 유일하다고 하지만 wifi를 거치게 되면 wifi기기의 맥어드레스로 교체되고, MacAddress조차 루팅기기에선 변경이 가능합니다. 만약 공유기를 사용하지 않고, 3G로 접속했을때는 휴대폰에 따라서 맥어드래스를 제공하거나 제공하지 않는 휴대폰이 존재합니다.

기본 안드로이드에서 제공하는 디바이스 생성 ID함수인 'TelephonyManager.getDefault.getDevideId()'의 경우는 USIM이 존재해야 하며
USIM이 존재해도 값이 안넘어오는 경우가 발생합니다. 갤럭시S 초기 펌웨어 버전에서 간혹 발생됩니다.
그리고 USIM을 탑재못하는 갤럭시 탭 등 플레이어 전용 안드로이드 기기에서 빈 값이 넘어오는 오류가 발생됩니다.

그래서 아래와 같이 여러개의 값을 조합하는 방법으로 초(?) 유니크한 UUID를 만듭니다.

===함수 
private String GetDevicesUUID(Context mContext){
   
   final TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
   final String tmDevice, tmSerial, androidId;
   tmDevice = "" + tm.getDeviceId();
   tmSerial = "" + tm.getSimSerialNumber();
   androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
   UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
   String deviceId = deviceUuid.toString();
   return deviceId;
}

===퍼미션
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />

===UUID
 UUID는 36글자의 char형 데이터가 반환되게 됩니다.
 해당 함수를 통해서 구한 UUID는 휴대폰을 초기화 시켜야만 변경하실 수 있습니다.
 어플을 아무리 삭제하여도 UUID는 변경되지 않습니다. (매우 많은 테스트를 해보진 않았습니다.)

  


댓글