디바이스를 식별하기 위해 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
사실 이렇게 보니 또 문제가 없어보이네요. 아무튼 각설하고 왼쪽의 System.err를 보시면 안드로이드 고유의 Log를 사용하지 않고 에러가 출력되어 내가 의도한 로그의 Tag정보가 없는것이 현실입니다.
이제 위와같이 에러가 출력이 됩니다. 물론 이클립스 ADT플러그인에서 설정을 일부러 끄신게 아니라면 로그를 더블클릭하여 에러 위치로 이동하는것 역시 가능합니다.