본문 바로가기

Study/Android

[Android] 단말기 고유값 구하는 방법들

1.TelephonyManager를 이용한 DeviceId가져와 사용하는 방법

안드로이드 디바이스는 제조사 마다 다양하게 커스터마이징 가능 하기 때문에 000000000000000 같이 의미 없는 값이나 null 이 반환 될수도 있다.

TelephonyManager mgr = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
 String idByTelephonyManager = mgr.getDeviceId();

 

2.ANDROID_ID를 사용하는 방법

가장 명확한 방법. 디바이스가 최초 Boot 될때 생성 되는 64-bit 값이다. 하지만 ANDROID_ID 또한 단점이 있는데, Proyo 2.2 이전 Version 에는 100% 디바이스 고유 번호를 획득 한다고는 보장 할 수 없으며, 몇몇 Vendor 에서 출하된 디바이스에 동일한 고유 번호(ex."9774d56d682e549c")가 획득 가능하다.

String idByANDROID_ID = 
	Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID);

 

3.Serial Number를 사용하는 방법

안드로이드의 API Level 9 (진저브레드 2.3) 이후 부터 제공 하는 고유 번호 로서 TelephonyManager 클래스를 통한 획득 보다는 안전 하다고 할 수 있지만 2.3 미만의 Version 에서는 문제가 발생 할 수 가 있는 문제가 있어서 거의 사용하지 않는 방법이다.

try {
	String idBySerialNumber = (String) Build.class.getField("SERIAL").get(null);
} catch (Exception e) {
    e.printStackTrace();;
}

 

소스

import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
 
import java.io.UnsupportedEncodingException;
import java.util.UUID;
 
public class DeviceUuidFactory {
 
    protected static final String PREFS_FILE = "device_id.xml";
    protected static final String PREFS_DEVICE_ID = "device_id";
    protected volatile static UUID uuid;
 
    public DeviceUuidFactory(Context context) {
        if (uuid == null) {
            synchronized (DeviceUuidFactory.class) {
                if (uuid == null) {
                    final SharedPreferences prefs = context
                            .getSharedPreferences(PREFS_FILE, 0);
                    final String id = prefs.getString(PREFS_DEVICE_ID, null);
                    if (id != null) {
                        // Use the ids previously computed and stored in the
                        // prefs file
                        uuid = UUID.fromString(id);
                    } else {
                        final String androidId = Secure.getString(
                            context.getContentResolver(), Secure.ANDROID_ID);
                        // Use the Android ID unless it's broken, in which case
                        // fallback on deviceId,
                        // unless it's not available, then fallback on a random
                        // number which we store to a prefs file
                        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);
                        }
                        // Write the value out to the prefs file
                        prefs.edit()
                                .putString(PREFS_DEVICE_ID, uuid.toString())
                                .commit();
                    }
                }
            }
        }
    }
 
    public UUID getDeviceUuid() {
        return uuid;
    }
}

 

 

 

 

출처: http://kanzler.tistory.com/64