सवाल क्या कोई अनूठी एंड्रॉइड डिवाइस आईडी है?


क्या एंड्रॉइड डिवाइसों में एक अद्वितीय आईडी है, और यदि हां, तो जावा का उपयोग करके इसे एक्सेस करने का एक आसान तरीका क्या है?


2312
2018-05-07 00:47


मूल


यदि आप उपयोग कर रहे हैं ANDROID_ID पढ़ना सुनिश्चित करें यह जवाब तथा यह बग। - Dheeraj V.S.
यहां एक सूचनात्मक उत्तर दिया गया है। - Eng.Fouad
मुझे सही मिला: stackoverflow.com/a/16929647/1318946 - Pratik Butani
मैंने यह बहुत उपयोगी पाया क्योंकि यह सभी उपलब्ध अद्वितीय पहचानकर्ताओं पर चर्चा करता है और प्रत्येक में वजन करता है और सर्वोत्तम निष्कर्ष निकालता है stackoverflow.com/q/27233518/5252270 - sathishkumar_kingmaker


जवाब:


Settings.Secure#ANDROID_ID एंड्रॉइड आईडी को एक के रूप में देता है प्रत्येक उपयोगकर्ता के लिए अद्वितीय 64-बिट हेक्स स्ट्रिंग।

import android.provider.Settings.Secure;

private String android_id = Secure.getString(getContext().getContentResolver(),
                                                        Secure.ANDROID_ID); 

1699
2018-05-07 00:49



इसे कभी-कभी शून्य माना जाता है, इसे "फैक्टरी रीसेट पर बदल सकते हैं" के रूप में दस्तावेज किया गया है। अपने जोखिम पर प्रयोग करें, और इसे रूट किए गए फोन पर आसानी से बदला जा सकता है। - Seva Alekseyev
groups.google.com/group/android-developers/browse_thread/thread/... - Erdal
मुझे लगता है कि हमें पहले जवाब में हैश में ANDROID_ID का उपयोग करने के बारे में सावधान रहने की आवश्यकता है क्योंकि ऐप पहले चलाने पर सेट नहीं किया जा सकता है, बाद में सेट किया जा सकता है, या सिद्धांत में भी बदल सकता है, इसलिए अद्वितीय आईडी बदल सकती है
जागरूक रहें इस समाधान के साथ बड़ी सीमाएं हैं: android-developers.blogspot.com/2011/03/... - emmby
ANDROID_ID अब विशिष्ट रूप से डिवाइस की पहचान नहीं करता है (4.2 के रूप में): stackoverflow.com/a/13465373/150016 - Tom


अद्यतन करें: एंड्रॉइड के हाल के संस्करणों के साथ, कई मुद्दों के साथ ANDROID_ID हल हो गया है, और मेरा मानना ​​है कि यह दृष्टिकोण अब आवश्यक नहीं है। कृपया एक नज़र डालें एंथनी का जवाब

पूर्ण प्रकटीकरण: मेरा ऐप मूल रूप से नीचे दिए गए दृष्टिकोण का उपयोग करता है लेकिन अब इस दृष्टिकोण का उपयोग नहीं करता है, और अब हम उल्लिखित दृष्टिकोण का उपयोग करते हैं एंड्रॉइड डेवलपर ब्लॉग प्रवेश कि एम्म्बी का जवाब लिंक (अर्थात्, उत्पन्न करना और सहेजना UUID#randomUUID())।


इस सवाल के कई जवाब हैं, जिनमें से अधिकांश समय के "कुछ" काम करेंगे, और दुर्भाग्यवश यह पर्याप्त नहीं है।

उपकरणों के अपने परीक्षणों के आधार पर (सभी फोन, जिनमें से कम से कम एक सक्रिय नहीं है):

  1. परीक्षण किए गए सभी उपकरणों के लिए एक मूल्य वापस कर दिया TelephonyManager.getDeviceId()
  2. सभी जीएसएम डिवाइस (सभी सिम के साथ परीक्षण) के लिए एक मूल्य लौटा दिया TelephonyManager.getSimSerialNumber()
  3. सभी सीडीएमए डिवाइस के लिए शून्य वापस आ गया getSimSerialNumber() (जैसा सोचा था)
  4. Google खाते के साथ सभी डिवाइसों ने एक मान वापस कर दिया ANDROID_ID
  5. सभी सीडीएमए उपकरणों ने दोनों के लिए एक ही मूल्य (या एक ही मूल्य का व्युत्पन्न) वापस कर दिया ANDROID_ID तथा TelephonyManager.getDeviceId() - जब तक सेटअप के दौरान एक Google खाता जोड़ा गया है।
  6. मुझे अभी तक कोई सिम के साथ जीएसएम डिवाइस का परीक्षण करने का मौका नहीं मिला है, जीएसएम डिवाइस जिसमें कोई Google खाता नहीं है, या हवाई जहाज मोड में से कोई भी डिवाइस नहीं है।

तो अगर आप डिवाइस के लिए कुछ अद्वितीय चाहते हैं, TM.getDeviceId()  चाहिए पर्याप्त हो। जाहिर है कि कुछ उपयोगकर्ता दूसरों की तुलना में अधिक पागल हैं, इसलिए यह इन पहचानकर्ताओं में से 1 या अधिक के लिए उपयोगी हो सकता है, ताकि स्ट्रिंग अभी भी डिवाइस के लिए लगभग अनूठी हो, लेकिन स्पष्ट रूप से उपयोगकर्ता के वास्तविक डिवाइस की पहचान नहीं करता है। उदाहरण के लिए, का उपयोग कर String.hashCode(), एक यूयूआईडी के साथ संयुक्त:

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();

परिणामस्वरूप कुछ ऐसा हो सकता है: 00000000-54b3-e7c7-0000-000046bffd97

यह मेरे लिए काफी अच्छा काम करता है।

जैसा कि रिचर्ड नीचे उल्लेख करता है, यह न भूलें कि आपको पढ़ने के लिए अनुमति की आवश्यकता है TelephonyManager गुण, तो इसे अपने मैनिफेस्ट में जोड़ें:

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

आयात libs

import android.content.Context;
import android.telephony.TelephonyManager;
import android.view.View;

1056
2018-05-17 22:12



टेलीफ़ोनी-आधारित आईडी टैबलेट डिवाइस पर नहीं होगी, नह? - Seva Alekseyev
इसलिए मैंने क्यों कहा कि ज्यादातर समय काम नहीं करेंगे :) मुझे अभी तक इस प्रश्न का कोई जवाब नहीं दिख रहा है जो सभी उपकरणों, सभी डिवाइस प्रकारों और सभी हार्डवेयर कॉन्फ़िगरेशन के लिए विश्वसनीय है। यही कारण है कि यह सवाल शुरू करने के लिए यहां है। यह बहुत स्पष्ट है कि इसका कोई अंत-समाधान नहीं है। व्यक्तिगत डिवाइस निर्माताओं में डिवाइस सीरियल नंबर हो सकते हैं, लेकिन उन लोगों का उपयोग करने के लिए हमारे सामने नहीं आते हैं, और यह एक आवश्यकता नहीं है। इस प्रकार हम हमारे साथ उपलब्ध है के साथ छोड़ दिया गया है। - Joe
कोड नमूना महान काम करता है। जोड़ने के लिए याद रखें <uses-permission android:name="android.permission.READ_PHONE_STATE" /> मेनिफेस्ट फ़ाइल में। यदि डेटाबेस में संग्रहीत किया जाता है, तो लौटाई गई स्ट्रिंग 36 वर्ण लंबी होती है। - Richard
जागरूक रहें इस समाधान के साथ बड़ी सीमाएं हैं: android-developers.blogspot.com/2011/03/... - emmby
@ सॉफ़्टर्न: मेरा मानना ​​है कि आप जो एंड्रॉइड डेवलपर ब्लॉग का जिक्र कर रहे हैं वह है कि पहले से ही जुड़ा हुआ है, जो बताता है कि आप क्या हैं कोशिश कर रहे हैं कहने के लिए, तो शायद आपको इसके बजाय अपनी टिप्पणी को ऊपर उठाना चाहिए था। किसी भी तरह से, जैसा कि एम्मी ने अपने जवाब में उल्लेख किया है, ब्लॉग जानकारी के साथ भी समस्याएं हैं। सवाल एक अद्वितीय के लिए पूछता है डिवाइस पहचानकर्ता (स्थापना पहचानकर्ता नहीं), इसलिए मैं आपके कथन से असहमत हूं। ब्लॉग एक धारणा बना रहा है कि आप क्या चाहते हैं जरूरी नहीं है डिवाइस को ट्रैक करने के लिए, जबकि सवाल सिर्फ यही पूछता है। मैं अन्यथा ब्लॉग से सहमत हूं। - Joe


अंतिम अपडेट: 6/2/15


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

मुख्य मुद्दा: हार्डवेयर बनाम सॉफ्टवेयर

हार्डवेयर

  • उपयोगकर्ता अपने हार्डवेयर, एंड्रॉइड टैबलेट या फोन को बदल सकते हैं, इसलिए हार्डवेयर के आधार पर अद्वितीय आईडी अच्छे विचार नहीं हैं ट्रैकिंग यूज़र
  • के लिये ट्रैकिंग हार्डवेयर, यह एक महान विचार है

सॉफ्टवेयर

  • उपयोगकर्ता रूट होने पर अपने रोम को मिटा / बदल सकते हैं
  • आप प्लेटफार्मों (आईओएस, एंड्रॉइड, विंडोज़ और वेब) में उपयोगकर्ताओं को ट्रैक कर सकते हैं
  • सबसे अच्छा चाहते हैं एक व्यक्तिगत उपयोगकर्ता ट्रैक करें उनके साथ सहमति उन्हें बस लॉगिन करना है (ओएथ का उपयोग करके यह निर्बाध बनाएं)

एंड्रॉइड के साथ कुल मिलाकर टूटना

- एपीआई> = 9/10 (एंड्रॉइड डिवाइसों का 99.5%) के लिए गारंटी विशिष्टता (रूट डिवाइस शामिल हैं)

- कोई अतिरिक्त अनुमति नहीं है

Psuedo कोड:

if API >= 9/10: (99.5% of devices)

return unique ID containing serial id (rooted devices may be different)

else

return unique ID of build information (may overlap data - API < 9)

पोस्टिंग के लिए @stansult के लिए धन्यवाद हमारे सभी विकल्प (इस स्टैक ओवरफ़्लो प्रश्न में)।

विकल्पों की सूची - कारणों का उपयोग क्यों नहीं करें:

  • उपयोगकर्ता ईमेल - सॉफ्टवेयर

  • उपयोगकर्ता फोन नंबर - सॉफ्टवेयर

    • उपयोगकर्ता फोन नंबर बदल सकते हैं - बेहद असंभव
    • <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  • आईएमईआई - हार्डवेयर (केवल फोन, जरूरत है android.permission.READ_PHONE_STATE)

    • अधिकांश उपयोगकर्ता इस तथ्य से नफरत करते हैं कि यह अनुमति में "फोन कॉल" कहता है। कुछ उपयोगकर्ता खराब रेटिंग देते हैं, क्योंकि उनका मानना ​​है कि आप बस अपनी व्यक्तिगत जानकारी चुरा रहे हैं, जब आप वास्तव में करना चाहते हैं तो ट्रैक डिवाइस इंस्टॉल है। यह स्पष्ट है कि आप डेटा एकत्र कर रहे हैं।
    • <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  • एंड्रॉइड आईडी - हार्डवेयर (शून्य हो सकता है, फ़ैक्टरी रीसेट पर बदल सकता है, रूट डिवाइस पर बदला जा सकता है)

    • चूंकि यह 'शून्य' हो सकता है, इसलिए हम 'शून्य' की जांच कर सकते हैं और इसके मूल्य को बदल सकते हैं, लेकिन इसका मतलब है कि यह अब अद्वितीय नहीं होगा।
    • यदि आपके पास फ़ैक्टरी रीसेट डिवाइस वाला कोई उपयोगकर्ता है, तो रूट रूट डिवाइस पर बदल या बदल सकता है, इसलिए यदि आप उपयोगकर्ता इंस्टॉल को ट्रैक कर रहे हैं तो डुप्लीकेट प्रविष्टियां हो सकती हैं।
  • डब्ल्यूएलएएन मैक पता - हार्डवेयर (जरूरतों android.permission.ACCESS_WIFI_STATE)

    • यह दूसरा सबसे अच्छा विकल्प हो सकता है, लेकिन आप अभी भी एक अद्वितीय पहचानकर्ता एकत्रित और संग्रहीत कर रहे हैं जो सीधे उपयोगकर्ता से आता है। यह स्पष्ट है कि आप डेटा एकत्र कर रहे हैं।
    • <uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>
  • ब्लूटूथ मैक पता - हार्डवेयर (ब्लूटूथ के साथ डिवाइस, जरूरत है android.permission.BLUETOOTH)

    • बाजार पर अधिकांश एप्लिकेशन ब्लूटूथ का उपयोग नहीं करते हैं, और इसलिए यदि आपका एप्लिकेशन ब्लूटूथ का उपयोग नहीं करता है और आप इसमें शामिल हैं, तो उपयोगकर्ता संदिग्ध हो सकता है।
    • <uses-permission android:name="android.permission.BLUETOOTH "/>
  • छद्म-अद्वितीय आईडी - सॉफ्टवेयर (सभी एंड्रॉइड डिवाइसों के लिए)

    • बहुत संभव है, टकराव हो सकता है - नीचे दी गई मेरी विधि देखें!
    • यह आपको निजी से कुछ भी लेने के बिना उपयोगकर्ता से 'लगभग अद्वितीय' आईडी प्राप्त करने की अनुमति देता है। आप डिवाइस की जानकारी से अपना अनाम आईडी बना सकते हैं।

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

एक छद्म-अद्वितीय आईडी के साथ, आप वास्तव में केवल इस तथ्य में भाग लेते हैं कि इस तरह के उपकरणों के आधार पर डुप्लिकेट हो सकते हैं। आप इसे अधिक अद्वितीय बनाने के लिए संयुक्त विधि को ट्विक कर सकते हैं; हालांकि, कुछ डेवलपर्स को डिवाइस इंस्टॉल को ट्रैक करने की आवश्यकता है और यह समान उपकरणों के आधार पर चाल या प्रदर्शन करेगा।

एपीआई> = 9:

यदि उनका एंड्रॉइड डिवाइस एपीआई 9 या उससे अधिक है, तो यह 'Build.SERIAL' फ़ील्ड के कारण अद्वितीय होने की गारंटी है।

याद है, आप तकनीकी रूप से केवल 0.5% उपयोगकर्ताओं के बारे में याद कर रहे हैं एपीआई <9 है। तो आप बाकी पर ध्यान केंद्रित कर सकते हैं: यह 99.5% उपयोगकर्ताओं का है!

एपीआई <9:

यदि उपयोगकर्ता का एंड्रॉइड डिवाइस एपीआई 9 से कम है; उम्मीद है कि उन्होंने फ़ैक्टरी रीसेट नहीं किया है और उनके 'सुरक्षित .ANDROID_ID' को संरक्षित किया जाएगा या नहीं 'शून्य'। (देख http://developer.android.com/about/dashboards/index.html)

यदि सभी अन्य विफल होते हैं:

यदि सब कुछ विफल हो जाता है, यदि उपयोगकर्ता एपीआई 9 (जिंजरब्रेड से कम) से कम है, तो अपने डिवाइस या 'सुरक्षित .ANDROID_ID' रिटर्न 'शून्य' को रीसेट कर दिया गया है, तो बस लौटाई गई आईडी पूरी तरह से उनके एंड्रॉइड डिवाइस की जानकारी के आधार पर होगी। यह वह जगह है जहां टक्कर हो सकती है।

परिवर्तन:

  • फ़ैक्टरी रीसेट की वजह से 'Android.SECURE_ID' को हटाया गया मूल्य बदल सकता है
  • एपीआई पर बदलने के लिए कोड संपादित किया
  • छद्म बदल दिया

कृपया नीचे दी गई विधि पर नज़र डालें:

/**
 * Return pseudo unique ID
 * @return ID
 */
public static String getUniquePsuedoID() {
    // If all else fails, if the user does have lower than API 9 (lower
    // than Gingerbread), has reset their device or 'Secure.ANDROID_ID'
    // returns 'null', then simply the ID returned will be solely based
    // off their Android device information. This is where the collisions
    // can happen.
    // Thanks http://www.pocketmagic.net/?p=1662!
    // Try not to use DISPLAY, HOST or ID - these items could change.
    // If there are collisions, there will be overlapping data
    String m_szDevIDShort = "35" + (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);

    // Thanks to @Roman SL!
    // https://stackoverflow.com/a/4789483/950427
    // Only devices with API >= 9 have android.os.Build.SERIAL
    // http://developer.android.com/reference/android/os/Build.html#SERIAL
    // If a user upgrades software or roots their device, there will be a duplicate entry
    String serial = null;
    try {
        serial = android.os.Build.class.getField("SERIAL").get(null).toString();

        // Go ahead and return the serial for api => 9
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    } catch (Exception exception) {
        // String needs to be initialized
        serial = "serial"; // some value
    }

    // Thanks @Joe!
    // https://stackoverflow.com/a/2853253/950427
    // Finally, combine the values we have found by using the UUID class to create a unique identifier
    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}

नया (विज्ञापनों और Google Play सेवाओं वाले ऐप्स के लिए):

Google Play डेवलपर के कंसोल से:

1 अगस्त, 2014 से शुरू, Google Play डेवलपर प्रोग्राम नीति   विज्ञापन आईडी का उपयोग करने के लिए सभी नए ऐप अपलोड और अपडेट की आवश्यकता है   किसी भी विज्ञापन प्रयोजनों के लिए किसी भी अन्य लगातार पहचानकर्ताओं का झूठ।   और अधिक जानें

कार्यान्वयन:

अनुमति:

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

कोड:

import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;
import com.google.android.gms.common.GooglePlayServicesAvailabilityException;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import java.io.IOException;
...

// Do not call this function from the main thread. Otherwise, 
// an IllegalStateException will be thrown.
public void getIdThread() {

  Info adInfo = null;
  try {
    adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext);

  } catch (IOException exception) {
    // Unrecoverable error connecting to Google Play services (e.g.,
    // the old version of the service doesn't support getting AdvertisingId).

  } catch (GooglePlayServicesAvailabilityException exception) {
    // Encountered a recoverable error connecting to Google Play services. 

  } catch (GooglePlayServicesNotAvailableException exception) {
    // Google Play services is not available entirely.
  }
  final String id = adInfo.getId();
  final boolean isLAT = adInfo.isLimitAdTrackingEnabled();
}

स्रोत / डॉक्स:

http://developer.android.com/google/play-services/id.html http://developer.android.com/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.html

जरूरी:

इसका उद्देश्य यह है कि विज्ञापन आईडी पूरी तरह से मौजूदा जगह लेती है   विज्ञापन उद्देश्यों के लिए अन्य पहचानकर्ताओं का उपयोग (जैसे एंड्रॉइड_आईडी का उपयोग   सेटिंग्स में। सुरक्षित) जब Google Play सेवाएं उपलब्ध होती हैं। मामले   जहां Google Play सेवाएं अनुपलब्ध हैं, उन्हें इंगित किया जाता है   Google PlayServicesNotAvailableException द्वारा फेंक दिया जा रहा है   getAdvertisingIdInfo ()।

चेतावनी, उपयोगकर्ता रीसेट कर सकते हैं:

http://en.kioskea.net/faq/34732-android-reset-your-advertising-id

मैंने उन सभी लिंक को संदर्भित करने का प्रयास किया है जिनसे मैंने जानकारी ली है। यदि आप गायब हैं और शामिल होने की आवश्यकता है, तो कृपया टिप्पणी करें!

Google प्लेयर सेवा इंस्टेंस आईडी

https://developers.google.com/instance-id/


365
2017-07-12 23:58



लेकिन नहीं होगा Build ओएस अपडेट पर कक्षा परिवर्तन? खासकर यदि एपीआई अपडेट हो गया है? यदि हां, तो आप कैसे गारंटी देते हैं कि यह अद्वितीय है? (आपके द्वारा लिखी गई विधि के बारे में बोलना) - LuckyMe
मैंने टिप्पणियां भेजने के लिए अपने ऐप में अपनी विधि का उपयोग किया। मेरे पास बुरी खबर है। दुर्भाग्य से PsuedoID पूरी तरह अद्वितीय नहीं है। मेरे सर्वर ने 5 आईडी के लिए 100 से अधिक और लगभग 30 आईडी के लिए 30 से अधिक रिकॉर्ड किए। सबसे बार-बार आईडी 'ffffffff-fc8f-6093-ffff-ffffd8' (15 9 रिकॉर्ड) और 'ffffffff-fe99-b334-ffff-ffffef' (154 समय) हैं। समय और टिप्पणियों के आधार पर यह स्पष्ट है कि अलग-अलग लोग हैं। अब तक कुल रिकॉर्ड 10,000 है। कृपया मुझे बताएं कि ऐसा क्यों हुआ। टैंक। - hojjat reyhane
मैंने यह 1.5+ साल पहले लिखा था। मुझे यकीन नहीं है कि यह आपके लिए अद्वितीय क्यों नहीं है। आप विज्ञापन आईडी आज़मा सकते हैं। यदि नहीं, तो आप अपने स्वयं के समाधान के साथ आ सकते हैं। - Jared Burrows
sorta.. अगर आप सवाल से गुजरते हैं और इस पर अपने विचार देते हैं तो मैं वास्तव में सराहना करता हूं - Durai Amuthan.H
@ user1587329 धन्यवाद। मैं इसे हर किसी के लिए अद्यतित रखने की कोशिश कर रहा हूं। हार्डवेयर बनाम सॉफ़्टवेयर और क्रॉस प्लेटफॉर्म की बात आती है जब यह सवाल मुश्किल है। - Jared Burrows


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

हालांकि, ब्लॉग पोस्ट समाधान पर चर्चा करने के लिए आगे बढ़ता है यदि आपको ऐप इंस्टॉलेशन पहचानकर्ता की बजाय डिवाइस पहचानकर्ता की आवश्यकता है। मैंने आपको ऐसा करने की आवश्यकता होने पर कुछ आइटमों पर कुछ अतिरिक्त स्पष्टीकरण प्राप्त करने के लिए Google पर किसी के साथ बात की थी। यहां बताया गया है कि मैंने डिवाइस पहचानकर्ताओं के बारे में क्या खोजा है जिनका उपर्युक्त ब्लॉग पोस्ट में उल्लेख नहीं किया गया है:

  • ANDROID_ID पसंदीदा डिवाइस पहचानकर्ता है। ANDROID_ID Android <= 2.1 या> = 2.3 के संस्करणों पर पूरी तरह विश्वसनीय है। केवल 2.2 में पोस्ट में उल्लिखित समस्याएं हैं।
  • कई निर्माताओं द्वारा कई डिवाइस 2.2 में ANDROID_ID बग से प्रभावित होते हैं।
  • जहां तक ​​मैं निर्धारित करने में सक्षम हूं, सभी प्रभावित उपकरणों में है वही ANDROID_ID, जो है 9774d56d682e549c। एमुलेटर, बीटीडब्ल्यू द्वारा रिपोर्ट की गई एक ही डिवाइस आईडी भी है।
  • Google का मानना ​​है कि OEM ने कई या अधिकांश उपकरणों के लिए इस मुद्दे को पैच किया है, लेकिन मैं यह सत्यापित करने में सक्षम था कि कम से कम अप्रैल 2011 की शुरुआत के रूप में, टूटी हुई एंड्रॉइड_आईडी डिवाइसों को ढूंढना अभी भी आसान है।

Google की सिफारिशों के आधार पर, मैंने एक कक्षा को कार्यान्वित किया है जो एंड्रॉइड_आईडी का उपयोग करके उपयुक्त उपकरण के रूप में एंड्रॉइड_आईडी का उपयोग करके प्रत्येक डिवाइस के लिए एक अद्वितीय यूयूआईडी उत्पन्न करेगा, और आवश्यकतानुसार टेलीफ़ोनी मैनेजर.getDeviceId () पर वापस आ रहा है, और यदि यह विफल रहता है, तो यादृच्छिक रूप से जेनरेट किए गए अद्वितीय UUID का उपयोग करना यह ऐप पुनरारंभ करने पर जारी है (लेकिन ऐप पुन: इंस्टॉल नहीं)।

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

दोबारा, यह कोड एक डिवाइस आईडी के लिए है, न कि ऐप इंस्टॉलेशन आईडी। ज्यादातर स्थितियों के लिए, एक ऐप इंस्टॉलेशन आईडी शायद वह है जिसे आप ढूंढ रहे हैं। लेकिन अगर आपको डिवाइस आईडी की आवश्यकता है, तो निम्न कोड शायद आपके लिए काम करेगा।

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();
                    }
                }
            }
        }
    }

    /**
     * Returns a unique UUID for the current android device. As with all UUIDs,
     * this unique ID is "very highly likely" to be unique across all Android
     * devices. Much more so than ANDROID_ID is.
     * 
     * The UUID is generated by using ANDROID_ID as the base key if appropriate,
     * falling back on TelephonyManager.getDeviceID() if ANDROID_ID is known to
     * be incorrect, and finally falling back on a random UUID that's persisted
     * to SharedPreferences if getDeviceID() does not return a usable value.
     * 
     * In some rare circumstances, this ID may change. In particular, if the
     * device is factory reset a new device ID may be generated. In addition, if
     * a user upgrades their phone from certain buggy implementations of Android
     * 2.2 to a newer, non-buggy version of Android, the device ID may change.
     * Or, if a user uninstalls your app on a device that has neither a proper
     * Android ID nor a Device ID, this ID may change on reinstallation.
     * 
     * Note that if the code falls back on using TelephonyManager.getDeviceId(),
     * the resulting ID will NOT change after a factory reset. Something to be
     * aware of.
     * 
     * Works around a bug in Android 2.2 for many devices when using ANDROID_ID
     * directly.
     * 
     * @see http://code.google.com/p/android/issues/detail?id=10603
     * 
     * @return a UUID that may be used to uniquely identify your device for most
     *         purposes.
     */
    public UUID getDeviceUuid() {
        return uuid;
    }
}

314
2018-04-11 19:06



क्या आप विभिन्न आईडी को परेशान नहीं करना चाहिए ताकि वे सभी एक ही आकार के हों? इसके अतिरिक्त, आपको व्यक्तिगत जानकारी का गलती से खुलासा न करने के लिए डिवाइस आईडी को हश करना चाहिए। - Steve Pomeroy
अच्छे अंक, स्टीव। मैंने हमेशा यूयूआईडी वापस करने के लिए कोड अपडेट किया। यह सुनिश्चित करता है कि ए) जेनरेट की गई आईडी हमेशा एक ही आकार के होते हैं, और बी) व्यक्तिगत जानकारी को गलती से उजागर करने से बचने के लिए एंड्रॉइड और डिवाइस आईडी वापस लौटने से पहले धोए जाते हैं। मैंने यह भी नोट करने के लिए विवरण अपडेट किया कि डिवाइस आईडी फैक्ट्री रीसेट में जारी रहेगी और यह कुछ उपयोगकर्ताओं के लिए वांछनीय नहीं हो सकती है। - emmby
मेरा मानना ​​है कि आप गलत हैं; पसंदीदा समाधान इंस्टॉलेशन को ट्रैक करना है, डिवाइस पहचानकर्ता नहीं। आपका कोड ब्लॉग पोस्ट में उससे काफी लंबा और जटिल है और यह मेरे लिए स्पष्ट नहीं है कि यह कोई मूल्य जोड़ता है। - Tim Bray
अच्छा बिंदु, मैंने दृढ़ता से सुझाव दिया कि उपयोगकर्ता डिवाइस आईडी के बजाय ऐप इंस्टॉलेशन आईडी का उपयोग करें। हालांकि, मुझे लगता है कि यह समाधान अभी भी उन लोगों के लिए मूल्यवान है जिन्हें इंस्टॉलेशन आईडी की बजाय डिवाइस की आवश्यकता है। - emmby
ANDROID_ID फ़ैक्टरी रीसेट पर बदल सकता है, इसलिए यह डिवाइसों की पहचान भी नहीं कर सकता है - Samuel


यहां कोड है जो रेटो मेयर में उपयोग किया जाता है Google I / O इस साल प्रस्तुति उपयोगकर्ता के लिए एक अद्वितीय आईडी प्राप्त करने के लिए:

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;
}

यदि आप क्लाउड को वरीयताओं को भेजने के लिए बैकअप रणनीति के साथ इसे जोड़ते हैं (रेटो में भी वर्णित है बातचीत, आपके पास एक आईडी होना चाहिए जो किसी उपयोगकर्ता से संबंध रखता है और डिवाइस को पोंछने के बाद चारों ओर चिपक जाता है, या यहां तक ​​कि प्रतिस्थापित किया जाता है। मैं आगे बढ़ने वाले विश्लेषिकी में इसका उपयोग करने की योजना बना रहा हूं (दूसरे शब्दों में, मैंने अभी तक यह कुछ नहीं किया है :)।


165
2017-10-28 13:19



मैं अनन्य आईडी के लिए वर्तमान समय के साथ @Lenn Dolling की विधि का उपयोग कर रहा था। लेकिन यह अधिक सरल और भरोसेमंद तरीके की तरह लगता है। धन्यवाद रेटो मेयर और एंटनी नोलन - Gökhan Barış Aker
यह बहुत अच्छा है लेकिन जड़ वाले उपकरणों के बारे में क्या है? वे इसे एक्सेस कर सकते हैं और यूआईडी को आसानी से एक अलग में बदल सकते हैं। - tasomaniac
ग्रेट विकल्प यदि आपको अनइंस्टॉल करने और पुनर्स्थापित करने के बाद जारी रखने के लिए अद्वितीय आईडी की आवश्यकता नहीं है (उदा। प्रचार ईवेंट / गेम जहां आपको जीतने के तीन मौके मिलते हैं, अवधि)। - Kyle Clegg
मीयर प्रेजेंटेशन एंड्रॉइड बैकअप मैनेजर का उपयोग करने पर निर्भर करता है, जो बदले में उस सुविधा को चालू करने के लिए उपयोगकर्ता पर निर्भर करता है। ऐप उपयोगकर्ता वरीयताओं (मीयर का उपयोग) के लिए यह ठीक है, क्योंकि यदि उपयोगकर्ता ने उस विकल्प का चयन नहीं किया है, तो वह उन बैक अप नहीं ले पाएगी। हालांकि, मूल प्रश्न एक अद्वितीय आईडी उत्पन्न करने के बारे में है युक्ति, और यह आईडी प्रति ऐप जेनरेट की जाती है, और इंस्टॉलेशन प्रति भी नहीं, प्रति डिवाइस अकेले रहने दें, और चूंकि यह बैकअप विकल्प चुनने वाले उपयोगकर्ता पर निर्भर करता है, इसके उपयोग उपयोगकर्ता प्राथमिकताओं से परे है (उदा।, समय-सीमित परीक्षण के लिए) सीमित हैं। - Carl
यह डेटा की स्थापना रद्द करने या समाशोधन पर काम नहीं करेगा। - John Shelley


इसके अलावा आप वाई-फाई एडाप्टर के मैक पते पर विचार कर सकते हैं। इस प्रकार पुनः प्राप्त किया गया:

WifiManager wm = (WifiManager)Ctxt.getSystemService(Context.WIFI_SERVICE);
return wm.getConnectionInfo().getMacAddress();

अनुमति की आवश्यकता है android.permission.ACCESS_WIFI_STATE मैनिफेस्ट में

वाई-फाई कनेक्ट नहीं होने पर भी उपलब्ध होने की सूचना दी गई। यदि उपर्युक्त उत्तर से जो इसे अपने कई उपकरणों पर आज़माता है, तो यह अच्छा होगा।

कुछ उपकरणों पर, यह वाई-फाई बंद होने पर उपलब्ध नहीं है।

ध्यान दें: एंड्रॉइड 6.x से, यह लगातार नकली मैक पता देता है: 02:00:00:00:00:00


98
2018-06-23 14:27



यह आवश्यक है android.permission.ACCESS_WIFI_STATE - ohhorob
वे जीवित हैं? मैं बजाय एक टेलीफोनी-कम डिवाइस (एकेए टैबलेट) की कल्पना करता हूं ... - Seva Alekseyev
मुझे पता है कि यह सवाल पुराना है - लेकिन यह एक अच्छा विचार है। मैंने अपने ऐप में बीटी मैक आईडी का इस्तेमाल किया, लेकिन केवल इसलिए कि इसे बीटी को काम करने की आवश्यकता है। मुझे एक एंड्रॉइड डिवाइस दिखाएं जो इसके लिए विकास योग्य है जिसके पास वाईफाई नहीं है। - Jack
मुझे लगता है कि आप पाएंगे कि वाईफाई बंद होने पर यह अनुपलब्ध है, बहुत सारे एंड्रॉइड डिवाइस पर। वाईफाई बंद करना डिवाइस को कर्नेल स्तर पर हटा देता है। - chrisdowney
@ सॅनंद्रिया - चलो इसका सामना करते हैं, जड़ वाले डिवाइस पर सबकुछ खराब हो सकता है। - ocodo


बल्कि उपयोगी जानकारी है यहाँ

इसमें पांच अलग-अलग आईडी प्रकार शामिल हैं:

  1. आईएमईआई (केवल फोन उपयोग के साथ एंड्रॉइड डिवाइस के लिए; जरूरत है android.permission.READ_PHONE_STATE)
  2. छद्म-अद्वितीय आईडी (सभी एंड्रॉइड डिवाइसों के लिए)
  3. एंड्रॉइड आईडी (शून्य हो सकता है, फ़ैक्टरी रीसेट पर बदल सकता है, रूट किए गए फोन पर बदला जा सकता है)
  4. डब्ल्यूएलएएन मैक पता स्ट्रिंग (जरूरत है android.permission.ACCESS_WIFI_STATE)
  5. बीटी मैक पता स्ट्रिंग (ब्लूटूथ के साथ डिवाइस, जरूरत है android.permission.BLUETOOTH)

78
2018-02-08 02:16



महत्वपूर्ण बिंदु (यहां और लेख में) छोड़ दिया गया है: जब तक वे चालू नहीं होते हैं तब तक आपको डब्लूएलएएन या बीटी मैक नहीं मिल सकता है! अन्यथा मुझे लगता है कि डब्लूएलएएन मैक एक आदर्श पहचानकर्ता होगा। आपको कोई गारंटी नहीं है कि उपयोगकर्ता कभी भी अपनी वाई-फाई चालू कर देगा, और मुझे सच में नहीं लगता कि यह स्वयं को चालू करने के लिए 'उचित' है। - Tom
@ तुम गलत हो जब भी वे बंद हो जाते हैं तब भी आप डब्लूएलएएन या बीटी मैक पढ़ सकते हैं। हालांकि, इस बात की कोई गारंटी नहीं है कि डिवाइस में डब्लूएलएएन या बीटी मॉड्यूल उपलब्ध हैं। - Marqs
सबसे विशेष रूप से, स्थानीय वाईफाई और ब्लूटूथ मैक पते अब उपलब्ध नहीं हैं। AFifiInfo ऑब्जेक्ट और BluetoothAdapter.getDefaultAdapter () के getMacAddress () विधि। GetAddress () विधि दोनों वापस 0: 00: 00: 00: 00: 00 से वापस आएगी - sarika kate
@ सरिककट यह केवल 6.0 मार्शमलो और ऊपर में सच है ... यह अभी भी 6.0 मार्शमलो में अपेक्षित के रूप में काम कर रहा है। - Smeet
@ स्मेम हाँ आप सही हैं। मैं उल्लेख करना भूल गया कि यह 6.0 से नीचे काम कर रहा है - sarika kate


आधिकारिक एंड्रॉइड डेवलपर्स ब्लॉग के पास अब इस विषय के बारे में एक पूरा लेख है, ऐप इंस्टॉलेशन की पहचान करना


43
2018-04-06 07:36



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