android - একটি অনন্য অ্যান্ড্রয়েড ডিভাইস আইডি আছে?




uniqueidentifier (20)

অ্যান্ড্রয়েড ডিভাইসগুলিতে একটি অনন্য আইডি আছে, এবং যদি তাই হয়, জাভা ব্যবহার করে এটি অ্যাক্সেস করার একটি সহজ উপায় কী?


সর্বশেষ আপডেট: 6/2/15

একটি অনন্য আইডি তৈরির বিষয়ে প্রতিটি স্ট্যাক ওভারফ্লো পোস্টটি পড়ার পরে, গুগল বিকাশকারী ব্লগ এবং Android ডকুমেন্টেশন, আমার মনে হয় 'ছদ্ম আইডি' সর্বোত্তম সম্ভাব্য বিকল্প।

প্রধান সমস্যা: হার্ডওয়্যার বনাম সফ্টওয়্যার

হার্ডওয়্যারের

  • ব্যবহারকারীরা তাদের হার্ডওয়্যার, Android ট্যাবলেট বা ফোন পরিবর্তন করতে পারে, তাই হার্ডওয়্যারগুলির উপর ভিত্তি করে অনন্য আইডিগুলি ট্র্যাকিং ব্যবহারকারীদের জন্য ভাল ধারণা নয়
  • ট্র্যাকিং হার্ডওয়ার জন্য, এটি একটি মহান ধারণা

সফটওয়্যার

  • তারা rooted হয় ব্যবহারকারীরা তাদের রম মুছে ফেলুন / পরিবর্তন করতে পারেন
  • আপনি প্ল্যাটফর্ম জুড়ে ব্যবহারকারীদের ট্র্যাক করতে পারেন (iOS, Android, উইন্ডোজ এবং ওয়েব)
  • তাদের সম্মতি সহ একটি স্বতন্ত্র ব্যবহারকারীকে ট্র্যাক করতে সেরাটি সহজেই তাদের লগইন করতে হবে (OAuth ব্যবহার করে এই সীমাহীন করে তুলুন)

অ্যান্ড্রয়েড সঙ্গে সামগ্রিক ভাঙ্গন

- API এর জন্য স্বতন্ত্রতা (root ডিভাইস অন্তর্ভুক্ত করুন)> = 9/10 (Android ডিভাইসগুলির 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)

আমাদের সকল বিকল্প পোস্ট করার জন্য @ স্ট্যান্স্ট্ট ধন্যবাদ (এই স্ট্যাক ওভারফ্লো প্রশ্নে)।

বিকল্পগুলির তালিকা - কেন ব্যবহার করবেন না কেন?

  • ব্যবহারকারী ইমেইল - সফ্টওয়্যার

  • ব্যবহারকারী ফোন নম্বর - সফটওয়্যার

    • ব্যবহারকারী ফোন নম্বর পরিবর্তন করতে পারে - অত্যন্ত সম্ভাবনাময়
    • <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  • আইএমইআই - হার্ডওয়্যার (শুধুমাত্র ফোন, প্রয়োজন android.permission.READ_PHONE_STATE )

    • অধিকাংশ ব্যবহারকারী অনুমতিতে "ফোন কল" বলে যে বিষয়টি ঘৃণা করে। কিছু ব্যবহারকারী খারাপ রেটিং দেয়, কারণ তারা বিশ্বাস করে যে আপনি কেবল তাদের ব্যক্তিগত তথ্য চুরি করছেন, যখনই আপনি যা করতে চান তা হল ট্র্যাক ডিভাইস ইনস্টল করা। এটা আপনি তথ্য সংগ্রহ করা হয় যে সুস্পষ্ট।
    • <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  • অ্যান্ড্রয়েড আইডি - হার্ডওয়্যার (ফাঁকা হতে পারে, ফ্যাক্টরি রিসেটে পরিবর্তন করতে পারে, রুট ডিভাইসে পরিবর্তন করা যেতে পারে)

    • যেহেতু এটি 'নাল' হতে পারে, আমরা 'নাল' চেক করতে এবং এর মান পরিবর্তন করতে পারি, তবে এর মানে এটি আর অনন্য হবে না।
    • যদি আপনার ফ্যাক্টরি রিসেট ডিভাইসের সাথে কোনও ব্যবহারকারী থাকে, তবে মানটি রুট ডিভাইসে পরিবর্তিত বা পরিবর্তিত হতে পারে তাই ব্যবহারকারীর ইনস্টলেশানগুলি ট্র্যাক করা থাকলে সদৃশ এন্ট্রি হতে পারে।
  • WLAN MAC ঠিকানা - হার্ডওয়্যার ( android.permission.ACCESS_WIFI_STATE )

    • এটি দ্বিতীয় সেরা বিকল্প হতে পারে তবে আপনি এখনও একটি ব্যবহারকারী থেকে সরাসরি আসা একটি অনন্য সনাক্তকারী সংগ্রহ এবং সংরক্ষণ করছেন। এটা আপনি তথ্য সংগ্রহ করা হয় যে সুস্পষ্ট।
    • <uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>
  • ব্লুটুথ ম্যাক ঠিকানা - হার্ডওয়্যার (ব্লুটুথ সহ ডিভাইস, android.permission.BLUETOOTH প্রয়োজন)

    • বাজারে বেশিরভাগ অ্যাপ্লিকেশন ব্লুটুথ ব্যবহার করে না এবং আপনার অ্যাপ্লিকেশনটি ব্লুটুথ ব্যবহার করে না এবং আপনি এতে অন্তর্ভুক্ত থাকলে ব্যবহারকারী সন্দেহজনক হয়ে উঠতে পারে।
    • <uses-permission android:name="android.permission.BLUETOOTH "/>
  • ছদ্ম-অনন্য আইডি - সফ্টওয়্যার (সব Android ডিভাইসের জন্য)

    • খুব সম্ভব, সংঘর্ষ থাকতে পারে - নিচে পোস্ট আমার পদ্ধতি দেখুন!
    • এটি আপনাকে ব্যক্তিগত যে কোনও কিছু না নিয়ে ব্যবহারকারীর কাছ থেকে 'প্রায় অনন্য' আইডি থাকতে দেয়। আপনি ডিভাইস তথ্য থেকে আপনার নিজস্ব বেনামী আইডি তৈরি করতে পারেন।

আমি অনুমতি ছাড়া একটি অনন্য আইডি পাওয়ার কোন 'নিখুঁত' উপায় নেই জানি; তবে, কখনও কখনও আমরা কেবল ডিভাইস ইনস্টলেশন ট্র্যাক করতে হবে। যখন এটি একটি অনন্য আইডি তৈরি করার কথা হয়, তখন আমরা কেবলমাত্র তথ্যের বাইরে থাকা 'ছদ্মবেশী অনন্য আইডি' তৈরি করতে পারি যা Android API আমাদের অতিরিক্ত অনুমতিগুলি ব্যবহার না করেই দেয়। এইভাবে, আমরা ব্যবহারকারীর সম্মান প্রদর্শন করতে পারি এবং ভাল ব্যবহারকারীর অভিজ্ঞতাও দিতে চেষ্টা করতে পারি।

একটি ছদ্ম-অনন্য আইডির সাহায্যে, আপনি কেবলমাত্র একই উপায়ে অনুরূপ ডিভাইসগুলিতে অনুরূপ সদৃশগুলি চালাতে পারেন। আপনি এটি আরও অনন্য করতে মিলিত পদ্ধতি tweak করতে পারেন; তবে, কিছু ডেভেলপারদের ডিভাইস ইনস্টলগুলি ট্র্যাক করতে হবে এবং এটি অনুরূপ ডিভাইসগুলির উপর ভিত্তি করে কৌশল বা কর্মক্ষমতা করবে।

API> = 9:

যদি তাদের Android ডিভাইস এপিআই 9 বা তার বেশি হয় তবে এটি 'Build.ERIAL' ক্ষেত্রের কারণে অনন্য হতে নিশ্চিত।

মনে রাখবেন , আপনি টেকনিক্যালি কেবলমাত্র প্রায় 0.5% ব্যবহারকারীদের হারিয়েছেন যারা API <9 । তাই আপনি বাকিদের উপর ফোকাস করতে পারেন: এটি 99.5% ব্যবহারকারী!

API <9:

যদি ব্যবহারকারীর Android ডিভাইসটি API 9 এর চেয়ে কম হয়; আশা করি, তারা একটি ফ্যাক্টরি রিসেট সম্পন্ন করেনি এবং তাদের 'Secure.ANDROID_ID' সংরক্ষিত হবে না 'নাল' হবে। ( http://developer.android.com/about/dashboards/index.html দেখুন )

অন্য সব ব্যর্থ হলে:

যদি অন্যটি ব্যর্থ হয় তবে ব্যবহারকারীর API 9 (কমার্সবার্গের চেয়ে কম), তার ডিভাইসটি পুনরায় সেট করা হয়েছে বা 'Secure.ANDROID_ID' ফিরে 'নাল' রিসেট করেছে, তারপরে কেবলমাত্র ফেরত দেওয়া আইডি কেবলমাত্র তাদের Android ডিভাইসের তথ্যটিকেই ভিত্তিহীন করে দেবে। সংঘর্ষ ঘটতে পারে যেখানে এই।

পরিবর্তন করুন:

  • ফ্যাক্টরি রিসেটের কারণে '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://.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://.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 পরিষেবাদিগুলির জন্য অ্যাপ্লিকেশানগুলির জন্য):

গুগল প্লে বিকাশকারীর কনসোল থেকে:

1 লা আগস্ট, ২014 থেকে শুরু হওয়া, 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

গুরুত্বপূর্ণ:

এটির উদ্দেশ্য হল যে বিজ্ঞাপন আইডি বিজ্ঞাপন পদের জন্য অন্যান্য সনাক্তকারীর বিদ্যমান ব্যবহারের (যেমন সেটিংস সিকিউর এ ANDROID_ID ব্যবহার করে) সম্পূর্ণভাবে প্রতিস্থাপন করে যখন Google Play পরিষেবাদি উপলব্ধ হয়। গুগল প্লে পরিষেবাদি অনুপলব্ধ ক্ষেত্রে একটি গুগল প্ল্লে সার্কেস নোটঅভ্যাপেলআপ এক্সপেকশনটি getAdvertisingIdInfo () দ্বারা নিক্ষেপ করা হয়।

সতর্কতা, ব্যবহারকারী পুনরায় সেট করতে পারেন:

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

আমি যে লিঙ্কটি থেকে তথ্য নিয়েছি তা উল্লেখ করার চেষ্টা করেছি। আপনি অনুপস্থিত এবং অন্তর্ভুক্ত করা প্রয়োজন, মন্তব্য করুন!

গুগল প্লেয়ার সার্ভিসেস ইনস্ট্যান্স আইডি

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


স্ট্রিং হিসাবে অ্যান্ড্রয়েড ওএস ডিভাইসের অনন্য ডিভাইস আইডি ব্যবহার করে TelephonyManagerএবং এর ANDROID_IDমাধ্যমে:

String deviceId;
final TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (mTelephony.getDeviceId() != null) {
    deviceId = mTelephony.getDeviceId();
}
else {
    deviceId = Secure.getString(
                   getApplicationContext().getContentResolver(),
                   Secure.ANDROID_ID);
}

তবে আমি গুগল দ্বারা প্রস্তাবিত একটি পদ্ধতি দৃঢ়ভাবে সুপারিশ করি, অ্যাপ ইনস্টলেশনের সনাক্তকরণ দেখুন ।


এখানে দরকারী তথ্য here

এটি পাঁচটি ভিন্ন আইডি ধরনের আচ্ছাদন করে:

  1. আইএমইআই (শুধুমাত্র ফোন ব্যবহারের সাথে Android ডিভাইসের জন্য; android.permission.READ_PHONE_STATE প্রয়োজন)
  2. ছদ্ম-অনন্য আইডি (সব অ্যান্ড্রয়েড ডিভাইসের জন্য)
  3. অ্যানড্রইড আইডি (ফাঁকা হতে পারে, কারখানা রিসেট উপর পরিবর্তন করতে পারেন, rooted ফোন পরিবর্তন করা যেতে পারে)
  4. WLAN MAC ঠিকানা স্ট্রিং (প্রয়োজন android.permission.ACCESS_WIFI_STATE )
  5. বিটি ম্যাক ঠিকানা স্ট্রিং (ব্লুটুথ সহ ডিভাইস, android.permission.BLUETOOTH প্রয়োজন)

এখানে ব্যবহারকারীর জন্য একটি অনন্য আইডি পেতে এই বছর 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;
}

যদি আপনি ক্লাউডের জন্য পছন্দগুলি পাঠাতে ব্যাকআপ কৌশল সহ এটি দম্পতি (রিটোর talk বর্ণিত, আপনার কাছে এমন একটি আইডি থাকা উচিত যা ব্যবহারকারীর সাথে সম্পর্কযুক্ত এবং ডিভাইসটি মুছে ফেলার পরে প্রায় আটকে যায়, বা এমনকি প্রতিস্থাপিত। আমি এটি ব্যবহার করার পরিকল্পনা করছি বিশ্লেষণ ইন এগিয়ে যাচ্ছে (অন্য কথায়, আমি এখনো যে বিট না :)।


ডেভ ওয়েবের উল্লেখ হিসাবে, অ্যান্ড্রয়েড বিকাশকারী ব্লগটিতে এটির একটি নিবন্ধ রয়েছে। তাদের পছন্দের সমাধান ডিভাইসগুলির পরিবর্তে অ্যাপ্লিকেশন ইনস্টলগুলি ট্র্যাক করা, এবং এটি বেশিরভাগ ক্ষেত্রে ব্যবহারের জন্য ভাল কাজ করবে। ব্লগ পোস্টটি আপনাকে সেই কাজটি করার জন্য প্রয়োজনীয় কোডটি দেখাবে এবং আমি আপনাকে এটি পরীক্ষা করার সুপারিশ করছি।

তবে, ব্লগ পোস্টটি যদি কোনও সংস্থান সনাক্তকারীর পরিবর্তে একটি ডিভাইস সনাক্তকারীর প্রয়োজন হয় তবে সমাধানগুলি নিয়ে আলোচনা করতে চলে। আপনি এমন কিছু ইভেন্টে কিছু অতিরিক্ত স্প্লিফিকেশন পেতে Google এ কারো সাথে কথা বলেছেন যা আপনাকে করতে হবে। আমি ডিভাইস সনাক্তকারী সম্পর্কে আবিষ্কার করেছি যা উপরের ব্লগ পোস্টে উল্লিখিত নয়:

  • ANDROID_ID পছন্দের ডিভাইস সনাক্তকারী। ANDROID_ID Android এর সংস্করণগুলিতে পুরোপুরি নির্ভরযোগ্য <= 2.1 বা> = 2.3। শুধুমাত্র 2.2 পোস্টে উল্লিখিত সমস্যা আছে।
  • বিভিন্ন নির্মাতাদের দ্বারা কয়েকটি ডিভাইস 2.2 এ ANDROID_ID বাগ দ্বারা প্রভাবিত হয়।
  • যতদূর আমি নির্ধারণ করতে সক্ষম হচ্ছি, সব প্রভাবিত ডিভাইসগুলির একই ANDROID_ID রয়েছে , যা 9774d56d682e549c । এমুলেটর দ্বারা রিপোর্ট একই ডিভাইস আইডি যা, btw।
  • গুগল বিশ্বাস করে যে ই এমগুলি তাদের বেশিরভাগ বা বেশিরভাগ ডিভাইসের জন্য সমস্যাটি পেট করেছে, কিন্তু এপ্রিল 2011 এর শুরুতে আমি এটি যাচাই করতে সক্ষম হয়েছিলাম, অন্তত, এখনও এটির ভাঙ্গা ANDROID_ID ভাঙ্গা ডিভাইস খুঁজে পাওয়া খুব সহজ।

গুগলের সুপারিশের উপর ভিত্তি করে, আমি এমন একটি শ্রেণী প্রয়োগ করেছি যা প্রতিটি ডিভাইসের জন্য একটি অনন্য ইউআইডিআইডি তৈরি করবে, এন্ড্রয়েডআইআইডি ব্যবহার করে যথাযথ বীজ হিসাবে TelefonyManager.getDeviceId () এ ফিরে আসছে এবং যদি এটি ব্যর্থ হয়, তবে এলোমেলোভাবে উত্পন্ন অনন্য ইউयूআইডি ব্যবহার করে যে অ্যাপ্লিকেশন restartts জুড়ে স্থায়ী হয় (কিন্তু অ্যাপ্লিকেশন পুনরায় ইনস্টলেশন না)।

উল্লেখ্য যে যন্ত্রগুলির জন্য ডিভাইস আইডি-তে ফাঁকা থাকা ডিভাইসগুলির জন্য, অনন্য আইডিটি ফ্যাক্টরি রিসেট জুড়ে থাকবে। এই সচেতন হতে কিছু। যদি আপনি নিশ্চিত হন যে একটি ফ্যাক্টরি রিসেট আপনার অনন্য আইডিটি পুনরায় সেট করবে, তবে আপনি ডিভাইস আইডি পরিবর্তে এলোমেলো 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;
    }
}


TelephonyManger.getDeviceId () অনন্য ডিভাইস আইডি প্রদান করে, উদাহরণস্বরূপ, জিএসএমের জন্য আইএমইআই এবং সিডিএমএ ফোনগুলির জন্য MEID বা ESN।

final TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);            
String myAndroidDeviceId = mTelephony.getDeviceId(); 

কিন্তু আমি ব্যবহার করতে সুপারিশ:

Settings.Secure.ANDROID_ID যা একটি অনন্য 64-বিট হেক্স স্ট্রিং হিসাবে Android আইডি প্রদান করে।

    String   myAndroidDeviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 

কখনও কখনও TelephonyManger.getDeviceId () নল ফিরে আসবে, তাই একটি অনন্য আইডি নিশ্চিত করার জন্য আপনি এই পদ্ধতিটি ব্যবহার করবেন:

public String getUniqueID(){    
    String myAndroidDeviceId = "";
    TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    if (mTelephony.getDeviceId() != null){
        myAndroidDeviceId = mTelephony.getDeviceId(); 
    }else{
         myAndroidDeviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 
    }
    return myAndroidDeviceId;
}

আপডেট : Android এর সাম্প্রতিক সংস্করণগুলির হিসাবে, ANDROID_ID সাথে বেশিরভাগ সমস্যা সমাধান করা হয়েছে এবং আমি বিশ্বাস করি এই পদ্ধতিটি আর প্রয়োজন হবে না। অনুন্নি এর উত্তর এখনি দেখুন।

সম্পূর্ণ প্রকাশ: আমার অ্যাপ্লিকেশনটি মূলত নীচের পদ্ধতিটি ব্যবহার করে কিন্তু এই পদ্ধতিটি আর ব্যবহার করে না এবং আমরা এখন android-developers.blogspot.com/2011/03/… এন্ট্রিতে বর্ণিত পদ্ধতিটি ব্যবহার করে যা এমএমবি এর উত্তর লিঙ্ক করে (অর্থাত, একটি UUID#randomUUID() তৈরি এবং সংরক্ষণ করা)।

এই প্রশ্নের অনেক উত্তর আছে, যা অধিকাংশ সময় শুধুমাত্র "কিছু" কাজ করবে, এবং দুর্ভাগ্যবশত যে যথেষ্ট ভাল না।

ডিভাইসগুলির আমার পরীক্ষার উপর ভিত্তি করে (সমস্ত ফোন, অন্তত একটি সক্রিয় হয় না):

  1. পরীক্ষিত সমস্ত ডিভাইস TelephonyManager.getDeviceId() জন্য একটি মান ফেরত
  2. সমস্ত জিএসএম ডিভাইস (সিম সহ সমস্ত পরীক্ষিত) TelephonyManager.getSimSerialNumber() জন্য একটি মান প্রদান করে।
  3. সমস্ত সিডিএমএ ডিভাইসগুলি পেতে getSimSerialNumber() হিসাবে প্রত্যাশিত (প্রত্যাশিত)
  4. একটি Google অ্যাকাউন্ট যুক্ত সমস্ত ডিভাইস ANDROID_ID জন্য একটি মান প্রদান করে
  5. সমস্ত সিডিএমএ ডিভাইসগুলি ANDROID_ID এবং TelephonyManager.getDeviceId() উভয়ের জন্য একই মান (অথবা একই মানের ANDROID_ID ) উভয় ক্ষেত্রেই ফিরে আসে - যতক্ষণ একটি Google অ্যাকাউন্ট সেটআপের সময় যুক্ত করা হয়েছে।
  6. জিএমএম ডিভাইসগুলির কোন সিম নেই, জিএসএম ডিভাইস নেই, কোনও গুগল একাউন্ট যোগ করা হয়নি, নাকি বিমান মোডে যেকোন ডিভাইসের সাথে পরীক্ষা করার সুযোগ আমার নেই।

তাই যদি আপনি নিজে ডিভাইসটিতে অনন্য কিছু চান, TM.getDeviceId() যথেষ্ট হওয়া উচিত । স্পষ্টতই কিছু ব্যবহারকারী অন্যদের চেয়ে বেশি প্যারানোড হয়, তাই এটি এই সনাক্তকারীগুলির 1 বা তার বেশি হ্যাশের জন্য উপকারী হতে পারে, যাতে স্ট্রিংটি ডিভাইসের জন্য কার্যত অনন্য তবে এটি ব্যবহারকারীর প্রকৃত ডিভাইসটিকে স্পষ্টভাবে সনাক্ত করে না। উদাহরণস্বরূপ, String.hashCode() ব্যবহার করে, একটি UUID দ্বারা মিলিত:

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;

অ্যানড্রইড ডিভাইস ম্যাক আইডি এছাড়াও একটি অনন্য আইডি, ম্যাক আইডি পেতে নিম্নলিখিত কোড ব্যবহার করে আমরা ডিভাইস নিজেই বিন্যাস যদি অনুমান করা হবে না।

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
String address = info.getMacAddress();

এছাড়াও আপনার AndroidManifest.xml এ উপযুক্ত অনুমতি যুক্ত করতে ভুলবেন না

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

আমি মনে করি এটি একটি অনন্য আইডি জন্য একটি কঙ্কাল নির্মাণের অগ্নি উপায় ... এটা চেক আউট।

ছদ্ম-অনন্য আইডি, যা সমস্ত Android ডিভাইসগুলিতে কাজ করে, কিছু ডিভাইসগুলিতে ফোন থাকে না (যেমন ট্যাবলেট) বা কোন কারণে, আপনি READ_PHONE_STATE অনুমতিটি অন্তর্ভুক্ত করতে চান না। আপনি এখনও রম সংস্করণ, কারিগর নাম, সিপিইউ টাইপ, এবং অন্যান্য হার্ডওয়্যার বিশদগুলির মতো বিশদ পড়তে পারেন, যদি আপনি সিরিয়াল কী চেকের জন্য আইডি ব্যবহার করতে চান, বা অন্যান্য সাধারণ উদ্দেশ্যে উপযুক্ত হবেন। এইভাবে গণনা করা আইডিটি অনন্য হবে না: একই আইডি (একই হার্ডওয়্যার এবং রম চিত্রের উপর ভিত্তি করে) দুটি ডিভাইস খুঁজে পাওয়া সম্ভব তবে বাস্তব-বিশ্বের অ্যাপ্লিকেশনগুলিতে পরিবর্তনগুলি নগণ্য। এই উদ্দেশ্যে আপনি বিল্ড ক্লাস ব্যবহার করতে পারেন:

String m_szDevIDShort = "35" + //we make this look like a valid IMEI
            Build.BOARD.length()%10+ Build.BRAND.length()%10 +
            Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
            Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
            Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
            Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
            Build.TAGS.length()%10 + Build.TYPE.length()%10 +
            Build.USER.length()%10 ; //13 digits

বিল্ড সদস্যদের অধিকাংশই স্ট্রিং, আমরা এখানে যা করছি তা তাদের দৈর্ঘ্য নিতে এবং একটি সংখ্যার মধ্যে মোডুলোর মাধ্যমে এটি রূপান্তর করা। আমাদের 13 টি সংখ্যা রয়েছে এবং আমরা আরও (35) সামনে আরও আইডিইআই (15 ডিজিট) হিসাবে একই আকারের আইডি যুক্ত করছি। এখানে অন্যান্য সম্ভাবনার ভাল আছে, শুধু এই স্ট্রিং একটি চেহারা আছে। মত কিছু ফেরত 355715565309247। কোন বিশেষ অনুমতি প্রয়োজন, এই পদ্ধতির খুব সুবিধাজনক করা।

(অতিরিক্ত তথ্য: উপরে দেওয়া কৌশল here একটি নিবন্ধ থেকে অনুলিপি করা হয়েছে ।)


একটি নির্দিষ্ট Android ডিভাইসের হার্ডওয়্যার স্বীকৃতির জন্য আপনি MAC ঠিকানাগুলি পরীক্ষা করতে পারেন।

আপনি যে ভাবে এটি করতে পারেন:

AndroidManifest.xml এ

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

এখন আপনার কোডে:

List<NetworkInterface> interfacesList = Collections.list(NetworkInterface.getNetworkInterfaces());

for (NetworkInterface interface : interfacesList) {
   // This will give you the interface MAC ADDRESS
   interface.getHardwareAddress();
}

প্রতিটি অ্যান্ড্রয়েড ডিভাইসে তাদের অন্তত একটি "wlan0" ইন্টারফেস জাদুকরী WI-FI চিপ। এই কোডটি যখন Wi-Fi চালু থাকে না তখনও কাজ করে।

পিএস তাদের অন্যান্য ইন্টারফেসের গুচ্ছ যা আপনাকে এমএসিএস সম্বলিত তালিকা থেকে পেতে হবে তবে এটি ফোনের মধ্যে পরিবর্তন করতে পারে।


এখানে আমি অনন্য আইডি তৈরি করছি:

import android.Manifest.permission;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.util.Log;

// TODO : hash
public final class DeviceIdentifier {

    private DeviceIdentifier() {}

    /** @see http://code.google.com/p/android/issues/detail?id=10603 */
    private static final String ANDROID_ID_BUG_MSG = "The device suffers from "
        + "the Android ID bug - its ID is the emulator ID : "
        + IDs.BUGGY_ANDROID_ID;
    private static volatile String uuid; // volatile needed - see EJ item 71
    // need lazy initialization to get a context

    /**
     * Returns a unique identifier for this device. The first (in the order the
     * enums constants as defined in the IDs enum) non null identifier is
     * returned or a DeviceIDException is thrown. A DeviceIDException is also
     * thrown if ignoreBuggyAndroidID is false and the device has the Android ID
     * bug
     *
     * @param ctx
     *            an Android constant (to retrieve system services)
     * @param ignoreBuggyAndroidID
     *            if false, on a device with the android ID bug, the buggy
     *            android ID is not returned instead a DeviceIDException is
     *            thrown
     * @return a *device* ID - null is never returned, instead a
     *         DeviceIDException is thrown
     * @throws DeviceIDException
     *             if none of the enum methods manages to return a device ID
     */
    public static String getDeviceIdentifier(Context ctx,
            boolean ignoreBuggyAndroidID) throws DeviceIDException {
        String result = uuid;
        if (result == null) {
            synchronized (DeviceIdentifier.class) {
                result = uuid;
                if (result == null) {
                    for (IDs id : IDs.values()) {
                        try {
                            result = uuid = id.getId(ctx);
                        } catch (DeviceIDNotUniqueException e) {
                            if (!ignoreBuggyAndroidID)
                                throw new DeviceIDException(e);
                        }
                        if (result != null) return result;
                    }
                    throw new DeviceIDException();
                }
            }
        }
        return result;
    }

    private static enum IDs {
        TELEPHONY_ID {

            @Override
            String getId(Context ctx) {
                // TODO : add a SIM based mechanism ? tm.getSimSerialNumber();
                final TelephonyManager tm = (TelephonyManager) ctx
                        .getSystemService(Context.TELEPHONY_SERVICE);
                if (tm == null) {
                    w("Telephony Manager not available");
                    return null;
                }
                assertPermission(ctx, permission.READ_PHONE_STATE);
                return tm.getDeviceId();
            }
        },
        ANDROID_ID {

            @Override
            String getId(Context ctx) throws DeviceIDException {
                // no permission needed !
                final String andoidId = Secure.getString(
                    ctx.getContentResolver(),
                    android.provider.Settings.Secure.ANDROID_ID);
                if (BUGGY_ANDROID_ID.equals(andoidId)) {
                    e(ANDROID_ID_BUG_MSG);
                    throw new DeviceIDNotUniqueException();
                }
                return andoidId;
            }
        },
        WIFI_MAC {

            @Override
            String getId(Context ctx) {
                WifiManager wm = (WifiManager) ctx
                        .getSystemService(Context.WIFI_SERVICE);
                if (wm == null) {
                    w("Wifi Manager not available");
                    return null;
                }
                assertPermission(ctx, permission.ACCESS_WIFI_STATE); // I guess
                // getMacAddress() has no java doc !!!
                return wm.getConnectionInfo().getMacAddress();
            }
        },
        BLUETOOTH_MAC {

            @Override
            String getId(Context ctx) {
                BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
                if (ba == null) {
                    w("Bluetooth Adapter not available");
                    return null;
                }
                assertPermission(ctx, permission.BLUETOOTH);
                return ba.getAddress();
            }
        }
        // TODO PSEUDO_ID
        // http://www.pocketmagic.net/2011/02/android-unique-device-id/
        ;

        static final String BUGGY_ANDROID_ID = "9774d56d682e549c";
        private final static String TAG = IDs.class.getSimpleName();

        abstract String getId(Context ctx) throws DeviceIDException;

        private static void w(String msg) {
            Log.w(TAG, msg);
        }

        private static void e(String msg) {
            Log.e(TAG, msg);
        }
    }

    private static void assertPermission(Context ctx, String perm) {
        final int checkPermission = ctx.getPackageManager().checkPermission(
            perm, ctx.getPackageName());
        if (checkPermission != PackageManager.PERMISSION_GRANTED) {
            throw new SecurityException("Permission " + perm + " is required");
        }
    }

    // =========================================================================
    // Exceptions
    // =========================================================================
    public static class DeviceIDException extends Exception {

        private static final long serialVersionUID = -8083699995384519417L;
        private static final String NO_ANDROID_ID = "Could not retrieve a "
            + "device ID";

        public DeviceIDException(Throwable throwable) {
            super(NO_ANDROID_ID, throwable);
        }

        public DeviceIDException(String detailMessage) {
            super(detailMessage);
        }

        public DeviceIDException() {
            super(NO_ANDROID_ID);
        }
    }

    public static final class DeviceIDNotUniqueException extends
            DeviceIDException {

        private static final long serialVersionUID = -8940090896069484955L;

        public DeviceIDNotUniqueException() {
            super(ANDROID_ID_BUG_MSG);
        }
    }
}

নিচের কোডটি ব্যবহার করে, আপনি একটি স্ট্রিং হিসাবে একটি Android OS ডিভাইসের অনন্য ডিভাইস আইডি পেতে পারেন।

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

অন্য উপায় /sys/class/android_usb/android0/iSerialকোন অনুমতি ছাড়া একটি অ্যাপ্লিকেশন ব্যবহার করা হয়।

[email protected]:~$ adb shell ls -l /sys/class/android_usb/android0/iSerial
-rw-r--r-- root     root         4096 2013-01-10 21:08 iSerial
[email protected]:~$ adb shell cat /sys/class/android_usb/android0/iSerial
0A3CXXXXXXXXXX5

জাভাতে এটি করার জন্য কেবল একটি ফাইল ইনপুট স্ট্রীম ব্যবহার করে iSerial ফাইলটি খুলতে এবং অক্ষরগুলি পড়তে হবে। শুধু আপনি একটি ব্যতিক্রম হ্যান্ডলার এটি মোড়ানো নিশ্চিত করুন, কারণ সব ডিভাইসে এই ফাইল আছে।

কমপক্ষে নিম্নলিখিত ডিভাইসগুলি এই ফাইলটিকে বিশ্ব-পাঠযোগ্য বলে পরিচিত:

  • গ্যালাক্সি নেক্সাস
  • নেক্সাস এস
  • মটোরোলা জুম 3 জি
  • তোশিবা এটি 300
  • এইচটিসি ওয়ান ভি
  • মিনি MK802
  • স্যামসাং গ্যালাক্সি এস ২

এছাড়াও আপনি আমার ব্লগ পোস্টটি অ্যানড্রাইভ করা অ্যাপ্লিকেশানগুলিতে Android হার্ডওয়্যার সিরিয়াল নম্বরটি লিক করে দেখতে পারেন যেখানে আমি তথ্যগুলির জন্য অন্যান্য ফাইলগুলি কী আলোচনা করব তা আলোচনা করব।


আমি IMEIনিরাপদ পেতে বা ব্যবহার করার জন্য নিম্নলিখিত কোড ব্যবহার করুন। ANDROID_IDবিকল্প হিসাবে, ডিভাইসের ফোন ক্ষমতা নেই যখন:

String identifier = null;
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE));
if (tm != null)
      identifier = tm.getDeviceId();
if (identifier == null || identifier .length() == 0)
      identifier = Secure.getString(activity.getContentResolver(),Secure.ANDROID_ID);

আরো বিশেষভাবে Settings.Secure.ANDROID_ID,। এটি 64-বিট পরিমাণ যা ডিভাইসটি প্রথম বুট করার সময় তৈরি এবং সংরক্ষণ করা হয়। ডিভাইস মুছে ফেলা হয় যখন এটি রিসেট করা হয়।

ANDROID_IDএকটি অনন্য ডিভাইস সনাক্তকারী জন্য একটি ভাল পছন্দ মনে হয়। ডাউনসাইডগুলি রয়েছে: প্রথমত, 2.2 এর আগে Android এর প্রকাশের ক্ষেত্রে এটি 100% নির্ভরযোগ্য নয়। (“Froyo”).এছাড়াও, একটি প্রধান নির্মাতার জনপ্রিয় হ্যান্ডসেটে অন্তত একটি ব্যাপকভাবে পরিলক্ষিত বাগ রয়েছে, যেখানে প্রতিটি দৃষ্টান্ত একই অ্যান্ড্রয়েড_আইডি রয়েছে।


এখানে 30+ উত্তর আছে এবং কিছু একই এবং কিছু অনন্য। এই উত্তর কয়েক উত্তর উপর ভিত্তি করে। তাদের মধ্যে একজন @ লেন ডলিং এর উত্তর।

এটি 3 আইডি সংহত করে এবং একটি 32-ডিজিট হেক্স স্ট্রিং তৈরি করে। এটা আমার জন্য খুব ভাল কাজ করেছে।

3 আইডিগুলি হল:
ছদ্ম-আইডি - এটি প্রকৃত ডিভাইসের নির্দিষ্টকরণের ভিত্তিতে তৈরি হয়
ANDROID_ID - Settings.Secure.ANDROID_ID
Bluetooth ঠিকানা - Bluetooth অ্যাডাপ্টারের ঠিকানা

এটি এমন কিছু ফেরত দেবে: 551F27C060712A72730B0A0F734064B1

দ্রষ্টব্য: আপনি সবসময় longIdস্ট্রিং আরও আইডি যোগ করতে পারেন । উদাহরণস্বরূপ, সিরিয়াল #। ওয়াইফাই অ্যাডাপ্টার ঠিকানা। আইএমইআই। এই ভাবে আপনি ডিভাইস প্রতি আরো অনন্য তৈরীর হয়।

@SuppressWarnings("deprecation")
@SuppressLint("HardwareIds")
public static String generateDeviceIdentifier(Context context) {

        String pseudoId = "35" +
                Build.BOARD.length() % 10 +
                Build.BRAND.length() % 10 +
                Build.CPU_ABI.length() % 10 +
                Build.DEVICE.length() % 10 +
                Build.DISPLAY.length() % 10 +
                Build.HOST.length() % 10 +
                Build.ID.length() % 10 +
                Build.MANUFACTURER.length() % 10 +
                Build.MODEL.length() % 10 +
                Build.PRODUCT.length() % 10 +
                Build.TAGS.length() % 10 +
                Build.TYPE.length() % 10 +
                Build.USER.length() % 10;

        String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);

        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        String btId = "";

        if (bluetoothAdapter != null) {
            btId = bluetoothAdapter.getAddress();
        }

        String longId = pseudoId + androidId + btId;

        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(longId.getBytes(), 0, longId.length());

            // get md5 bytes
            byte md5Bytes[] = messageDigest.digest();

            // creating a hex string
            String identifier = "";

            for (byte md5Byte : md5Bytes) {
                int b = (0xFF & md5Byte);

                // if it is a single digit, make sure it have 0 in front (proper padding)
                if (b <= 0xF) {
                    identifier += "0";
                }

                // add number to string
                identifier += Integer.toHexString(b);
            }

            // hex string to uppercase
            identifier = identifier.toUpperCase();
            return identifier;
        } catch (Exception e) {
            Log.e("TAG", e.toString());
        }
        return "";
}

কিভাবে IMEI সম্পর্কে । যে অ্যান্ড্রয়েড বা অন্যান্য মোবাইল ডিভাইসের জন্য অনন্য।


গুগল এখন একটি বিজ্ঞাপন আইডি আছে
এটি ব্যবহার করা যেতে পারে, তবে মনে রাখবেন যে:

বিজ্ঞাপন আইডি একটি ব্যবহারকারী নির্দিষ্ট, অনন্য, resettable আইডি

এবং

ব্যবহারকারীদের তাদের আইডেন্টিফায়ার পুনরায় সেট করতে বা Google Play অ্যাপ্লিকেশানগুলির মধ্যে আগ্রহ-ভিত্তিক বিজ্ঞাপনগুলি অনির্বাচন করতে সক্ষম করে।

যদিও এই আইডি পরিবর্তন হতে পারে, মনে হচ্ছে শীঘ্রই আমাদের কোনও পছন্দ নেই , এই আইডিটির উদ্দেশ্য উপর নির্ভর করে।

http://developer.android.com/google/play-services/id.html

কপি পেস্ট কোড এখানে

আছে HTH


নিম্নলিখিত কোড একটি লুকানো Android API ব্যবহার করে ডিভাইস সিরিয়াল নম্বর প্রদান করে। কিন্তু, এই কোডটি স্যামসাং গ্যালাক্সি ট্যাবটিতে কাজ করে না কারণ "ro.serialno" এই ডিভাইসে সেট করা নেই।

String serial = null;

try {
    Class<?> c = Class.forName("android.os.SystemProperties");
    Method get = c.getMethod("get", String.class);
    serial = (String) get.invoke(c, "ro.serialno");
}
catch (Exception ignored) {

}




uniqueidentifier