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


2750

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


38
আপনি যদি ব্যবহার করছেন তবে এই উত্তরটি এবং এই বাগটিANDROID_ID পড়তে ভুলবেন না ।
ধীররাজ ভেকাকোমা

2020-এ যদি আপনার কোনও সমাধানের প্রয়োজন হয় তবে আপনার 2020-এ অ্যান্ড্রয়েড শনাক্তকারীগুলি
নিকিতা কার্টিন

উত্তর:


2024

Settings.Secure#ANDROID_IDপ্রতিটি ব্যবহারকারীর 64-বিট হেক্স স্ট্রিংয়ের জন্য অ্যান্ড্রয়েড আইডিটিকে অনন্য হিসাবে ফিরিয়ে দেয় ।

import android.provider.Settings.Secure;

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

476
এটি কখনও কখনও নাল হিসাবে পরিচিত, এটি "ফ্যাক্টরি রিসেটের উপর পরিবর্তন করতে পারে" হিসাবে নথিভুক্ত। আপনার নিজের ঝুঁকিতে ব্যবহার করুন এবং এটি সহজেই কোনও মূলযুক্ত ফোনে পরিবর্তন করা যেতে পারে।
সেবা আলেকসেয়েভ


18
আমি মনে করি যে এ্যান্ড্রয়েড_আইডিটির প্রথম উত্তরে হ্যাশ ব্যবহার করা সম্পর্কে আমাদের যত্নবান হওয়া দরকার কারণ এটি অ্যাপ্লিকেশন প্রথম চালিত হওয়ার পরে সেট করা যায় না, পরে সেট করা যেতে পারে, এমনকি তত্ত্বের ক্ষেত্রেও পরিবর্তিত হতে পারে, তাই অনন্য আইডি পরিবর্তিত হতে পারে

46
এই সমাধানের সাথে বিশাল সীমাবদ্ধতা রয়েছে সে সম্পর্কে সচেতন হন: android-developers.blogspot.com/2011/03/…
এমএমবি

35
ANDROID_ID আর কোনও ডিভাইস স্বতন্ত্রভাবে সনাক্ত করে না (4.2 হিসাবে): স্ট্যাকওভারফ্লো.com
টম

1144

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

সম্পূর্ণ প্রকাশ: আমার অ্যাপটি নীচের পদ্ধতির মূলত ব্যবহার করেছে তবে এই পদ্ধতির আর ব্যবহার করে না এবং আমরা এখন অ্যান্ড্রয়েড বিকাশকারী ব্লগ এন্ট্রিতে বর্ণিত রূপটি ব্যবহার করি যা ইম্বির উত্তর লিঙ্কগুলিতে (যেমন, উত্পন্ন করা এবং সংরক্ষণ করা UUID#randomUUID()))


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

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

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

সুতরাং আপনি যদি ডিভাইসে নিজেই কিছু অনন্য চান তবে যথেষ্ট 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;

151
টেলিফোনি-ভিত্তিক আইডিটি ট্যাবলেট ডিভাইসে থাকবে না, তাই না?
সেবা আলেকসেয়েভ

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

31
কোড নমুনা দুর্দান্ত কাজ করে। <uses-permission android:name="android.permission.READ_PHONE_STATE" />ম্যানিফেস্ট ফাইলটিতে যুক্ত মনে রাখবেন । যদি কোনও ডাটাবেসে সঞ্চয় করে থাকে, প্রত্যাবর্তিত স্ট্রিংটি 36 অক্ষর দীর্ঘ।
রিচার্ড

10
এই সমাধানের সাথে বিশাল সীমাবদ্ধতা রয়েছে সে সম্পর্কে সচেতন হন: android-developers.blogspot.com/2011/03/…
এমএমবি

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

438

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


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

মূল ইস্যু: হার্ডওয়্যার বনাম সফটওয়্যার

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

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

সফটওয়্যার

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

অ্যান্ড্রয়েডের সাথে সামগ্রিকভাবে ব্রেকডাউন

- এপিআই> = 9/10 (অ্যান্ড্রয়েড ডিভাইসের 99.5%) এর স্বতন্ত্রতা (মূলযুক্ত ডিভাইসগুলি অন্তর্ভুক্ত) এর গ্যারান্টি দিন

- অতিরিক্ত অনুমতি নেই

স্যুয়েডো কোড:

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

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

else

return the 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" />
  • অ্যান্ড্রয়েড আইডি - হার্ডওয়্যার (নালার হতে পারে, কারখানার পুনরায় সেট করার পরে পরিবর্তন করতে পারে, একটি মূলের ডিভাইসে পরিবর্তন করা যেতে পারে)

    • যেহেতু এটি 'নাল' হতে পারে তাই আমরা 'নাল' পরীক্ষা করতে পারি এবং এর মান পরিবর্তন করতে পারি তবে এর অর্থ এটি আর অনন্য হবে না।
    • আপনার যদি কারখানার রিসেট ডিভাইস সহ কোনও ব্যবহারকারী থাকে তবে মূলের ডিভাইসে মানটি পরিবর্তিত বা পরিবর্তিত হতে পারে তাই আপনি যদি ব্যবহারকারীদের ইনস্টলগুলি ট্র্যাক করে থাকেন তবে সেখানে ডুপ্লিকেট এন্ট্রি থাকতে পারে।
  • ডাব্লুএলএএন ম্যাক ঠিকানা - হার্ডওয়্যার (প্রয়োজন 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 বা তার বেশি হয় তবে এটি 'বিল্ড.সিরিয়াল' ক্ষেত্রের কারণে অনন্য হওয়ার গ্যারান্টিযুক্ত।

মনে রাখবেন , আপনি প্রযুক্তিগতভাবে কেবল এপিআই <9 থাকা ব্যবহারকারীদের প্রায় 0.5% মিস করছেন । সুতরাং আপনি বিশ্রামের দিকে মনোনিবেশ করতে পারেন: এটি ব্যবহারকারীদের 99.5%!

এপিআই <9:

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

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

যদি সমস্ত কিছু ব্যর্থ হয়, যদি ব্যবহারকারীর এপিআই 9 এর চেয়ে কম (জিঞ্জারব্রেডের চেয়ে কম) থাকে, তাদের ডিভাইসটি পুনরায় সেট করে ফেলেছে বা 'সিকিউর। এখানেই সংঘর্ষ ঘটতে পারে।

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

  • ফ্যাক্টরি রিসেটের কারণে 'অ্যান্ড্রয়েড.এসইসিওরে_আইডি' সরানো হয়েছে কারণ মানটি পরিবর্তিত হতে পারে
  • API এ পরিবর্তন করার জন্য কোডটি সম্পাদনা করা হয়েছে
  • সিউডো পরিবর্তন হয়েছে

নীচের পদ্ধতিটি একবার দেখুন:

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

নতুন (বিজ্ঞাপন এবং গুগল প্লে পরিষেবা সহ অ্যাপ্লিকেশনগুলির জন্য):

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

আগস্ট 1 লা, 2014 থেকে শুরু করে, গুগল প্লে বিকাশকারী প্রোগ্রাম নীতিতে কোনও বিজ্ঞাপনের উদ্দেশ্যে অন্য ধ্রুবক শনাক্তকারীদের পরিবর্তে বিজ্ঞাপন আইডি ব্যবহার করার জন্য সমস্ত নতুন অ্যাপ আপলোড এবং আপডেটের প্রয়োজন requires আরও জানুন

বাস্তবায়ন :

অনুমতি:

<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/references/com/google/android/gms/ads/uthorfier/AdvertisingIdClient.html

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

গুগল প্লে পরিষেবাদি উপলব্ধ থাকাকালীন বিজ্ঞাপন আইডি অন্যান্য সনাক্তকারীদের বিদ্যমান ব্যবহারের (যেমন সেটিংসে ANDROID_ID ব্যবহারের ক্ষেত্রে.সিকিউর হিসাবে) সম্পূর্ণরূপে প্রতিস্থাপিত হয় intended গুগল প্লে পরিষেবাগুলি উপলভ্য নয় এমন কেসগুলি গুগলপ্লেসার্ভিসন নটঅভ্যালেবলএক্সেপশন getAdvertisingIdInfo () দ্বারা ছুঁড়ে ফেলা হচ্ছে by

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

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

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

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

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


তবে Buildওএস আপডেটের ভিত্তিতে ক্লাস পরিবর্তন হবে না ? বিশেষত যদি এপিআই আপডেট হয়? যদি তাই হয় তবে কীভাবে আপনি গ্যারান্টি দিচ্ছেন যে এটি অনন্য? (আপনি যে পদ্ধতিটি লিখেছেন সে সম্পর্কে কথা বলছেন)
লাকিমি

2
আমি মন্তব্য পাঠানোর জন্য আপনার অ্যাপ্লিকেশনটিতে আপনার পদ্ধতিটি ব্যবহার করেছি। আমার কাছে দুঃসংবাদ আছে. দুর্ভাগ্যক্রমে PsuedoID সম্পূর্ণ অনন্য নয়। আমার সার্ভার 5 আইডির জন্য 100 এর বেশি এবং প্রায় 30 আইডির জন্য 30 টিরও বেশি রেকর্ড করেছে। সর্বাধিক পুনরাবৃত্ত আইডি হ'ল 'ffffffff-fc8f-6093-ffff-ffffd8' (159 রেকর্ড) এবং 'ffffffff-fe99-b334-ffff-ffffef' (154 সময়)। সময় এবং মন্তব্যের ভিত্তিতে এটি সুস্পষ্ট যে বিভিন্ন লোক রয়েছে। এখন পর্যন্ত মোট রেকর্ড 10,000 কেন এটি ঘটেছে তা আমাকে জানান। ট্যাঙ্ক।
হোজ্জাত রেহানে

1
আমি এটি 1.5+ বছর আগে লিখেছি। কেন এটি আপনার পক্ষে অনন্য নয় তা আমি নিশ্চিত নই। আপনি বিজ্ঞাপন আইডি চেষ্টা করতে পারেন। যদি তা না হয় তবে আপনি নিজের সমাধান নিয়ে আসতে পারেন।
জ্যারেড বুরোজ

2
বাছাই করুন ... আপনি যদি প্রশ্নটি নিয়ে যান এবং এই বিষয়ে আপনার মতামত দেন তবে আমি সত্যিই প্রশংসা করব
দুরাই আমুথান।এইচ

1
@ ব্যবহারকারী 1587329 আপনাকে ধন্যবাদ। আমি এটি সবার কাছে আপডেট রাখার চেষ্টা করছি। হার্ডওয়্যার বনাম সফ্টওয়্যার এবং ক্রস প্ল্যাটফর্মের ক্ষেত্রে এই প্রশ্নটি জটিল।
জারেড বুরোজ

340

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

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

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

গুগলের সুপারিশগুলির ভিত্তিতে, আমি এমন একটি শ্রেণি প্রয়োগ করেছি যা প্রতিটি ডিভাইসের জন্য একটি অনন্য ইউআইডি উত্পন্ন করবে, যেখানে যথাযথভাবে টেলিফোনম্যানেজার.জেট ডেভিসআইডি () এ ফিরে আসা, এবং যথাযথভাবে বিকাশজনকভাবে উত্পন্ন অনন্য ইউআইডি-র অবলম্বন করে, বীজ হিসাবে ANDROID_ID ব্যবহার করে এটি অ্যাপ্লিকেশন পুনঃসূচনাগুলি জুড়ে রয়েছে (তবে অ্যাপ পুনরায় ইনস্টলেশনগুলি নয়)।

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

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

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

6
আপনার কি বিভিন্ন আইডি হ্যাশ করা উচিত নয় যাতে সেগুলি একই আকারের হয়? অতিরিক্তভাবে, দুর্ঘটনাক্রমে ব্যক্তিগত তথ্য প্রকাশ না করার জন্য আপনার ডিভাইস আইডি হ্যাশ করা উচিত।
স্টিভ পোমেরো

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

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

7
ভাল কথা, আমি ব্যবহারকারীদের ডিভাইস আইডির পরিবর্তে অ্যাপ্লিকেশন ইনস্টলেশন আইডির ব্যবহারের দৃ strongly় পরামর্শ দেওয়ার জন্য মন্তব্যটি আপডেট করেছি। যাইহোক, আমি মনে করি যে এই আইডলটি ইনস্টলেশন আইডির চেয়ে ডিভাইসের প্রয়োজন তাদের জন্য এখনও মূল্যবান।
ইম্বি

8
এ্যান্ড্রয়েড_আইডি কারখানার পুনরায় সেট করতে পরিবর্তন করতে পারে, তাই এটি ডিভাইসগুলিও সনাক্ত করতে পারে না
স্যামুয়েল

180

এই বছরটি গুগল আই / ও উপস্থাপনায় ব্যবহারকারীর জন্য একটি অনন্য আইডি পেতে রেটো মেয়ার ব্যবহার করেছে:

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

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


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

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

3
আনইনস্টল এবং পুনরায় ইনস্টল করার পরেও যদি আপনার অনন্য আইডি প্রয়োজন না থাকে তবে দুর্দান্ত বিকল্প (যেমন প্রচারমূলক ইভেন্ট / গেম যেখানে আপনি জয়ের তিনটি সুযোগ পাবেন, পিরিয়ড)।
কাইল Clegg

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

12
এটি কোনও আনইনস্টল বা ডেটা সাফ করার কাজ করবে না।
জন শেলি

106

এছাড়াও আপনি Wi-Fi অ্যাডাপ্টারের ম্যাক ঠিকানা বিবেচনা করতে পারেন। এইভাবে পুনরুদ্ধার করা:

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

android.permission.ACCESS_WIFI_STATEম্যানিফেস্টে অনুমতি প্রয়োজন ।

Wi-Fi সংযুক্ত না থাকলেও উপলব্ধ থাকার জন্য প্রতিবেদন করা হয়েছে। যদি উপরের উত্তর থেকে জো যদি তার অনেকগুলি ডিভাইসে এটি ব্যবহার করে দেখায় তবে খুব ভাল লাগবে।

কিছু ডিভাইসে, Wi-Fi বন্ধ থাকা অবস্থায় এটি উপলব্ধ থাকে না।

দ্রষ্টব্য: অ্যান্ড্রয়েড 6.x থেকে, এটি ধারাবাহিক জাল ম্যাক ঠিকানা ফেরত দেয়:02:00:00:00:00:00


8
এটি প্রয়োজনীয়android.permission.ACCESS_WIFI_STATE
ohhorob

5
আমি মনে করি আপনি অ্যান্ড্রয়েড ডিভাইসগুলিতে WiFi বন্ধ থাকা অবস্থায় এটি অনুপলব্ধ। ওয়াইফাই বন্ধ করা কার্নেল স্তরের ডিভাইসটি সরিয়ে দেয়।
ক্রিশডনে

12
@ সান্দ্রিয়া - আসুন আমরা এটির মুখোমুখি হব, একটি মূলী ডিভাইসে সমস্ত কিছুই ফাঁকি দেওয়া যায়।
ocodo

5
: অ্যাক্সেস ওয়াইফাই MAC ঠিকানা তে Android এম অবরোধ করা হয়েছে stackoverflow.com/questions/31329733/...
breez

6
অ্যান্ড্রয়েড 6.x থেকে এটি ধারাবাহিক জাল ম্যাক ঠিকানা ফেরত দেয়:02:00:00:00:00:00
বেহরোজ.এম

87

এখানে বরং দরকারী তথ্য আছে

এটি পাঁচটি পৃথক আইডি ধরণের:

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

2
গুরুত্বপূর্ণ পয়েন্টটি বাকি (এখানে এবং নিবন্ধে): আপনি ডাব্লুএলএএন বা বিটি ম্যাকটি চালু না করাতে পারবেন না! অন্যথায় আমি মনে করি যে ডাব্লুএলএএন ম্যাক নিখুঁত শনাক্তকারী হবে। আপনার কোনও গ্যারান্টি নেই যে ব্যবহারকারী কখনই তাদের Wi-Fi চালু করবে এবং আমি নিজেকে এটি চালু করা 'যথাযথ' বলে মনে করি না।
টম

1
@ আপনি ভুল করছেন আপনি ডাব্লুএলএএন বা বিটি ম্যাক বন্ধ থাকলেও আপনি এখনও পড়তে পারেন। তবে ডিভাইসটিতে ডাব্লুএলএএন বা বিটি মডিউল উপলব্ধ রয়েছে এমন কোনও গ্যারান্টি নেই।
মার্কস

2
উল্লেখযোগ্যভাবে, স্থানীয় ওয়াইফাই এবং ব্লুটুথ ম্যাক ঠিকানাগুলি আর উপলভ্য নয় aআউইফাইআইএনফো অবজেক্টের গেটম্যাকএড্রেস () পদ্ধতি এবং ব্লুটুথএডাপ্টার.সেট ডিফল্ট অ্যাডাপ্টার ()। গেটএড্রেস () পদ্ধতি উভয়ই ফিরে আসবে 02: 00: 00: 00: 00: 00
সারিকা কেট

4
@sarikakate এটি কেবলমাত্র 6.0 মার্শমেলো এবং তারপরেই সত্য ... এটি এখনও 6.0 মার্শমেলোর নীচে প্রত্যাশা অনুযায়ী কাজ করছে।
স্মিথ

@ স্মিত হ্যাঁ আপনি ঠিকই বলেছেন। আমি এটি উল্লেখ করতে ভুলে গেছি যে এটি 6.0 এর নীচে কাজ করছে
সারিকা কেট

51

অফিসিয়াল অ্যান্ড্রয়েড বিকাশকারী ব্লগের এখন ঠিক এই বিষয় সম্পর্কে একটি সম্পূর্ণ নিবন্ধ রয়েছে, অ্যাপ্লিকেশন ইনস্টলেশন সনাক্তকরণ


4
এবং এই যুক্তির মূল বিষয়টি হ'ল আপনি যদি হার্ডওয়্যারটির বাইরে কোনও অনন্য আইডি পাওয়ার চেষ্টা করছেন তবে আপনি সম্ভবত একটি ভুল করছেন।
টিম ব্রে

3
এবং যদি আপনি কোনও কারখানার পুনরায় সেট করে আপনার ডিভাইস-লকটিকে পুনরায় সেট করার অনুমতি দিচ্ছেন তবে আপনার ট্রায়ালওয়্যার মডেলটি মৃতের মতোই ভাল।
সেবা আলেকসেয়েভ

43

গুগল ইনপুট / আউটপুট Reto মায়ার এই যা ইনস্টলেশনের জুড়ে ব্যবহারকারীদের ট্র্যাক করতে সবচেয়ে ডেভেলপারদের চাহিদা পূরণ হবে কিভাবে কাছে একটি শক্তসমর্থ উত্তর মুক্তি। অ্যান্টনি নোলান তার উত্তরে দিকটি দেখায়, তবে আমি ভেবেছিলাম যে আমি সম্পূর্ণ পদ্ধতিটি লিখব যাতে অন্যেরা সহজেই এটি কীভাবে করতে পারে তা দেখতে (বিশদটি বের করতে আমার কিছুটা সময় লেগেছিল)।

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

পুরো পদ্ধতির মাধ্যমে চলুন। প্রথমত, আমাদের অ্যান্ড্রয়েড ব্যাকআপ পরিষেবাটি ব্যবহার করে আমাদের শেয়ারড প্রেফারেন্সগুলির জন্য একটি ব্যাকআপ তৈরি করতে হবে। এর মাধ্যমে আপনার অ্যাপ্লিকেশনটি নিবন্ধকরণ করে শুরু করুন http://developer.android.com/google/backup/signup.html

গুগল আপনাকে একটি ব্যাকআপ পরিষেবা কী দেবে যা আপনাকে ম্যানিফেস্টে যুক্ত করতে হবে। নীচে ব্যাকআপ এজেন্টটি ব্যবহার করতে আপনাকে অ্যাপ্লিকেশনটিও বলতে হবে:

<application android:label="MyApplication"
         android:backupAgent="MyBackupAgent">
    ...
    <meta-data android:name="com.google.android.backup.api_key"
        android:value="your_backup_service_key" />
</application>

তারপরে আপনাকে ব্যাকআপ এজেন্ট তৈরি করতে হবে এবং ভাগ্য সংখ্যার জন্য সহায়ক এজেন্টটি ব্যবহার করতে বলুন:

public class MyBackupAgent extends BackupAgentHelper {
    // The name of the SharedPreferences file
    static final String PREFS = "user_preferences";

    // A key to uniquely identify the set of backup data
    static final String PREFS_BACKUP_KEY = "prefs";

    // Allocate a helper and add it to the backup agent
    @Override
    public void onCreate() {
        SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this,          PREFS);
        addHelper(PREFS_BACKUP_KEY, helper);
    }
}

ব্যাকআপটি সম্পূর্ণ করতে আপনার মূল ক্রিয়াকলাপে আপনাকে ব্যাকআপ ম্যানেজারের একটি উদাহরণ তৈরি করতে হবে:

BackupManager backupManager = new BackupManager(context);

অবশেষে একটি ব্যবহারকারীর আইডি তৈরি করুন, যদি এটি ইতিমধ্যে বিদ্যমান না থাকে এবং এটিকে SharedPreferences এ সংরক্ষণ করুন:

  public static String getUserID(Context context) {
            private static String uniqueID = null;
        private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    if (uniqueID == null) {
        SharedPreferences sharedPrefs = context.getSharedPreferences(
                MyBackupAgent.PREFS, 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();

            //backup the changes
            BackupManager mBackupManager = new BackupManager(context);
            mBackupManager.dataChanged();
        }
    }

    return uniqueID;
}

এই ব্যবহারকারী_আইডি এখন ইনস্টলেশনগুলি জুড়ে অবিচল থাকবে, এমনকি যদি ব্যবহারকারী ডিভাইসটি সরায়।

এই পদ্ধতির আরও তথ্যের জন্য রেটোর আলাপ দেখুন

এবং কীভাবে ব্যাকআপ এজেন্টটি প্রয়োগ করতে হয় তার সম্পূর্ণ বিশদের জন্য ডেটা ব্যাকআপ দেখুন । আমি বিশেষত টেস্টিংয়ের নীচের অংশটিকে সুপারিশ করি কারণ ব্যাকআপটি তাত্ক্ষণিকভাবে ঘটে না এবং তাই আপনাকে ব্যাকআপটি জোর করতে হবে তা পরীক্ষা করতে।


5
যখন কোনও ব্যবহারকারীর একাধিক ডিভাইস থাকে তখন কি একই আইডি সহ একাধিক ডিভাইস নিয়ে যায় না? উদাহরণস্বরূপ একটি ট্যাবলেট এবং একটি ফোন।
তোসা

এর জন্য ন্যূনতম 8 টি লক্ষ্য প্রয়োজন।
17:44

অ্যাপ্লিকেশন কেনা করার সময় যাচাইকরণের পেডলোড তৈরি করার পক্ষে এটি কি পছন্দসই উপায়? ইন-অ্যাপ্লিকেশন বিলিং উদাহরণ কোড মন্তব্য থেকে: "সুতরাং একজন ভাল বিকাশকারী পে-লোডের এই বৈশিষ্ট্যগুলি রয়েছে: ১. যদি দুটি পৃথক ব্যবহারকারী কোনও আইটেম কিনে থাকেন তবে তাদের মধ্যে পে-লোড আলাদা হয়, যাতে একজন ব্যবহারকারীর ক্রয় অন্য ব্যবহারকারীর কাছে রিপ্লে করা যায় না। ২. পে-লোডটি অবশ্যই এমন হতে হবে যা আপনি ক্রয় প্রবাহের সূচনা করেছিলেন এমন অ্যাপ্লিকেশনটি না থাকলেও আপনি এটি যাচাই করতে পারবেন (যাতে ব্যবহারকারীরা একটি ডিভাইসে ক্রয় করা আইটেমগুলি ব্যবহারকারীর মালিকানাধীন অন্যান্য ডিভাইসে কাজ করে)।
টাচবোর্ডার

@ তোসা আমার ঠিক একই প্রশ্ন ছিল। তবে আমরা ভার্চুয়াল ডিভাইস আইডি তৈরি করতে আবার একই কৌশলটি ব্যবহার করতে পারি না এবং ঠিক সেইভাবে ব্যাক আপ করতে পারি না? ডিভাইস আইডিটি একটি মোছা বা পুনরায় ইনস্টল করার আগে চলবে না তবে আমাদের যদি ধারাবাহিক ব্যবহারকারীর আইডি থাকে তবে কোনও ডিভাইস আইডি থেকে আমাদের এটির বেশি প্রয়োজন হতে পারে না।
জয়হরলে

39

আমি মনে করি এটি অনন্য আইডির জন্য একটি কঙ্কাল তৈরির নিশ্চিত আগুনের উপায় ... এটি পরীক্ষা করে দেখুন।

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

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

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


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


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

21
আপনার উত্সগুলিকে আপনার ক্রেডিট দেওয়া উচিত ... এটি নিম্নলিখিত নিবন্ধের সাথে সরাসরি তুলে নেওয়া হয়েছে : ketmagic.net/?p=1662
স্টিভ হ্যালি

8
এই আইডিটি সংঘর্ষের জন্য উন্মুক্ত আপনি কী জানেন না। এটি একই ক্যারিয়ার থেকে অভিন্ন ডিভাইসে একই হওয়ার গ্যারান্টিযুক্ত।
সেবা আলেকসেয়েভ

7
ডিভাইসটি আপগ্রেড হলে এটিও পরিবর্তিত হতে পারে।
ডেভিড

8
খুব, খুব খারাপ সমাধান। দুটি নেক্সাস 5 এ পরীক্ষা করা হয়েছে ... একই সংখ্যাটি ফেরান।
সিনান ডিজদারেভিć

38

নিম্নলিখিত কোডটি একটি লুকানো অ্যান্ড্রয়েড API ব্যবহার করে ডিভাইস সিরিয়াল নম্বরটি দেয় returns তবে, এই কোডটি স্যামসং গ্যালাক্সি ট্যাবে কাজ করে না কারণ "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) {

}

আমি কেবল এক্সডিএ বিকাশকারীকে পড়েছি যেটি ro.serialnoউত্পন্ন করতে ব্যবহৃত হয় Settings.Secure.ANDROID_ID। সুতরাং তারা মূলত একই মানের বিভিন্ন উপস্থাপনা।
মার্টিন

@ মার্টিন: তবে সম্ভবত ডিভাইসটি পুনরায় সেট করার ক্ষেত্রে সিরিয়াল নম্বর পরিবর্তন হয় না। তাই না? এর জন্য কেবলমাত্র একটি নতুন মান ANDROID_ID
রনি

প্রকৃতপক্ষে সমস্ত ডিভাইসে আমি পরীক্ষা করেছি তারা যেখানে অভিন্ন। বা কমপক্ষে হ্যাশ মানগুলি যেখানে একই (গোপনীয়তার কারণে আমি লগ ফাইলগুলিতে প্রকৃত মান লিখি না)।
মার্টিন

এই মানটি হ'লandroid.os.Build.SERIAL
ইউজিনিেক

android.os.Build.SERIALঅ্যান্ড্রয়েড হে উঠিয়ে নেওয়া হবে দেখতে android-developers.googleblog.com/2017/04/...
EpicPandaForce

31

এটি একটি সাধারণ প্রশ্ন, কোনও সহজ উত্তর নেই।

আরও বেশি, এখানে বিদ্যমান সমস্ত উত্তরই পুরানো বা অবিশ্বাস্য whether

সুতরাং আপনি যদি 2020 সালে কোনও সমাধান অনুসন্ধান করছেন

এখানে কিছু বিষয় মনে রাখা উচিত:

সমস্ত হার্ডওয়্যার ভিত্তিক শনাক্তকারী (এসএসএআইডি, আইএমইআই, ম্যাক, ইত্যাদি) অ-গুগলের ডিভাইসগুলির জন্য অবিশ্বাস্য (পিক্সেল এবং নেক্সাস ব্যতীত সমস্ত কিছুই), যা বিশ্বব্যাপী সক্রিয় ডিভাইসের 50% এর বেশি। সুতরাং সরকারী অ্যান্ড্রয়েড শনাক্তকারী সেরা অনুশীলনগুলি পরিষ্কারভাবে বলে:

হার্ডওয়্যার শনাক্তকারী যেমন এসএসএআইডি (অ্যান্ড্রয়েড আইডি), আইএমইআই, ম্যাক ঠিকানা ইত্যাদি ব্যবহার করা থেকে বিরত থাকুন ...

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

উদাহরণ স্বরূপ CVE-2018-9489 যা উপরে উল্লিখিত সমস্ত ওয়াইফাই ভিত্তিক কৌশলকে প্রভাবিত করে।

এটি সেই শনাক্তকারীদের কেবল অবিশ্বাস্য নয়, অনেক ক্ষেত্রে অ্যাক্সেসযোগ্যও করে তোলে।

সুতরাং সহজ কথায়: এই কৌশলগুলি ব্যবহার করবেন না

এখানে আরও অনেক উত্তর এটি ব্যবহারের পরামর্শ দিচ্ছে AdvertisingIdClient, এটিও বেমানান, কারণ এটির নকশা অনুসারে কেবল বিজ্ঞাপনের প্রোফাইলিংয়ের জন্য ব্যবহার করা উচিত। এটি সরকারী রেফারেন্সেও বলা হয়েছে

ব্যবহারকারীর প্রোফাইলিং বা বিজ্ঞাপন ব্যবহারের ক্ষেত্রে কেবল একটি বিজ্ঞাপন আইডি ব্যবহার করুন

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

সুতরাং এটি ব্যবহার করবেন না

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

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

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

আপনার গ্রেডে সর্বশেষতম ফায়ারবেস -বার্তাপ্রেরণ নির্ভরতাFirebaseInstanceId যুক্ত করতে ব্যবহার করুন

implementation 'com.google.firebase:firebase-messaging:20.1.0'

এবং একটি পটভূমি থ্রেডে নীচের কোডটি ব্যবহার করুন:

String reliableIdentifier = FirebaseInstanceId.getInstance().getId();

আপনার যদি আপনার দূরবর্তী সার্ভারে ডিভাইস শনাক্তকরণ সংরক্ষণ করতে হয় তবে এটি (সরল পাঠ্য) মতো নয়, লবণযুক্ত একটি হ্যাশ সংরক্ষণ করুন

আজ এটি কেবল সেরা অনুশীলন নয়, আপনাকে অবশ্যই এটি জিডিপিআর অনুসারে আইন অনুসারে করতে হবে - শনাক্তকারী এবং অনুরূপ প্রবিধান।


3
আপাতত, এটি সেরা উত্তর, এবং প্রথম বাক্যটি সেরা সংক্ষিপ্তসার: "এটি একটি সহজ প্রশ্ন, একটি সহজ উত্তর ছাড়াই - কেবল এটি পছন্দ করুন
বি

কীভাবে সেই ব্যবহারের ক্ষেত্রে কীভাবে মোকাবেলা করা যায় সে সম্পর্কে কোনও উত্তর প্রদান না করে আপনাকে "পেমেন্ট জালিয়াতি প্রতিরোধ এবং টেলিফোনি বাদে" মন্তব্যটির প্রশংসা করতে হবে।
ইরান বউজজনাহ

@ ইরানউউদজানাহ সরকারী রেফারেন্স থেকে উক্তিটি, যা উত্তরে লিঙ্কযুক্ত। আমি সেই ব্যবহারের ক্ষেত্রে সমাধানের চেষ্টা করতে পারি, তবে যেহেতু এটি ওপি প্রশ্নের সাথে সুনির্দিষ্ট নয়, স্ট্যাকওভারফ্লোয়ের নীতি অনুসারে - এটি একটি পৃথক নিবেদিত প্রশ্নে করা উচিত।
নিকিতা কার্টিন

আমি শুধু বলছি যে উত্তরটি অসম্পূর্ণ। তবে আমি অবগত যে এটি আপনার দোষ নয় কারণ এটি একটি উদ্ধৃতি।
ইরান বউদজ্নাহ

1
@ এম। উসমান খান, এর ঠিক পরে উত্তরটি লেখা হয়েছে: " আজ এটি কেবল সেরা অনুশীলন নয়, আপনাকে অবশ্যই এটি জিডিপিআর - শনাক্তকারী এবং অনুরূপ বিধিবিধান অনুসারে আইন অনুসারে করতে হবে। "
নিকিতা কার্টিন

27

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

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

21

এপিআই স্তরের 9 (অ্যান্ড্রয়েড 2.3 - জিনজারড) এ শ্রেণিতে একটি সিরিয়াল ক্ষেত্র যুক্ত হয়েছিল Build। ডকুমেন্টেশন বলছে এটি হার্ডওয়্যার ক্রমিক সংখ্যাটি উপস্থাপন করে। সুতরাং এটি অনন্য হওয়া উচিত, যদি এটি ডিভাইসে বিদ্যমান থাকে।

যদিও এপিআই স্তর> = 9 সহ সমস্ত ডিভাইস এটি (= নাল নয়) সমর্থিত কিনা তা আমি জানি না।


2
দুর্ভাগ্যক্রমে, এটি "অজানা"।
m0skit0

18

একটি জিনিস আমি যুক্ত করব - আমার সেই অনন্য পরিস্থিতিতে একটি আছে।

ব্যবহার:

deviceId = Secure.getString(this.getContext().getContentResolver(), Secure.ANDROID_ID);

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

এটিকে "পকেট সাম্রাজ্য" খেলে আকর্ষণীয় করে তোলে যা আপনাকে "অনন্য" ডিভাইসআইডি ভিত্তিতে কারও অ্যাকাউন্টে তাত্ক্ষণিকভাবে অ্যাক্সেস দেয়।

আমার ডিভাইসে কোনও সেল রেডিও নেই।


আইডি কি? এটা কি পার্চেন্স 9774d56d682e549c?
মিস্টার_আর_ম্রি_ডিজ

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

কাজ করে। এছাড়াও, আমি যে আইডি থেকে র্যান্ডম ইউইউডি থেকে পাই তার চেয়ে অনেক বেশি কমপ্যাক্ট।
ট্রিওয়াল্লি

1
@ ট্রিওয়ালি এটি কাজ করে? আপনি কি বিভিন্ন অ্যাপ্লিকেশন থেকে একই ডিভাইস আইডি পেতে পারেন?
আর্নল্ড ব্রাউন

@ আর্নল্ডব্রাউন হ্যাঁ এটি ভালভাবে পরীক্ষা করে দেখতে ভুলবেন না। আপনার দিনটি
শুভ হোক

16

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

মনে হচ্ছে আপনার পক্ষে ইনস্টলেশনের সময় নিজেকে তৈরি করা এবং অ্যাপ্লিকেশনটি পুনরায় চালু করার সময় এটি পড়ার সর্বোত্তম উপায়।

আমি ব্যক্তিগতভাবে এটি গ্রহণযোগ্য তবে আদর্শ নই। অ্যান্ড্রয়েড সরবরাহিত কোনও শনাক্তকারী সব ক্ষেত্রেই কাজ করে না কারণ বেশিরভাগ ফোনের রেডিও স্টেটস (ওয়াই-ফাই অন / অফ, সেলুলার অন / অফ, ব্লুটুথ অন / অফ) এর উপর নির্ভরশীল। অন্যগুলি Settings.Secure.ANDROID_IDঅবশ্যই নির্মাতার দ্বারা প্রয়োগ করা উচিত এবং অনন্য হওয়ার গ্যারান্টিযুক্ত নয়।

নীচে একটি ইনস্টলেশন ফাইলটিতে ডেটা লেখার একটি উদাহরণ যা অ্যাপ্লিকেশন স্থানীয়ভাবে সংরক্ষণ করা অন্য যে কোনও ডেটা সহ সংরক্ষণ করা হবে।

public class Installation {
    private static String sID = null;
    private static final String INSTALLATION = "INSTALLATION";

    public synchronized static String id(Context context) {
        if (sID == null) {
            File installation = new File(context.getFilesDir(), INSTALLATION);
            try {
                if (!installation.exists())
                    writeInstallationFile(installation);
                sID = readInstallationFile(installation);
            } 
            catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return sID;
    }

    private static String readInstallationFile(File installation) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        byte[] bytes = new byte[(int) f.length()];
        f.readFully(bytes);
        f.close();
        return new String(bytes);
    }

    private static void writeInstallationFile(File installation) throws IOException {
        FileOutputStream out = new FileOutputStream(installation);
        String id = UUID.randomUUID().toString();
        out.write(id.getBytes());
        out.close();
    }
}

আপনি যদি অ্যাপ্লিকেশন ইনস্টলেশনগুলি ট্র্যাক করতে চান তবে এটি সঠিক। ডিভাইসগুলি ট্র্যাক করা যদিও অনেক কৌশলযুক্ত এবং কোনও সম্পূর্ণ বায়ু-আঁট সমাধান বলে মনে হয় না।
লুকা স্পিলার

মূলযুক্ত ডিভাইসগুলির কী হবে? তারা সহজেই এই ইনস্টলেশন আইডি পরিবর্তন করতে পারে, তাই না?
তসোমানিয়াক

একেবারে। রুট ইনস্টলেশন আইডি পরিবর্তন করতে পারে। আপনি এই কোড ব্লকটি ব্যবহার করে রুটের জন্য যাচাই করতে পারেন: stackoverflow.com/questions/1101380/…
কেভিন পার্কার

আমরা যদি কারখানাটি পুনরায় সেট করি তবে ফাইলটি মোছা হবে?
জামশিদ

যদি আপনি ফ্যাক্টরিটি পুনরায় সেট করে / ডেটা পার্টিশন মুছলে বা ফর্ম্যাট করেন তবে ইউআইডি আলাদা।
কেভিন পার্কার

12

ক্লাস ফাইলে কোডের নীচে যুক্ত করুন:

final TelephonyManager tm = (TelephonyManager) getBaseContext()
            .getSystemService(SplashActivity.TELEPHONY_SERVICE);
    final String tmDevice, tmSerial, androidId;
    tmDevice = "" + tm.getDeviceId();
    Log.v("DeviceIMEI", "" + tmDevice);
    tmSerial = "" + tm.getSimSerialNumber();
    Log.v("GSM devices Serial Number[simcard] ", "" + tmSerial);
    androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(),
            android.provider.Settings.Secure.ANDROID_ID);
    Log.v("androidId CDMA devices", "" + androidId);
    UUID deviceUuid = new UUID(androidId.hashCode(),
            ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode());
    String deviceId = deviceUuid.toString();
    Log.v("deviceIdUUID universally unique identifier", "" + deviceId);
    String deviceModelName = android.os.Build.MODEL;
    Log.v("Model Name", "" + deviceModelName);
    String deviceUSER = android.os.Build.USER;
    Log.v("Name USER", "" + deviceUSER);
    String devicePRODUCT = android.os.Build.PRODUCT;
    Log.v("PRODUCT", "" + devicePRODUCT);
    String deviceHARDWARE = android.os.Build.HARDWARE;
    Log.v("HARDWARE", "" + deviceHARDWARE);
    String deviceBRAND = android.os.Build.BRAND;
    Log.v("BRAND", "" + deviceBRAND);
    String myVersion = android.os.Build.VERSION.RELEASE;
    Log.v("VERSION.RELEASE", "" + myVersion);
    int sdkVersion = android.os.Build.VERSION.SDK_INT;
    Log.v("VERSION.SDK_INT", "" + sdkVersion);

AndroidManLive.xML এ যুক্ত করুন:

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

10

স্ট্রিং হিসাবে একটি অ্যান্ড্রয়েড ওএস ডিভাইসের অনন্য ডিভাইস আইডি, ব্যবহার 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);
}

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


9

বিভিন্ন ANDROID_IDবিষয়গুলি নিয়ে ( বিভিন্ন ক্ষেত্রে nullবা কোনও নির্দিষ্ট মডেলের ডিভাইস সর্বদা একই আইডি ফেরত আসতে পারে) কাজ করার জন্য বিভিন্ন বিষয়ে বিভিন্ন পদ্ধতি রয়েছে :

  • একটি কাস্টম আইডি জেনারেশন অ্যালগরিদম প্রয়োগ করা (ডিভাইসের বৈশিষ্ট্যগুলির ভিত্তিতে যা স্থির বলে মনে হয় এবং পরিবর্তিত হবে না -> কে জানে)
  • অন্যান্য আইডি যেমন আইএমইআই , সিরিয়াল নম্বর, ওয়াই-ফাই / ব্লুটুথ-ম্যাক ঠিকানা অপব্যবহার করে (তারা সমস্ত ডিভাইসে উপস্থিত থাকবে না বা অতিরিক্ত অনুমতিগুলি প্রয়োজনীয় হয়ে উঠবে)

আমি নিজেই অ্যান্ড্রয়েডের জন্য একটি বিদ্যমান ওপেনউডিআইডি প্রয়োগকরণ ( https://github.com/ylechelle/OpenUDID দেখুন ) ব্যবহার করতে পছন্দ করি ( https://github.com/vieux/OpenUDID দেখুন )। এটি সংহত করা সহজ এবং ANDROID_IDউপরে উল্লিখিত সমস্যাগুলির জন্য ফ্যালব্যাকগুলির সাথে ব্যবহার করে।


8

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


9
আমার ট্যাবলেটগুলির জন্য নয়, যেগুলিতে আমার মোবাইল ক্যারিয়ারের সাথে সংযুক্ত না হওয়ার কারণে কোনও আইএমইআই নেই।
ব্রিল প্যাপিন

2
আইডিইআইর পরিবর্তে ইএসএন রয়েছে এমন সিডিএমএ ডিভাইস উল্লেখ করবেন না।
ডেভিড

@ ডেভিড দেওয়া আছে অ্যান্ড্রয়েডের সাথে কোনও সিডিএমএ আছে?
এলজো ভালুগি 26'12

1
এটি কেবল এটিই করবে এটি একটি টেলিফোন :) একটি ট্যাবলেট নাও পারে।
ব্রিল প্যাপিন

3
@ এলজোভালুগি এটি ইতিমধ্যে "এই দিনগুলি" এবং এখনও সমস্ত ট্যাবলেটের সিম কার্ড নেই।
ম্যাথু কুইরোস

8

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

public static String getDeviceId(Context ctx)
{
    TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);

    String tmDevice = tm.getDeviceId();
    String androidId = Secure.getString(ctx.getContentResolver(), Secure.ANDROID_ID);
    String serial = null;
    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) serial = Build.SERIAL;

    if(tmDevice != null) return "01" + tmDevice;
    if(androidId != null) return "02" + androidId;
    if(serial != null) return "03" + serial;
    // other alternatives (i.e. Wi-Fi MAC, Bluetooth MAC, etc.)

    return null;
}

যদি আমরা 6.0 সংস্করণে রিডফোনস্টেট ব্যবহার করি রানটাইম অনুমতি চাইছে
হর্ষ

8

আমার দুটি সেন্ট - এনবি এটি কোনও ডিভাইসের (ত্রুটিযুক্ত) স্বতন্ত্র আইডির জন্য - অ্যান্ড্রয়েড বিকাশকারীদের ব্লগে আলোচিত ইনস্টলেশন হিসাবে নয় ।

নোট করুন যে @ এমএমবি দ্বারা প্রদত্ত সমাধানটি প্রতিটি অ্যাপ্লিকেশন আইডিতে ফিরে আসে কারণ SharedPreferences পুরো প্রক্রিয়া জুড়ে সিঙ্ক্রোনাইজ হয় না (দেখুন এখানে এবং এখানে )। সুতরাং আমি একেবারে এড়ানো।

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

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

8

এখানে 30+ উত্তর রয়েছে এবং কিছু একই এবং কিছু অনন্য। এই উত্তরটি সেই কয়েকটি উত্তরের ভিত্তিতে তৈরি। এর মধ্যে একটি হলেন @ লেন ডলিংয়ের উত্তর।

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

3 টি আইডি হ'ল
সিউডো-আইডি - এটি শারীরিক ডিভাইসের স্পেসিফিকেশনগুলির ভিত্তিতে উত্পন্ন হয়
ANDROID_ID - Settings.Secure.ANDROID_ID
ব্লুটুথ ঠিকানা - ব্লুটুথ অ্যাডাপ্টারের ঠিকানা

এটি এর মতো কিছু ফিরে আসবে: 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 "";
}

1
যোগ করার পদ্ধতি UUID করতে longId: এটা সবচেয়ে অনন্য শনাক্তকারী করতে হবে এবং একটি ফাইল এ সঞ্চয়,String uuid = UUID.randomUUID().toString();
মুসা Alfhaily

1
যদি সমস্ত কিছু ব্যর্থ হয়, যদি ব্যবহারকারীর এপিআই 9 এর চেয়ে কম (জিঞ্জারব্রেডের চেয়ে কম) থাকে তবে তাদের ফোন বা 'সিকিউর.অ্যান্ড্রয়েড_আইডি' রিসেট করেছে। যদি 'নাল' দেয়, তবে কেবল ফিরে আসা আইডি সম্পূর্ণরূপে তাদের অ্যান্ড্রয়েড ডিভাইসের তথ্য বন্ধ করে দেওয়া হবে। এখানেই সংঘর্ষ ঘটতে পারে। DISPLAY, হোস্ট বা আইডি ব্যবহার না করার চেষ্টা করুন - এই আইটেমগুলি পরিবর্তন হতে পারে। যদি সংঘর্ষ হয় তবে ওভারল্যাপিং ডেটা থাকবে। সূত্র: gist.github.com/pedja1/fe69e8a80ed505500caa
মৌসা আলফাইল

যদি আমরা কোডের এই লাইনের মাধ্যমে অনন্য নম্বর পাওয়ার চেষ্টা করি আমরা কি বলতে পারি যে এটি অনন্য আইডি এবং এটি অন্য কোনও ডিভাইসের সাথে কখনও বিরোধ করবে না?
নিনজা

1
@ নিনজা যেহেতু বিএলই ম্যাক ঠিকানাটি অনন্য, হ্যাঁ উত্পন্ন আইডি সর্বদা অনন্য থাকবে। তবে, আপনি যদি সত্যিই নিশ্চিত হতে চান তবে আমি একটি ইউআইইডি যুক্ত করার পরামর্শ দেব longIdString longId = pseudoId + androidId + btId + UUID.randomUUID().toString();এটির মতো একটি লাইন পরিবর্তন করুন: এটি গ্যারান্টি দেয় যে উত্পন্ন আইডিটি অনন্য হবে।
ᴛʜᴇᴘᴀᴛᴇʟ

@ this এই বিশাল সহায়তার জন্য আপনাকে অনেক ধন্যবাদ। আসলে আমার অ্যাপ্লিকেশনটি খুব সংবেদনশীল ডেটা তাই আমার এটি সম্পর্কে নিশ্চিত হওয়া দরকার যে কারণেই আমি কেবল এই জিনিসগুলি নিশ্চিত করছি।
নিনজা

7

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

user@creep:~$ adb shell ls -l /sys/class/android_usb/android0/iSerial
-rw-r--r-- root     root         4096 2013-01-10 21:08 iSerial
user@creep:~$ adb shell cat /sys/class/android_usb/android0/iSerial
0A3CXXXXXXXXXX5

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

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

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

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


আমি কেবল আপনার ব্লগ পোস্টটি পড়েছি। আমি বিশ্বাস করি যে এটি অনন্য নয়: বিল্ড.সিরিয়াল ডাব্লু / ও কোনও অনুমতি উপলব্ধ এবং এটি (তত্ত্ব অনুসারে) একটি অনন্য হার্ডওয়্যার সিরিয়াল নম্বর।
টম

1
তুমি ঠিক বলছো. এটি কেবলমাত্র আরও একটি উপায় যা আপনার ডিভাইসটিকে ট্র্যাক করা যায় এবং আপনি যেমন বলেছিলেন যে এই দুটি উপায়েই অ্যাপ্লিকেশন অনুমতিের প্রয়োজন নেই।
অনুমান 17

7

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

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

তবে আমি ব্যবহার করার পরামর্শ দিচ্ছি:

Settings.Secure.ANDROID_ID যে অনন্য 64 বিট হেক্স স্ট্রিং হিসেবে রিটার্ন অ্যান্ড্রয়েড আইডি।

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

কখনও কখনও টেলিফোনম্যাঙ্গার.গেট ডেভিসআইডি () নালাগুলি ফিরে আসবে, সুতরাং অনন্য আইডি নিশ্চিত করতে আপনি এই পদ্ধতিটি ব্যবহার করবেন:

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

আমি সম্প্রতি আবিষ্কার করেছি যে এসএম-জি 928 এফ / গ্যালাক্সি এস 6 প্রান্তের ধরণের ক্লায়েন্টের ডিভাইসটি অ্যান্ড্রয়েড আইডির জন্য 16 হেক্স ডিজিটের পরিবর্তে কেবল 15 সরবরাহ করে।
হোলার জাকবস

7

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

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

AndroidManLive.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 চালু না থাকা অবস্থায়ও এই কোডটি কাজ করে।

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


7

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

7

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

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


1
এই উত্তরটি পুরোনো Google ব্লগ থেকে copypaste হয় android-developers.googleblog.com/2011/03/... । তবুও বাগটি ইতিমধ্যে সমাধান হয়ে গেছে?
সের্গেই

7

অ্যান্ড্রয়েড ডিভাইসে উপলভ্য ইউনিক আইডি বুঝতে understand এই অফিসিয়াল গাইড ব্যবহার করুন।

অনন্য শনাক্তকারীদের জন্য সেরা অনুশীলন:

ডিভাইসগুলি যাচাই করতে আইএমইআই, ম্যাক ঠিকানা, ইনস্ট্যান্স আইডি, জিইউইডি, এসএসএআইডি, বিজ্ঞাপন আইডি, সুরক্ষা নেট এপিআই।

https://developer.android.com/training/articles/user-data-ids


6

গুগল ইনস্ট্যান্স আইডি

I / O 2015 এ প্রকাশিত; অ্যান্ড্রয়েডে প্লে পরিষেবাগুলি 7.5 প্রয়োজন।

https://developers.google.com/instance-id/
https://developers.google.com/instance-id/guides/android-implementation

InstanceID iid = InstanceID.getInstance( context );   // Google docs are wrong - this requires context
String id = iid.getId();  // blocking call

দেখে মনে হচ্ছে গুগল এই আইডিটির জন্য অ্যান্ড্রয়েড, ক্রোম এবং আইওএস জুড়ে ইনস্টলেশন সনাক্ত করতে ব্যবহৃত হবে nds

এটি বরং একটি ডিভাইস একটি ইনস্টলেশন চিহ্নিত করে, কিন্তু তারপরে আবার, ANDROID_ID (যা স্বীকৃত উত্তর) এখন আর ডিভাইসগুলি সনাক্ত করে না। এআরসি রানটাইমের সাহায্যে প্রতিটি ইনস্টলসের (নতুন বিবরণ এখানে ) নতুন আইড্রোর আইডির মতো একটি নতুন অ্যান্ড্রয়েড_আইডি তৈরি করা হয় । এছাড়াও, আমি মনে করি ইনস্টলেশনগুলি সনাক্তকরণ (ডিভাইস নয়) আমাদের অধিকাংশই সন্ধান করছে।

উদাহরণ আইডির সুবিধা

এটি আমার কাছে উপস্থিত হয়েছে যে গুগল এ উদ্দেশ্যে (আপনার স্থাপনাগুলি সনাক্তকরণের জন্য) এটি ব্যবহার করার ইচ্ছা নিয়েছে, এটি ক্রস-প্ল্যাটফর্ম এবং অন্যান্য কয়েকটি উদ্দেশ্যে ব্যবহার করা যেতে পারে (উপরের লিঙ্কগুলি দেখুন)।

আপনি যদি সিসিএম ব্যবহার করেন, তবে আপনাকে শেষ পর্যন্ত এই ইনস্ট্যান্স আইডিটি ব্যবহার করতে হবে কারণ জিসিএম টোকেন পাওয়ার জন্য আপনার এটি প্রয়োজন (যা পুরানো জিসিএম রেজিস্ট্রেশন আইডি প্রতিস্থাপন করে)।

অসুবিধাগুলি / সমস্যাগুলি

বর্তমান প্রয়োগে (জিপিএস .5.৫) আপনার অ্যাপ্লিকেশন এটির অনুরোধ করলে সার্ভার থেকে দৃষ্টান্ত আইডিটি পুনরুদ্ধার করা হয়। এর অর্থ হ'ল উপরের কলটি একটি ব্লকিং কল - আমার অবৈজ্ঞানিক পরীক্ষায় ডিভাইসটি অনলাইনে থাকলে ১-২ সেকেন্ড এবং অফ-লাইনে ০.০ - ১.০ সেকেন্ড সময় লাগে (সম্ভবত এটি ছেড়ে দেওয়ার এবং তৈরি করার আগে এটি কতক্ষণ অপেক্ষা করে এলোমেলো আইডি)। উত্তর আমেরিকাতে অ্যান্ড্রয়েড 5.1.1 এবং জিপিএস 7.5 সহ নেক্সাস 5 এ এটি পরীক্ষা করা হয়েছিল।

আপনি যদি উদ্দেশ্যটির উদ্দেশ্যে আইডিটি ব্যবহার করেন - যেমন। অ্যাপ্লিকেশন প্রমাণীকরণ, অ্যাপ্লিকেশন শনাক্তকরণ, জিসিএম - আমি মনে করি এই 1-3 সেকেন্ডটি উপদ্রব হতে পারে (অবশ্যই আপনার অ্যাপের উপর নির্ভর করে)।


1
উদাহরণস্বরূপের আরেকটি উল্লেখযোগ্য অবক্ষয় হ'ল যদি ব্যবহারকারী অ্যাপ্লিকেশনটির ডেটা সাফ করে দেয় তবে আপনার জন্য একটি নতুন ইনস্ট্যান্সআইডি তৈরি করা হবে।
ইডানকাভ

আকর্ষণীয়, তবে আমি মনে করি না এটি সত্যিই সম্ভাব্য ব্যবহারের কেসগুলিকে পরিবর্তন করে: অ্যান্ড্রয়েড_আইডি-এর মতো উদাহরণ আইডি কোনও ডিভাইস সনাক্ত করতে উপযুক্ত নয়। সুতরাং আপনার সার্ভারটি ব্যবহারকারীকে আপনার অ্যাপ্লিকেশন আনইনস্টল করা এবং পুনরায় ইনস্টল করার মতো ব্যবহারকারীর ক্লিয়ারিং ডেটা দেখতে পাবে - যা অযৌক্তিক নয়।
টম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.