Secure.ANDROID_ID는 각 장치마다 고유합니까?


81

이 전화를 사용하고 있습니다.

Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);

장치의 UID를 얻으려면. 그래도 여러 장치에서 동일한 ID를 얻는 것 같습니다. 이것이 가능해야합니까?

문제의 ID는 9774d56d682e549c이며이 ID를 반환하는 여러 기기에 문제가있는 것 같습니다. http://code.google.com/p/android/issues/list?cursor=10603&updated=10603&ts=1295993403


문제의 ID를 찾고 그것에 대한 스레드를 본 후에 확신합니다. 처음에는 장치가 null을 반환 할 수 있다고 생각하고 어딘가에 기본값으로 넣었습니다. 그러나 이것은 사실이 아닙니다. 여러 장치에서 동일한 값을 얻고 있음을 확신합니다.
FoamyGuy 2011 년

1
완벽 함을 찾았습니다. stackoverflow.com/a/16929647/1318946
Pratik Butani 2014

고유하지 않은 경우 Identity.getDeviceId (context) 와 함께 제공되는 이 라이브러리 를 사용 하십시오 .
caw

답변:


47

스레드를 확인하십시오 . 그러나 "초기화시 변경 가능"으로 문서화되어 있으므로주의해야합니다. 자신의 책임하에 사용하고 루팅 된 전화에서 쉽게 변경할 수 있습니다. 또한 일부 제조업체가 전화 번호가 중복 된 스레드에 문제가있는 것처럼 보입니다 . 당신이하려는 일에 따라 아마도 이것을 UID로 사용하지 않을 것입니다.


19
ANDROID_ID의 구현이 너무 ... 절름발이가 아쉽습니다! Google 문서에 따르면 의도는 더 오래 지속되는 ID였습니다. A 64-bit number (as a hex string) that is randomly generated on the device's first boot and should remain constant for the lifetime of the device
Someone Somewhere

3
이 스레드 링크 에 따르면 "또한 모든 인스턴스가 동일한 ANDROID_ID를 갖는 주요 제조업체의 인기 핸드셋에 널리 관찰 된 버그가 하나 이상있었습니다." 더 나은 그것을 사용하지
무하마드 Riyaz

2
그것은 2011 년 프로 요 때부터였습니다. 지금은 관련이 없습니다.
Aubtin Samai

장치 백업 / 복원 또는 장치 복제는 어떻습니까? ANDROID_ID가 같을 가능성에 대해 아십니까? 물론 장치가 루팅되지 않았다고 가정합니다.
FunkSoulBrother

39

Android O에서는 ANDROID_ID의 동작이 변경됩니다. ANDROID_ID는 휴대 전화의 사용자별로 앱마다 다릅니다.

출처 : https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html

안드로이드 ID

O에서 Android ID (Settings.Secure.ANDROID_ID 또는 SSAID)는 기기의 각 앱 및 각 사용자에 대해 다른 값을 갖습니다. 기기 범위 식별자가 필요한 개발자는 광고 ID와 같은 재설정 가능한 식별자를 대신 사용하여 사용자에게 더 많은 제어 권한을 제공해야합니다. 광고 ID는 광고 추적을 제한하는 사용자 용 설정도 제공합니다.

또한 Android O에서 :

  • ANDROID_ID 값은 패키지 이름과 서명 키가 같으면 패키지 제거 / 재설치시 변경되지 않습니다. 앱은이 값을 사용하여 재설치시 상태를 유지할 수 있습니다.
  • 이전 버전의 Android를 실행하는 기기에 앱을 설치 한 경우 기기를 Android O로 업데이트 할 때 앱을 제거하고 다시 설치하지 않는 한 Android ID는 동일하게 유지됩니다.
  • Android ID 값은 기기가 초기화 된 경우 또는 서명 키가 제거 및
    재설치 이벤트 사이에 순환하는 경우에만 변경됩니다 .
  • 이 변경은 Google Play 서비스 및 광고 ID와 함께 배송되는 기기 제조업체에만 필요합니다. 다른 기기 제조업체는 재설정 가능한 대체 ID를 제공하거나 ANDROID ID를 계속 제공 할 수 있습니다.

감사. 장치 ID로보고 된 (md5'ed) ID를 사용하여 아내의 전화에서 테스트 광고가 표시되지 않는 이유와 이것이 adb shell settings 명령을 통해보고 된 값과 일치하지 않는 이유를 알아 내려고 내 머리카락을 뽑아 냈습니다. .. 미쳐가는 줄 알았는데.
ecv

15

따라서 장치 자체에 고유 한 것을 원한다면 충분 TM.getDeviceId() 해야 합니다.

다음은 Telephony Manager ID를 얻는 방법을 보여주는 코드입니다. 사용중인 Android 기기 ID는 공장 설정에서 변경 될 수 있으며 일부 제조업체는 고유 ID를 제공하는 데 문제가 있습니다.

TelephonyManager tm = 
        (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String androidId = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
Log.d("ID", "Android ID: " + androidId);
Log.d("ID", "Device ID : " + tm.getDeviceId());

다음 TelephonyManager을 사용하여 권한을 가져야합니다.

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

3
예, getDeviceId () 사용도 작동합니다. 그러나 null을 반환 할 수 있으므로 매우주의해야합니다. (3 세대 / 전화 모뎀없이 장치에)이 약의 수용액의 I 사용은 (물론도 아닌 - 같은 장치에서 누락 될 수있는) 와이파이의 맥 주소에 후퇴하는 것입니다
vdstw

19
READ_PHONE_STATE허가를 요구하는 것은 끔찍합니다. ANDROID_ID대신 사용하십시오 .
dolmen

예, 3g가없는 기기에서 null을 반환 할 수 있습니다 (시중에 출시 된 제품이 많음). Wi-Fi를 사용해야합니다. 기기를 재부팅 한 후 한 번 이상 켜거나 끌 때까지 해당 guid가 null 일 수도 있습니다. Wi-Fi가 없다면 ... 진짜 악몽, Windows CE에는 각 장치에 대한 GUID가 있었고 삶은 아름다웠습니다.
marcinj

IMEI 인 장치 ID가 가짜 장치에 복제 될 수 있으므로 완전한 증거 솔루션이 아니라는 수천 건의 요청 후에 밝혀졌습니다. getSimSerialNumber 및 ANDROID_ID를 폴백으로 사용하도록 되돌립니다.
Ajibola 2015 년

Android 10 (API 레벨 29)은 IMEI와 일련 번호를 모두 포함하는 재설정 할 수없는 식별자에 대한 제한을 추가합니다. TM.getDeviceId()접근 방식 을 구현하기 전에 먼저 Android> = 10 기기에서 기기 식별자에 대한 새로운 권한 요구 사항 을 살펴보세요 .
Ezekiel Sebastine

6

이에 대해 몇 가지를 읽었으며 안타깝게도 개별 기기를 고유하게 식별하기 위해 ANDROID_ID를 사용해서는 안됩니다.

Android 규정 준수 요구 사항에 적용되지 않는 것으로 보이므로 제조업체는 '모델'ID 등으로 더 많이 사용하는 일부를 포함하여 선택한 방식으로 구현하는 것 같습니다.

또한 제조업체가 UUID (예 : UUID)로 만들기 위해 생성기를 작성 했더라도 공장 초기화에서 살아남을 보장은 없습니다.


6
나는 그것이 디자인에 의해 공장 초기화를 견디지 ​​못할 것이라고 보장한다고 생각하며, 문서 어딘가에 언급되어 있습니다. 그리고 그것이 그것을 구현하는 올바른 방법입니다.
Violet Giraffe

그렇다면 GUID를 어떻게 생성 할 수 있습니까?
IgorGanapolsky

6

여러 솔루션이 있지만 완벽한 솔루션은 없습니다. 하나씩 가자.

1. Unique Telephony Number (IMEI, MEID, ESN, IMSI)

  • 이 솔루션은 사용자 에게 android.permission.READ_PHONE_STATE 를 요청해야하므로 만든 애플리케이션 유형에 따라 정당화하기 어려울 수 있습니다.

  • 또한 태블릿에는 전화 서비스가 없기 때문에이 솔루션은 스마트 폰으로 제한됩니다. 한 가지 장점은 값이 기기의 공장 초기화 후에도 유지된다는 것입니다.

2. MAC Address

  • Wi-Fi 또는 Bluetooth 하드웨어가있는 장치에서 MAC 주소를 가져올 수도 있습니다. 그러나 모든 장치에 Wi-Fi 연결이있는 것은 아니므로이 솔루션은 권장되지 않습니다. 사용자가 Wi-Fi에 연결되어 있어도 데이터를 검색하려면 켜져 있어야합니다. 그렇지 않으면 호출이 MAC 주소를보고하지 않습니다.

3. Serial Number

  • 태블릿과 같은 전화 통신 서비스가없는 기기는 Android 2.3 Gingerbread부터 android.os.Build.SERIAL을 통해 사용할 수있는 고유 기기 ID를보고해야합니다. 전화 통신 서비스가있는 일부 전화기는 일련 번호를 정의 할 수도 있습니다. 모든 Android 기기에 일련 번호가있는 것은 아니지만이 솔루션은 신뢰할 수 없습니다.

4. Secure Android ID

  • 장치를 처음 부팅 할 때 임의로 값이 생성되고 저장됩니다. 이 값은 Settings.Secure.ANDROID_ID를 통해 사용할 수 있습니다. 장치의 수명 동안 일정하게 유지되어야하는 64 비트 숫자입니다. ANDROID_ID는 스마트 폰과 태블릿에서 사용할 수 있으므로 고유 한 기기 식별자로 적합합니다.

    String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
    
  • 그러나 장치에서 공장 초기화를 수행하면 값이 변경 될 수 있습니다. 또한 모든 인스턴스가 동일한 ANDROID_ID를 갖는 제조업체의 인기 핸드셋에 알려진 버그가 있습니다. 분명히 솔루션은 100 % 신뢰할 수 없습니다.

5. Use UUID

  • 대부분의 응용 프로그램에 대한 요구 사항은 물리적 장치가 아닌 특정 설치를 식별하는 것이므로 UUID 클래스를 사용하는 경우 사용자의 고유 ID를 얻는 좋은 솔루션입니다. 다음 솔루션은 Google I / O 프레젠테이션에서 Google의 Reto Meier에 의해 제공되었습니다.

    private static String uniqueID = null;
    private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    public synchronized static String id(Context context) {
       if (uniqueID == null) {
           SharedPreferences sharedPrefs = context.getSharedPreferences(
                   PREF_UNIQUE_ID, Context.MODE_PRIVATE);
           uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
           if (uniqueID == null) {
               uniqueID = UUID.randomUUID().toString();
               Editor editor = sharedPrefs.edit();
               editor.putString(PREF_UNIQUE_ID, uniqueID);
               editor.commit();
           }
       }    return uniqueID;
    }
    

Android에서 특정 기기를 식별하는 것은 쉬운 일이 아닙니다. 그것을 피해야 할 많은 이유가 있습니다. 최상의 솔루션은 UUID 솔루션을 사용하여 특정 설치를 식별하는 것입니다. 신용 : 블로그


1

여기에 대체 솔루션 인 광고 ID를 나열하십시오.

https://support.google.com/googleplay/android-developer/answer/6048248?hl=en

위 링크에서 복사 :

광고 ID는 Google Play 서비스에서 제공하는 광고용으로 사용자가 재설정 할 수있는 고유 한 ID입니다. 사용자에게 더 나은 제어 기능을 제공하고 개발자에게 앱으로 계속 수익을 창출 할 수있는 간단한 표준 시스템을 제공합니다. 이를 통해 사용자는 Google Play 앱 내에서 식별자를 재설정하거나 개인 맞춤 광고 (이전의 관심 기반 광고)를 선택 해제 할 수 있습니다.

제한 사항은 다음과 같습니다.

  1. Google Play 지원 기기에만 해당됩니다.
  2. 개인 정보 정책: https://support.google.com/googleplay/android-developer/answer/113469?hl=en&rd=1#privacy

Google Play (서비스)가없는 휴대 전화에서도 작동하나요?
Max Waterman

이것은 GUID가 아닙니다
IgorGanapolsky 2010 년

0
//Fields
String myID;
int myversion = 0;


myversion = Integer.valueOf(android.os.Build.VERSION.SDK);
if (myversion < 23) {
        TelephonyManager mngr = (TelephonyManager) 
getSystemService(Context.TELEPHONY_SERVICE);
        myID= mngr.getDeviceId();
    }
    else
    {
        myID = 
Settings.Secure.getString(getApplicationContext().getContentResolver(), 
Settings.Secure.ANDROID_ID);
    }

예, Secure.ANDROID_ID는 각 장치마다 고유합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.