क्या प्रत्येक डिवाइस के लिए Secure.ANDROID_ID अद्वितीय है?


81

मैं इस कॉल का उपयोग कर रहा हूं:

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

डिवाइस के लिए यूआईडी प्राप्त करने के लिए। मुझे लगता है कि मैं एक ही आईडी कई उपकरणों से प्राप्त कर रहा हूं। क्या यह संभव होना चाहिए?

विचाराधीन आईडी है: 9774d56d682e549c और जाहिर है कि इस आईडी को वापस करने वाले कई उपकरणों के साथ एक समस्या है http://code.google.com/p/android/issues/list?cursor=10603&updated-10603&ts=1295993403


आईडी को पूछताछ में देखने और उसके बारे में एक धागा देखने के बाद मुझे यकीन है। पहले मुझे लगा कि यह संभव हो सकता है कि डिवाइस अशक्त लौट रहा था और मैंने इसे डिफ़ॉल्ट रूप में कहीं रखा था। पर ये स्थिति नहीं है। मुझे पता है कि मुझे कई उपकरणों पर समान मूल्य मिल रहा है।
२२:२२ बजे फोमजीयू

1
मैं एकदम सही पाया: stackoverflow.com/a/16929647/1318946
प्रतीक बुटानी

ऐसे मामलों के लिए जहां यह अद्वितीय नहीं है, इस लाइब्रेरी का उपयोग करें जो Identity.getDeviceId (संदर्भ) के साथ आता है ।
caw

जवाबों:


47

इस धागे में जाँच करें , हालाँकि आपको सावधान रहना चाहिए क्योंकि यह "फैक्ट्री रीसेट पर बदल सकता है" के रूप में प्रलेखित है। अपने जोखिम पर उपयोग करें, और इसे आसानी से जड़ वाले फोन पर बदला जा सकता है। इसके अलावा ऐसा प्रतीत होता है जैसे कुछ निर्माताओं ने अपने फोन के साथ डुप्लिकेट नंबर थ्रेड वाले मुद्दे लिए हैं । आपके क्या करने की कोशिश के आधार पर, मैं शायद इसे यूआईडी के रूप में इस्तेमाल नहीं करूंगा।


19
यह शर्म की बात है कि ANDROID_ID का कार्यान्वयन इतना ही है ... लंगड़ा! Google के दस्तावेज़ीकरण को देखते हुए, इरादे एक लंबे समय तक चलने वाली आईडी थी: 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
कोई

3
इस थ्रेड लिंक के अनुसार "इसके अलावा, एक प्रमुख निर्माता के लोकप्रिय हैंडसेट में कम से कम एक व्यापक रूप से देखा गया बग है, जहां हर उदाहरण में एक ही ANDROID_ID है।" इसका उपयोग न करने के लिए बेहतर है
मुहम्मद रियाज़

2
वह 2011 से Froyo के दौरान था। यह अब अप्रासंगिक है।
आबटीन समई

डिवाइस बैकअप / रिस्टोर या डिवाइस क्लोनिंग के बारे में क्या? समान ANDROID_ID होने की संभावना के बारे में कोई विचार? यह मान लेना कि डिवाइस निश्चित रूप से निहित नहीं है।
फंकस्कूलब्रॉथर

39

Android O के साथ ANDROID_ID का व्यवहार बदल जाएगा। ANDROID_ID फोन पर प्रति उपयोगकर्ता प्रति ऐप अलग होगा।

इससे लिया गया: https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-.html

Android ID

O में, Android ID (Settings.Secure.ANDROID_ID या SSAID) डिवाइस पर प्रत्येक ऐप और प्रत्येक उपयोगकर्ता के लिए एक अलग मूल्य है। डिवाइस-स्कॉप्ड आइडेंटिफायर की आवश्यकता वाले डेवलपर्स को इसके बजाय उपयोगकर्ताओं को अधिक नियंत्रण देने वाले विज्ञापन आईडी जैसे एक रीसेट पहचानकर्ता का उपयोग करना चाहिए। विज्ञापन आईडी विज्ञापन ट्रैकिंग को सीमित करने के लिए एक उपयोगकर्ता-सामना करने वाली सेटिंग भी प्रदान करती है।

इसके अतिरिक्त Android O में:

  • ANDROID_ID मान पैकेज अनइंस्टॉल / रीइंस्टॉल में तब तक नहीं बदलेगा, जब तक कि पैकेज का नाम और हस्ताक्षर कुंजी एक ही हो। राज्य भर में बहाल करने के लिए ऐप्स इस मूल्य पर भरोसा कर सकते हैं।
  • यदि एंड्रॉइड के पुराने संस्करण को चलाने वाले डिवाइस पर एक ऐप इंस्टॉल किया गया था, तो एंड्रॉइड ओ में डिवाइस को अपडेट करने पर एंड्रॉइड आईडी वही रहता है, जब तक कि ऐप को अनइंस्टॉल और पुनः इंस्टॉल नहीं किया जाता है।
  • एंड्रॉइड आईडी मूल्य केवल तभी बदलता है जब डिवाइस फ़ैक्टरी रीसेट है या यदि साइनिंग कुंजी अनइंस्टॉल और
    पुनर्स्थापना घटनाओं के बीच घूमती है।
  • यह परिवर्तन केवल Google Play सेवाओं और विज्ञापन आईडी के साथ उपकरण निर्माताओं के शिपिंग के लिए आवश्यक है। अन्य डिवाइस निर्माता एक वैकल्पिक रीसेट करने योग्य आईडी प्रदान कर सकते हैं या ANDROID आईडी प्रदान करना जारी रख सकते हैं।

धन्यवाद। मैं अपने बालों को यह जानने की कोशिश कर रहा था कि मुझे डिवाइस आईडी द्वारा रिपोर्ट की गई (md5'ed) आईडी का उपयोग करके पत्नी के फोन में टेस्ट विज्ञापन क्यों नहीं मिल रहे हैं और फिर यह एडीबी शेल सेटिंग्स कमांड के माध्यम से रिपोर्ट किए गए मूल्य से मेल नहीं खाएगा। .. मैने सोचा मैं पागल हो गया था।
ecv

15

इसलिए यदि आप डिवाइस के लिए कुछ अनूठा चाहते हैं, तो पर्याप्त TM.getDeviceId() होना चाहिए।

यहां वह कोड है जो दिखाता है कि टेलीफोनी मैनेजर आईडी कैसे प्राप्त करें। एंड्रॉइड डिवाइस आईडी जो आप उपयोग कर रहे हैं, वह फ़ैक्टरी सेटिंग्स पर बदल सकती है और कुछ निर्माताओं द्वारा अद्वितीय आईडी देने में भी समस्या है।

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 () का उपयोग करना भी काम करता है। लेकिन आपको बहुत सावधान रहना चाहिए क्योंकि यह अशक्त हो सकता है। (3 जी / फोन मॉडेम के बिना उपकरणों पर) एक समाधान जो मैं उपयोग करता हूं वह वाईफाई के मैक-पते पर वापस गिरना है (जो निश्चित रूप से गायब भी हो सकता है, लेकिन आमतौर पर एक ही उपकरण पर नहीं)
vdstw

19
READ_PHONE_STATEअनुमति की आवश्यकता भयानक है। ANDROID_IDइसके बजाय उपयोग करें ।
dolmen

हाँ, यह बिना 3 जी (बाजार में उनमें से बहुत से) वाले उपकरणों पर शून्य वापस आ सकता है, फिर आपको वाईफाई का उपयोग करना चाहिए - जब तक आप इसे डिवाइस को रिबूट करने के बाद कम से कम एक बार चालू / बंद नहीं करते तब तक इसका मार्गदर्शन भी शून्य हो सकता है। और अगर कोई वाईफाई नहीं ... असली दुःस्वप्न, खिड़कियों पर सीई प्रत्येक डिवाइस के लिए GUID था और जीवन सुंदर था।
16

यह हजारों अनुरोधों के बाद पता चलता है कि डिवाइस आईडी, जो कि IMEI है नकली उपकरणों पर डुप्लिकेट किया जा सकता है, इसलिए पूर्ण प्रमाण समाधान नहीं है। मैं एक वापसी के रूप में getSimSerialNumber और ANDROID_ID का उपयोग करने पर भरोसा कर रहा हूं।
अजीबोला

एंड्रॉइड 10 (एपीआई स्तर 29) गैर-पहचान योग्य पहचानकर्ताओं के लिए प्रतिबंध जोड़ता है, जिसमें आईएमईआई और सीरियल नंबर दोनों शामिल हैं। इससे पहले कि आप TM.getDeviceId()दृष्टिकोण को लागू करें , पहले Android> = 10 उपकरणों पर डिवाइस पहचानकर्ताओं के लिए नई अनुमति आवश्यकताओं पर एक नज़र डालें ।
ईजेकील सेबेस्टिन

6

मैंने इस बारे में कुछ बातें पढ़ी हैं और दुर्भाग्य से ANDROID_ID को किसी व्यक्तिगत डिवाइस की विशिष्ट पहचान के लिए निर्भर नहीं होना चाहिए।

यह एंड्रॉइड अनुपालन आवश्यकताओं में लागू नहीं होता है और इसलिए निर्माता इसे लागू करने के तरीके को लागू करते हैं, जिसमें वे कुछ का चयन करते हैं, जैसे कि 'मॉडल आईडी' आदि।

यह भी जान लें कि भले ही किसी निर्माता ने इसे UUID बनाने के लिए जेनरेटर लिखा हो (उदाहरण के लिए), यह फ़ैक्टरी रीसेट से बचने की गारंटी नहीं है।


6
मुझे लगता है कि यह डिज़ाइन द्वारा फ़ैक्टरी रीसेट से बचने की गारंटी नहीं है, यह डॉक्स में कहीं उल्लेख किया गया है। और इसे लागू करने का सही तरीका है।
वायलेट जिराफ

तो हम एक GUID कैसे उत्पन्न कर सकते हैं?
इगोरगानापोलस्की

6

वहाँ कई समाधान मौजूद हैं, लेकिन उनमें से कोई भी सही नहीं है। चलो एक एक करके चलते हैं।

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

  • इस समाधान के लिए आपके उपयोगकर्ता को android.permission.READ_PHONE_STATE के लिए अनुरोध करना होगा, जो आपके द्वारा किए गए आवेदन के प्रकार का औचित्य सिद्ध करना कठिन हो सकता है।

  • इसके अलावा, यह समाधान स्मार्टफ़ोन तक सीमित है क्योंकि टैबलेट में टेलीफ़ोनी सेवाएं नहीं हैं। एक लाभ यह है कि मूल्य उपकरणों पर फ़ैक्टरी रीसेट करने के लिए जीवित रहता है।

2. MAC Address

  • आप वाई-फाई या ब्लूटूथ हार्डवेयर वाले डिवाइस से मैक एड्रेस प्राप्त करने का भी प्रयास कर सकते हैं। लेकिन, इस समाधान की अनुशंसा नहीं की जाती है क्योंकि सभी डिवाइस में वाई-फाई कनेक्शन नहीं है। भले ही उपयोगकर्ता के पास वाई-फाई कनेक्शन हो, उसे डेटा पुनः प्राप्त करने के लिए चालू करना होगा। अन्यथा, कॉल मैक पते की रिपोर्ट नहीं करता है।

3. Serial Number

  • टैबलेट जैसी टेलीफोनी सेवाओं के बिना डिवाइस को एक अद्वितीय डिवाइस आईडी की रिपोर्ट करनी चाहिए जो Android 2.3. जिंजरब्रेड के बाद से android.os.Build.SERIAL के माध्यम से उपलब्ध है। टेलीफोनी सेवाओं वाले कुछ फोन एक सीरियल नंबर को भी परिभाषित कर सकते हैं। जैसे सभी 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

  • जैसा कि अधिकांश अनुप्रयोगों की आवश्यकता एक विशेष स्थापना की पहचान करना है और भौतिक उपकरण नहीं, एक अच्छा समाधान एक उपयोगकर्ता के लिए यूआईडी आईडी का उपयोग करने के लिए। 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 पर किसी विशेष डिवाइस को पहचानना कोई आसान बात नहीं है। उससे बचने के कई अच्छे कारण हैं। सबसे अच्छा समाधान संभवत: यूयूआईडी समाधान का उपयोग करके किसी विशेष स्थापना की पहचान करना है। साभार: ब्लॉग


1

बस यहां एक वैकल्पिक समाधान की सूची दें, विज्ञापन आईडी:

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

ऊपर दिए गए लिंक से कॉपी किया गया:

विज्ञापन आईडी विज्ञापन के लिए एक अद्वितीय, उपयोगकर्ता-रीसेट करने योग्य आईडी है, जो Google Play सेवाओं द्वारा प्रदान की जाती है। यह उपयोगकर्ताओं को बेहतर नियंत्रण देता है और डेवलपर्स को अपने ऐप्स को मुद्रीकृत करने के लिए एक सरल, मानक प्रणाली प्रदान करता है। यह उपयोगकर्ताओं को अपने पहचानकर्ता को रीसेट करने या Google Play ऐप्स के भीतर व्यक्तिगत विज्ञापनों (जिसे पहले ब्याज-आधारित विज्ञापन के रूप में जाना जाता है) से बाहर निकलने में सक्षम बनाता है।

सीमाएँ हैं:

  1. Google Play सक्षम डिवाइस केवल।
  2. गोपनीयता नीति: https://support.google.com/googleplay/android-developer/answer/113469?hl=en&rd=1#privacy

क्या यह उन फोन के लिए काम करने वाला है जिनके पास Google Play (सेवाएं) नहीं हैं?
मैक्स वॉटरमैन

यह एक GUID नहीं है
IgGanapolsky

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 प्रत्येक डिवाइस के लिए अद्वितीय है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.