그러냐

카톡 SDK 의 안드로이드 기기 unique ID 얻기 방법 본문

android

카톡 SDK 의 안드로이드 기기 unique ID 얻기 방법

관절분리 2017. 2. 23. 13:41
반응형

출처  : https://siakak.wordpress.com/2014/07/14/%EC%8B%9C%EA%B0%84%EC%9D%84-%EC%95%84%EB%81%BC%EB%8A%94-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%9C%EB%B0%9C-%EC%B9%B4%ED%86%A1-sdk-%EC%9D%98-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4/

안녕하세요? 시간을 아껴주고 아끼는 블로그 쥔장입니다.

모든 정보들이 인터넷을 통해 연결되면서 오히려 양질의 컨텐츠를 얻는 데에 너무 많은 시간이 걸리곤 합니다.

그래서 저는 저와 독자들의 시간을 아껴주는 블로깅을 하고자 합니다.

아마 주요 주제는 프로그래밍, 맛집, 게임, 여행, 교육 등이 될 것 같습니다.

개발 쪽으로는 첫 글입니다~ 안드로이드 기기에서 TelephonyManager.getDeviceId() 가 넘어오지 않을 때가 있어서 알아본 자료입니다.

많은 도움 되시기를!!

—————-

TelephonyManager.getDeviceId() 가 참 유용하기는 한데, 핸드폰에서만 되지 태블릿이나 웨어러블 기기에서는 null 값을 넘긴다고 합니다.

그러면 도대체 어떻게 디바이스를 정확하게 구분할 수 있을까요? 여러 자료들을 찾아보던 중, 카톡 SDK 에 다음 함수가 있음을 알 수 있었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static String getDeviceUUID(final Context context) {
    final SharedPreferencesCache cache = Session.getAppCache();
    final String id = cache.getString(PROPERTY_DEVICE_ID);
 
    UUID uuid = null;
    if (id != null) {
        uuid = UUID.fromString(id);
    } else {
        final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
        try {
            if (!"9774d56d682e549c".equals(androidId)) {
                uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));
            } else {
                final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
                uuid = deviceId != null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID();
            }
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
 
        Bundle bundle = new Bundle();
        bundle.putString(PROPERTY_DEVICE_ID, uuid.toString());
        cache.save(bundle);
    }
 
    return uuid.toString();
}

내용은 다음과 같습니다.

  1. 먼저 가장 정확하다고 알려진 ANDROID_ID 를 가져옵니다.
  2. 하지만 예전 어떤 기기에서 특정 번호로만 나오던 버그가 있었다고 합니다. 이에 대한 예외처리를 해줍니다.
  3. ANDROID_ID 가 없으면 getDeviceID() 를 사용합니다.
  4. 둘 다 실패하면, 랜덤하게 UUID 를 발생시킵니다.
  5. 4번은 랜덤한 값이지만 preference 에 저장해두고 사용하기 때문에 삭제하고 재설치하지 않는 이상 랜덤한 넘버를 두번 만들지는 않습니다.

 

(참고자료 1) 안드로이드 개별 디바이스를 번역하는 방법 (안드로이드 공식 블로그의 번역) http://huewu.blog.me/110107222113

(참고자료 2) IMEI, MEID, ESN, IMSI 등에 대해 자세히 나옴 http://www.webs.co.kr/index.php?mid=adnroid&sort_index=readed_count&order_type=asc&page=2&document_srl=38470

(참고자료 3) Stack Overflow 의 방대한 문답들 http://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id

(참고자료 4) 카카오톡 안드로이드 SDK https://developers.kakao.com/docs/android

반응형