অ্যান্ড্রয়েড ডিভাইসের সিরিয়াল নম্বরটি কীভাবে সন্ধান করবেন?


115

অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির জন্য আমার একটি অনন্য আইডি ব্যবহার করা দরকার এবং আমি ভেবেছিলাম যে ডিভাইসের ক্রমিক নম্বরটি ভাল প্রার্থী হবে। আমি কীভাবে আমার অ্যাপে অ্যান্ড্রয়েড ডিভাইসের ক্রমিক নম্বরটি পুনরুদ্ধার করব?


2
অ্যান্ড্রয়েড যুক্ত করতে ভুলবেন না: নাম = "android.permission.READ_PHONE_STATE" আপনার ম্যানিফেস্টে
মাইকেল সিলভিয়াস


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

উত্তর:


105
TelephonyManager tManager = (TelephonyManager)myActivity.getSystemService(Context.TELEPHONY_SERVICE);
String uid = tManager.getDeviceId();

গেটসিস্টেম সার্ভিস ক্রিয়াকলাপ শ্রেণীর একটি পদ্ধতি। ফোনটি কোন রেডিও ব্যবহার করে (জিএসএম বা সিডিএমএ) তার উপর নির্ভর করে ডিভাইসটির এমডিএন বা এমইআইডি ফেরত দেবে getDeviceID ()।

প্রতিটি ডিভাইস অবশ্যই এখানে একটি অনন্য মান প্রদান করবে (এটি একটি ফোন ধরে ধরে)। এটি সিম স্লট বা সিডিএমএ রেডিও সহ যে কোনও অ্যান্ড্রয়েড ডিভাইসের জন্য কাজ করা উচিত। আপনি সেই অ্যান্ড্রয়েড চালিত মাইক্রোওয়েভ ;-) দিয়ে নিজেরাই রয়েছেন;


@ হাশামাম এটি আমার পক্ষে কাজ করছে না, "ফোর্স ক্লোজ" ত্রুটি দিচ্ছে
পরেশ মায়ানি

23
@ ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.READ_PHONE_STATE"> অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলটিতে অনুমতি যুক্ত করার পরে @ হাসেম এখন তা ঠিকঠাক চলছে।
পরেশ মায়ানী

23
এই শনাক্তকারীটি ব্যবহার সম্পর্কে অফিসিয়াল অ্যান্ড্রয়েড বিকাশকারীদের ব্লগে কিছু পরামর্শ রয়েছে: android-developers.blogspot.com/2011/03/…
ডেভিড স্নাবেল-কাউন্ট

8
অ্যান্ড্রয়েড চালিত মাইক্রোওয়েভ বাদে অ্যান্ড্রয়েড চালিত ট্যাবলেট সম্পর্কে কী বলা যায়? :)
ajacian81

21
এই পদ্ধতিটি এড়ানো উচিত, এটি ফোনে কাজ করবে তবে ফোন চিপ ছাড়াই ডিভাইসগুলিতে কাজ করবে না (ট্যাবলেটগুলির একটি উদাহরণ রয়েছে)। ২.৩ থেকে আপনি android.os.Build.SERIAL ব্যবহার করতে পারেন তবে @ ডেভিডকন্ট প্রস্তাবিত বিকাশকারী ব্লগটি পরীক্ষা করে দেখুন।
জন মিচেল

71

ডেভ ওয়েবে যেমন উল্লেখ করেছেন, অ্যান্ড্রয়েড বিকাশকারী ব্লগের একটি নিবন্ধ রয়েছে যা এটি কভার করে।

আমি গুগলে কারও সাথে কিছু আইটেমের অতিরিক্ত স্পষ্টতা পেতে কথা বললাম। পূর্বোক্ত ব্লগ পোস্টে উল্লেখ করা হয়নি এমন আমি এখানে আবিষ্কার করেছি:

  • 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 static volatile 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;
    }
}

1
এটি ব্যবহারের জন্য কোনও অ্যাপ্লিকেশনটির কী অনুমতি প্রয়োজন?
ডেভ এল।

1
<ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.READ_PHONE_STATE"> << ব্যবহারকারীর>
গ্যাব্রিয়েল

1
: @ ef2011 এটা ডাবল চেক করা লক প্যাটার্ন এর en.wikipedia.org/wiki/Double-checked_locking
emmby

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

1
: "ANDROID_ID" পছন্দের সমাধান নোট করুন যে ANDROID_ID আর স্বতন্ত্র একটি ডিভাইস চিহ্নিত হয় "। Stackoverflow.com/a/13465373/150016
টম

32
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) {
}

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


7
এটি আমাকে অ্যান্ড্রয়েড.ওস.বিল্ড.সিরিয়াল
জোসেফাস

আমি কি ভুল করছি, বা কোনও নির্দিষ্ট কাস্টম রোমের সাথে সমস্ত ডিভাইসে এই সিরিয়াল নম্বরটি এক? আমার ডিভাইস সিরিয়াল নম্বর (একলিপস ডিভাইস লঞ্চারে) কাস্টম রম সহ একটি ফোনের জন্য 01234567890ABC দেখায়।
পিটারডকে

সায়ানোজেন -9 উভয় পদ্ধতির সাথে আমার ডিভাইসে @ পিটারড্ক (উত্তর হিসাবে এনডি -9 এর আগে এবং এন্ডি -9 থেকে সহজতর সহজলভ্য) রিপোর্ট করুন সঠিক এস / এন (প্রস্তুতকারকের স্টিকারের মতো) report যদিও এটি নির্দিষ্ট কাস্টম রম সংস্করণের উপর নির্ভর করে। আপনি কোন রম / সংস্করণ ব্যবহার করছেন?
মোরগওয়াই

16
String deviceId = Settings.System.getString(getContentResolver(),
                                Settings.System.ANDROID_ID);

যদিও, এটি গ্যারান্টিযুক্ত নয় যে অ্যান্ড্রয়েড আইডি একটি অনন্য সনাক্তকারী হবে।


@ পরেশ মায়ানী, কোড না দেখে কি সমস্যা হতে পারে তা বলা মুশকিল। আমার একমাত্র অনুমান যে getContentResolverফিরে আসছে null। যাইহোক, একটি প্রশ্ন খোলার এবং আপনার কোড পোস্ট করার সময় এটি মূল্যবান হতে পারে।
অ্যান্টনি ফোরলনি

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

14

নেই Android বিকাশকারী এর ব্লগ এই আলোচনা উপর একটি চমৎকার পোস্টের

এটি ব্যবহারের বিরুদ্ধে সুপারিশ করেছে TelephonyManager.getDeviceId()কারণ এটি অ্যান্ড্রয়েড ডিভাইসগুলিতে কাজ করে না যা ট্যাবলেটগুলির মতো ফোন নয়, এটির প্রয়োজনREAD_PHONE_STATE অনুমতি এবং এটি সমস্ত ফোনে নির্ভরযোগ্যভাবে কাজ করে না।

পরিবর্তে আপনি নিম্নলিখিতগুলির একটি ব্যবহার করতে পারেন:

  • ম্যাক ঠিকানা
  • ক্রমিক সংখ্যা
  • ANDROID_ID

পোস্টটিতে প্রতিটিের পক্ষে মতামত নিয়ে আলোচনা করা হয়েছে এবং এটি পড়ার পক্ষে মূল্যবান যাতে আপনার ব্যবহারের জন্য সবচেয়ে ভাল হবে তা আপনি কাজ করতে পারেন।


+1, হাই ডেভ, স্পষ্টতার জন্য থ্যাঙ্কস কারণ এখনই আমি ট্যাবলেটটির জন্য একটি অ্যাপ্লিকেশন বিকাশ করছি, যেখানে আমার অ্যান্ড্রয়েড ডিভাইসের ইউনিক আইডি থাকা দরকার, তাই ইউনিক অ্যান্ড্রয়েড ট্যাবলেট ডিভাইসটি পাওয়ার জন্য আমার কী ব্যবহার করা উচিত?
পরেশ মায়ানী

12

একটি সহজ সংখ্যা যে তার সারা জীবনের জন্য ডিভাইস এবং ধ্রুবক (ফ্যাক্টরি রিসেট ছাড়া বা হ্যাকিং) অনন্য জন্য ব্যবহার করুন Settings.Secure.ANDROID_ID

String id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

যদি উপলব্ধ থাকে এবং ডিভাইস সিরিয়াল নম্বরটি ("সিস্টেম সেটিংস / সম্পর্কে / স্থিতি" -এ প্রদর্শিত একটি) ব্যবহার করে এবং অ্যান্ড্রয়েড আইডিতে ফিরে যান:

String serialNumber = Build.SERIAL != Build.UNKNOWN ? Build.SERIAL : Secure.getString(getContentResolver(), Secure.ANDROID_ID);

সোজা উত্তর !!
faris faris

বিল্ড.সেরিয়াল জাভা
তে অবমূল্যায়ন করেছেন

7

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

আপনার কাছে কিছু বিকল্প রয়েছে যেমন: শ্রেণি সদস্য তৈরি করুন, বিটি ম্যাক, ডাব্লুএলএএন ম্যাক, বা আরও ভাল - এই সমস্তগুলির সংমিশ্রণ।

আমি আমার ব্লগে একটি নিবন্ধে এই বিবরণগুলি ব্যাখ্যা করেছি, দেখুন: http://www.pketmagic.net/?p=1662


6

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

কোডের আগে, 3 টি তথ্য:

  1. TelephonyManager.getDeviceId()(ওরফেআইএমআই) জিএসএম, থ্রিজি, এলটিই, ইত্যাদি ডিভাইসের জন্য ভাল বা মোটেও কাজ করবে না, তবে কোনও সিম সন্নিবেশ না করা থাকলেও বা কোনও সিম স্লট না থাকা অবস্থায়ও যখন সম্পর্কিত হার্ডওয়্যার উপস্থিত থাকে তখন সর্বদা একটি অনন্য আইডি ফিরিয়ে দেয় ( কিছু OEM এটি করেছে)।

  2. যেহেতু জিঞ্জারব্রেড (অ্যান্ড্রয়েড ২.৩) android.os.Build.SERIAL অবশ্যই এমন কোনও ডিভাইসে থাকতে হবে যা আইএমইআই সরবরাহ করে না , অর্থাৎ অ্যান্ড্রয়েড নীতি অনুসারে উল্লিখিত হার্ডওয়ার উপস্থিত নেই।

  3. সত্য (২) এর কারণে, এই দুটি অনন্য শনাক্তকারীদের মধ্যে কমপক্ষে একজন সর্বদা উপস্থিত থাকবেন এবং আইএমইআই একই সময়ে সিরিয়াল উপস্থিত থাকতে পারে।

দ্রষ্টব্য: বাস্তব (১.) এবং (২) গুগলের বিবৃতিগুলির উপর ভিত্তি করে

সমাধান

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

import java.lang.reflect.Method;

import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.Log;

public class IDManagement {

    public static String getCleartextID_SIMCHECK (Context mContext){
        String ret = "";

        TelephonyManager telMgr = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);

        if(isSIMAvailable(mContext,telMgr)){
            Log.i("DEVICE UNIQUE IDENTIFIER",telMgr.getDeviceId());
            return telMgr.getDeviceId();

        }
        else{
            Log.i("DEVICE UNIQUE IDENTIFIER", Settings.Secure.ANDROID_ID);

//          return Settings.Secure.ANDROID_ID;
            return android.os.Build.SERIAL;
        }
    }


    public static String getCleartextID_HARDCHECK (Context mContext){
        String ret = "";

        TelephonyManager telMgr = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        if(telMgr != null && hasTelephony(mContext)){           
            Log.i("DEVICE UNIQUE IDENTIFIER",telMgr.getDeviceId() + "");

            return telMgr.getDeviceId();    
        }
        else{
            Log.i("DEVICE UNIQUE IDENTIFIER", Settings.Secure.ANDROID_ID);

//          return Settings.Secure.ANDROID_ID;
            return android.os.Build.SERIAL;
        }
    }


    public static boolean isSIMAvailable(Context mContext, 
            TelephonyManager telMgr){

        int simState = telMgr.getSimState();

        switch (simState) {
        case TelephonyManager.SIM_STATE_ABSENT:
            return false;
        case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
            return false;
        case TelephonyManager.SIM_STATE_PIN_REQUIRED:
            return false;
        case TelephonyManager.SIM_STATE_PUK_REQUIRED:
            return false;
        case TelephonyManager.SIM_STATE_READY:
            return true;
        case TelephonyManager.SIM_STATE_UNKNOWN:
            return false;
        default:
            return false;
        }
    }

    static public boolean hasTelephony(Context mContext)
    {
        TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        if (tm == null)
            return false;

        //devices below are phones only
        if (Build.VERSION.SDK_INT < 5)
            return true;

        PackageManager pm = mContext.getPackageManager();

        if (pm == null)
            return false;

        boolean retval = false;
        try
        {
            Class<?> [] parameters = new Class[1];
            parameters[0] = String.class;
            Method method = pm.getClass().getMethod("hasSystemFeature", parameters);
            Object [] parm = new Object[1];
            parm[0] = "android.hardware.telephony";
            Object retValue = method.invoke(pm, parm);
            if (retValue instanceof Boolean)
                retval = ((Boolean) retValue).booleanValue();
            else
                retval = false;
        }
        catch (Exception e)
        {
            retval = false;
        }

        return retval;
    }


}

আমি ব্যবহার সম্পর্কে পরামর্শ চাই getCleartextID_HARDCHECK। প্রতিবিম্ব যদি আপনার পরিবেশে স্থায়ী না থাকে getCleartextID_SIMCHECKতবে তার পরিবর্তে পদ্ধতিটি ব্যবহার করুন তবে বিবেচনা করুন এটি আপনার নির্দিষ্ট সিম-উপস্থিতি প্রয়োজনের সাথে খাপ খাইয়ে নেওয়া উচিত।

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

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


5

উপরের সমস্ত পদ্ধতির সাথে সমস্যা আছে। গুগলে আই / ও রেটো মেয়ার কীভাবে এটি ব্যবহার করবেন তার একটি দৃ answer় জবাব প্রকাশ করেছেন যা বেশিরভাগ বিকাশকারীকে ইনস্টলেশনগুলির মাধ্যমে ব্যবহারকারীদের ট্র্যাক করতে হবে meet

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

সম্পূর্ণ পদ্ধতির মাধ্যমে যেতে দেয়। প্রথমে আমাদের অ্যান্ড্রয়েড ব্যাকআপ পরিষেবাটি ব্যবহার করে আমাদের শেয়ারড প্রেফারেন্সগুলির জন্য একটি ব্যাকআপ তৈরি করতে হবে। এই লিঙ্কটির মাধ্যমে আপনার অ্যাপ্লিকেশনটিকে নিবন্ধভুক্ত করে শুরু করুন: 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;
}

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

এই পদ্ধতির বিষয়ে আরও তথ্যের জন্য এখানে রেটোর আলাপ দেখুন http://www.google.com/events/io/2011/sessions/android-protips-advanced-topics-for-expert-android-app-developers.html

এবং ব্যাকআপ এজেন্ট কীভাবে প্রয়োগ করতে হয় তার সম্পূর্ণ বিশদের জন্য এখানে বিকাশকারী সাইটটি দেখুন: http://developer.android.com/guide/topics/data/backup.html আমি ব্যাকআপ যেমন করায় ততক্ষণে নীচের অংশটি সুপারিশ করি তাত্ক্ষণিকভাবে ঘটবে না এবং তাই পরীক্ষা করতে আপনাকে ব্যাকআপটি জোর করতে হবে।


2

অন্য উপায় হ'ল কোনও অনুমতি ছাড়াই একটি অ্যাপ্লিকেশনটিতে / 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

আপনি আমার ব্লগ পোস্টটি এখানে দেখতেও পাবেন: http://insitusec.blogspot.com/2013/01/leaking-android-hardware-serial-number.html যেখানে অন্যান্য ফাইলগুলি তথ্যের জন্য উপলব্ধ সেগুলি নিয়ে আমি আলোচনা করি।


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

1

যেমন @ হ্যাসারম্যান বলেছেন:

TelephonyManager tManager = (TelephonyManager)myActivity.getSystemService(Context.TELEPHONY_SERVICE);
String uid = tManager.getDeviceId();

তবে এটি মেনিফেস্ট ফাইলে অনুমতি সহ প্রয়োজনীয়:

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

1

স্ট্রিং হিসাবে অ্যান্ড্রয়েড ওএস ডিভাইসের অনন্য ডিভাইস আইডি।

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

তবে আমি গুগল দ্বারা প্রস্তাবিত এই পদ্ধতির কঠোরভাবে সুপারিশ করছি ::

অ্যাপ্লিকেশন ইনস্টলেশন সনাক্তকরণ


1

Build.SERIALসবচেয়ে সহজ উপায় হ'ল যদিও এটি পুরোপুরি নির্ভরযোগ্য নয় কারণ এটি খালি হতে পারে বা কখনও কখনও আপনি নিজের ডিভাইসের সেটিংসে যা দেখতে পারেন তার চেয়ে আলাদা মান ( প্রুফ 1 , প্রুফ 2 ) ফিরিয়ে আনতে পারে।

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

public static String getSerialNumber() {
    String serialNumber;

    try {
        Class<?> c = Class.forName("android.os.SystemProperties");
        Method get = c.getMethod("get", String.class);

        serialNumber = (String) get.invoke(c, "gsm.sn1");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ril.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ro.serialno");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "sys.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = Build.SERIAL;

        // If none of the methods above worked
        if (serialNumber.equals(""))
            serialNumber = null;
    } catch (Exception e) {
        e.printStackTrace();
        serialNumber = null;
    }

    return serialNumber;
}

0

আমি জানি এই প্রশ্নটি পুরানো তবে কোডের এক লাইনে এটি করা যেতে পারে

String deviceID = Build.SERIAL;


আফাইক, ডিভাইসের ওএস আপডেটের পরে এটি পরিবর্তিত হবে, উদাহরণস্বরূপ ৪.৪.২ থেকে ৪.৪.৪ বা যা কিছু হোক।
ডেন দ্রোবিয়াজকো

-1

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

আমি কোডটি আপডেট করেছি যাতে এটি কেবলমাত্র যদি প্রয়োজন হয় তবে এক্সএমএল ধরেই থাকে (যেমন এলোমেলোভাবে উত্পাদিত ইউআইডি ব্যবহার করার সময়) এবং @ ব্রিল প্যাপিনের উত্তর অনুসারে যুক্তিটি পুনঃসংশ্লিষ্ট:

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 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) || (androidId == null) ) {
                                final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();

                                if (deviceId != null)
                                {
                                    uuid = UUID.nameUUIDFromBytes(deviceId.getBytes("utf8"));
                                }
                                else
                                {
                                    uuid = UUID.randomUUID();

                                    // Write the value out to the prefs file so it persists
                                    prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString() ).commit();
                                }
                            }
                            else
                            {
                                uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));
                            } 
                        } catch (UnsupportedEncodingException e) {
                            throw new RuntimeException(e);
                        }



                    }

                }
            }
        }

    }


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

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

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

-2

হ্যাঁ. এটি একটি ডিভাইস হার্ডওয়্যার সিরিয়াল নম্বর এবং এটি অনন্য। সুতরাং এপিআই স্তরের ২.৩ এবং তারপরে আপনি এটি পেতে অ্যান্ড্রয়েড.ওস.বিল্ড.এন্ড্রোইড_আইডি ব্যবহার করতে পারেন । ২.৩ এপিআই স্তরের নীচে টেলিফোনম্যানেজ.জেট ডেভিসআইডি () ব্যবহার করুন ।

আপনি এটা পড়তে পারেন http://android-developers.blogspot.in/2011/03/identifying-app-installations.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.