디바이스를 식별하기 위해 Unique Device ID값이 필요할 때가 있습니다. 쉽게 생각하면 아이폰에는 UDID(Unique Device Identifier)가 있습니다. 하지만 안드로이드에는 생각보다 간단한 문제가 아니더군요. 예를 들면 다음과 같은 방법으로 유니크한 시리얼 정보를 읽어올 수 있습니다.
Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);

하지만 위의 방법은 때에따라 빈 값이 반환되는 경우가 있다고 합니다. (저도 경험해보진 않았음) 또한 안드로이드 디바이스는 제조사에서 커스터마이징을 대책없이 하는 경우가 많아 어떤값이 나올지 일관성도 유지하기가 어렵습니다.

그렇다면 몇가지 값을 조합해서 유니크한 시리얼을 만든다면 어떨까요? 좀 더 안정적으로 사용할 수 있지 않을까 생각합니다.
final TelephonyManager tm = (TelephonyManager) getBaseContext().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();

위와같이 3가지 값을 조합하여 사용할 경우 좀 더 정확도 높은 유니크한 값을 만들어낼 수 있습니다.
사용자 삽입 이미지
이런식으로 값이 출력됩니다.


참고: http://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id
크리에이티브 커먼즈 라이센스
Creative Commons License

트랙백을 보내세요

트랙백 주소 :: http://theeye.pe.kr/trackback/493
  1. 안드로이드 디바이스 식별자를 선택하는 방법에 대한 정리

    Tracked from 미니의 프로그래밍 이야기 2012/04/30 21:15

    스마트폰 어플리케이션들이 증가하면서 각각의 디바이스에 대한 구분이 필요할 때가 있습니다. 이때 사용할 수 있는 것이 디바이스 식별자인데요. 아이폰의 경우에는 UDID라고 하는 디바이스별 식별자가 포함되어 있어 Unique하게 구분할 수 있습니다. 그러나 안드로이드에서는 고유한 식별자가 일률적이지 않아 어려움이 있는데요. 이 부분을 잘 정리해 놓은 글이 있네요. Tim Bray의 identifying App Installations 인데요. Andro..

  2. 안드로이드 디바이스 식별자를 선택하는 방법에 대한 정리

    Tracked from 미니의 프로그래밍 이야기 2012/04/30 21:15

    스마트폰 어플리케이션들이 증가하면서 각각의 디바이스에 대한 구분이 필요할 때가 있습니다. 이때 사용할 수 있는 것이 디바이스 식별자인데요. 아이폰의 경우에는 UDID라고 하는 디바이스별 식별자가 포함되어 있어 Unique하게 구분할 수 있습니다. 그러나 안드로이드에서는 고유한 식별자가 일률적이지 않아 어려움이 있는데요. 이 부분을 잘 정리해 놓은 글이 있네요. Tim Bray의 identifying App Installations 인데요. Andro..

댓글을 달아 주세요

  1. 2013/02/15 11:26

    좋은정보 ㄳ합니다.
    노파심에 md5 적용해서 써야겠네용ㅎ

  2. 김동민 2012/08/21 10:53

    좋은 정보 너무 감사드립니다.제 블로그에 포스팅해가도 될련지요 ..

  3. 허버끝나 2012/05/10 10:03

    4개 기종으로 실 테스트를 해보았습니다.
    중복되지 않고 잘나오네요.. ^^;;
    감사합니다. ^_^

    갤럭시 S UUID: FFFFFFFF-C917-212C-D958-11A94F3D97CA
    갤럭시 S2 UUID: FFFFFFFF-C421-76C9-7F0D-7EF0253DB6E4
    갤럭시 Tab 7인치 UUID: FFFFFFFF-9EAF-9658-FFFF-FFFF94DAE806
    모토로라 XT720 UUID: FFFFFFFF-E079-8E6A-E242-C0920033C587

  4. 강재석 2011/11/13 23:51

    고유번호는 MAC 어드레스가 최고입니다.
    통화안돼는 기기는 많아도 와이파이 안돼는 기기는 없으니까요. 와이파이 안돼는 안드로이드 기기 있으면 나가 죽어야죠 ㅋㅋㅋㅋ

    • 아이 2011/11/14 10:20

      문제는 WIFI를 끄면 맥주소가 안넘어오는 디바이스가 있다는겁니다. 안드로이드 SDK의 API는 신뢰를 하면 안되죠. 제조사가 하도 바꿔서..

  5. 송현철 2011/09/09 16:47

    위와 같은 코드로 10개월전부터 쭈욱 썼는데..
    하나의 기기에서 다른 값이 나오기도 합니다.
    (앞자리가 FFFF.. 에서 0000.. 으로)

    크리티컬한 작업을 하실때 에는
    좀더 유의해야 할듯 하네요.

    • 아이 2011/09/09 17:34

      똑같은기기에서 FFFF로 시작하던값이 어느순간 0000으로 나오기 시작한다는거죠? 그렇다면 문제가 많긴 하겠군요.

  6. crony 2011/07/11 12:43

    아이군님 블로그를 RSS로 등록해서 잘 보고 있는 리더입니다.
    안드로이드 같은 경우 디바이스의 유니크한 정보는 IMEI라는 값으로 읽어오면 됩니다. 그냥 혹시나 해서 ....

    String imei = TelephonyManager.getDefault().getDeviceId();
    if (TextUtils.isEmpty(imei)) {
    return "";
    }

    • 아이 2011/07/11 13:31

      좋은정보 감사합니다^^
      저도 기존의 어플들의 경우에는 그렇게 써왔었는데요. 특정 디바이스나 USIM이 없는 디바이스에서는 값이 안넘어오지 않던가요?

      위의 소스에서도 보시면 deviceId값을 쓰고 있죠. 여러개의 값을 혼합해서 써서 혹시라도 디바이스아이디가 없는 경우를 피하는 대책인게 위의 방법이라 생각되는군요.

비밀글 (Serect)
댓글 달기 (Submit)