كيفية استرداد معرف فريد لتحديد أجهزة Android؟

قد يحتاج بعض المطورين إلى معرف فريد لتحديد أجهزة Android. استخدم الحالات التي يحتاج فيها مطورو هذا المعرف الفريد إلى مضاعفات.

على سبيل المثال ، عندما تريد:

  • تحديد مستخدم Android لتخزين نتائج الألعاب على الخادم
  • تتبع تثبيت التطبيقات
  • توليد إدارة الحقوق الرقمية لحماية النسخ.

توجد العديد من الحلول ولكن لا يوجد حل مثالي. في هذا البرنامج التعليمي ، سنبحث خمسة حلول ونقدم عيوبها:

1. رقم الاتصال الهاتفي الفريد (IMEI ، MEID ، ESN ، IMSI)

إذا كنت تستهدف الهواتف الذكية فقط ، فيمكنك الاستفادة من حقيقة أن الجهاز يحتوي على خدمات الاتصال الهاتفي. لذا ، يمكنك بسهولة استرداد معرف فريد يحدد الجهاز.

يمكن أن يكون هذا المعرف الفريد IMEI أو MEID أو ESN أو IMSI. يمكن تعريفها على النحو التالي:

  • IMEI لهوية المعدات المتنقلة الدولية: الرقم الفريد لتحديد هواتف GSM و WCDMA وكذلك بعض الهواتف الساتلية
  • MEID لأجهزة تحديد هوية الأجهزة المحمولة: الرقم الفريد عالمياً الذي يحدد قطعة مادية من معدات محطة متنقلة CDMA ، تم إنشاء MEID ليحل محل ESNs (الرقم التسلسلي الإلكتروني)
  • ESN للرقم التسلسلي الإلكتروني: الرقم الفريد لتحديد هواتف CDMA المحمولة
  • IMSI (الهوية الدولية لمشترك الهاتف المحمول): التعريف الفريد المرتبط بجميع مستخدمي الهواتف المحمولة لشبكة GSM و UMTS

لاسترداد المعرف الفريد المرتبط بجهازك ، يمكنك استخدام الكود التالي:

استيراد android.telephony.TelephonyManager ؛
استيراد android.content.Context؛
// ...
TelephonyManager telephonyManager؛
telephonyManager = (TelephonyManager) getSystemService (السياق.
                    TELEPHONY_SERVICE)؛
/ *
* getDeviceId () بإرجاع معرف الجهاز الفريد.
* على سبيل المثال ، IMEI لـ GSM و MEID أو ESN لهواتف CDMA.
* /
String deviceId = telephonyManager.getDeviceId ()؛
/ *
* getSubscriberId () بإرجاع معرف المشترك الفريد ،
* على سبيل المثال ، IMSI لهاتف GSM.
* /
سلسلة المشترك = telephonyManager.getSubscriberId ()؛

يجب أن يطلب هذا الحل android.permission.READ_PHONE_STATE إلى المستخدم الخاص بك والذي قد يكون من الصعب تبريره بعد نوع التطبيق الذي قدمته.

علاوة على ذلك ، يقتصر هذا الحل على الهواتف الذكية لأن الأجهزة اللوحية لا تحتوي على خدمات الاتصال الهاتفي. ميزة واحدة هي أن القيمة باقية لإعادة ضبط المصنع على الأجهزة.

2. عنوان MAC

يمكنك أيضًا محاولة الحصول على عنوان MAC من جهاز به شبكة Wi-Fi أو Bluetooth. ولكن ، لا ينصح بهذا الحل لأنه لا يوجد في جميع الأجهزة اتصال Wi-Fi. حتى إذا كان لدى المستخدم اتصال Wi-Fi ، فيجب تشغيله لاسترداد البيانات. خلاف ذلك ، فإن المكالمة لا تبلغ عن عنوان MAC.

3. الرقم التسلسلي

يجب على الأجهزة التي لا تحتوي على خدمات الاتصال الهاتفي ، مثل الأجهزة اللوحية ، الإبلاغ عن معرف فريد للجهاز متاح عبر android.os.Build.SERIAL منذ Android 2.3 Gingerbread. يمكن لبعض الهواتف التي لديها خدمات الاتصال الهاتفي تحديد رقم تسلسلي. مثل ليس لجميع أجهزة Android رقم تسلسلي ، فإن هذا الحل غير موثوق.

4. تأمين معرف الروبوت

في التمهيد الأول للجهاز ، يتم إنشاء قيمة عشوائية وتخزينها. تتوفر هذه القيمة عبر Settings.Secure.ANDROID_ID. إنه رقم 64 بت يجب أن يظل ثابتًا طوال عمر الجهاز. يبدو ANDROID_ID خيارًا جيدًا لمعرف جهاز فريد لأنه متوفر للهواتف الذكية والأجهزة اللوحية. لاسترداد القيمة ، يمكنك استخدام الكود التالي:

سلسلة androidId = Settings.Secure.getString (getContentResolver () ،
                     Settings.Secure.ANDROID_ID)؛

ومع ذلك ، قد تتغير القيمة في حالة إجراء إعادة ضبط المصنع على الجهاز. يوجد أيضًا خطأ معروف بهاتف شائع من الشركة المصنعة حيث يكون لكل مثيل نفس ANDROID_ID. من الواضح أن الحل لا يمكن الاعتماد عليه بنسبة 100٪.

5. استخدام UUID

نظرًا لأن متطلبات معظم التطبيقات هي تحديد تثبيت معين وليس جهازًا فعليًا ، فإن الحل الجيد هو الحصول على معرف فريد للمستخدم إذا كان يجب استخدام فئة UUID. تم تقديم الحل التالي بواسطة Reto Meier من Google في عرض تقديمي I / O من Google:

سلسلة ثابتة خاصة uniqueID = خالية.
سلسلة ثابتة خاصة في السلسلة PREF_UNIQUE_ID = "PREF_UNIQUE_ID"؛
معرف السلسلة الساكنة المتزامنة العامة (سياق السياق) {
   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 ()؛
         محرر المحرر = sharedPrefs.edit () ؛
         editor.putString (PREF_UNIQUE_ID ، uniqueID) ؛
         editor.commit ()؛
      }
   }
    إرجاع uniqueID ؛
}

ينشئ أسلوب UUID.randomUUID () معرف فريد لتثبيت معين. يجب عليك فقط تخزين هذه القيمة وسيتم تحديد هوية المستخدم الخاص بك عند الإطلاق التالي لتطبيقك. يمكنك أيضًا محاولة ربط هذا الحل بخدمة Android Backup للحفاظ على المعلومات المتاحة للمستخدم حتى إذا قام بتثبيت التطبيق الخاص بك على جهاز آخر.

استنتاج

تحديد جهاز معين على Android ليس بالأمر السهل. هناك العديد من الأسباب الجيدة لتجنب ذلك. الحل الأفضل هو تحديد تثبيت معين باستخدام حل UUID. ومع ذلك ، إذا كنت تريد تحديد جهاز معين بشكل فعلي ماديًا ، يمكنك محاولة استخدام حل ANDROID_ID. ليست موثوقة 100 ٪ ولكن أفضل من الحلول الأخرى.