Secure.ANDROID_ID có duy nhất cho từng thiết bị không?


81

Tôi đang sử dụng cuộc gọi này:

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

Để nhận UID cho thiết bị. Tôi nghĩ rằng tôi đang nhận được cùng một ID từ nhiều thiết bị. Điều này có nên được không?

ID được đề cập là: 9774d56d682e549c và dường như có sự cố với một số thiết bị trả lại ID này http://code.google.com/p/android/issues/list?cursor=10603&updated=10603&ts=1295993403


Sau khi tra cứu ID được đề cập và thấy một chủ đề về nó, tôi chắc chắn. Lúc đầu, tôi nghĩ có thể thiết bị đang trả về null và tôi đã đặt nó làm mặc định ở đâu đó. Nhưng đây không phải là trường hợp. Tôi biết chắc rằng mình đang nhận được cùng một giá trị trên nhiều thiết bị.
FoamyGuy


Đối với những trường hợp nó không phải là duy nhất, hãy sử dụng thư viện này đi kèm với Identity.getDeviceId (context) .
caw

Câu trả lời:


47

Kiểm tra chủ đề này ,. Tuy nhiên, bạn nên cẩn thận vì nó được ghi là "có thể thay đổi khi khôi phục cài đặt gốc". Bạn có thể tự chịu rủi ro khi sử dụng và nó có thể dễ dàng thay đổi trên điện thoại đã root. Ngoài ra, có vẻ như một số nhà sản xuất đã gặp vấn đề với điện thoại của họ có chuỗi số trùng lặp . Tùy thuộc vào những gì bạn đang cố gắng làm, tôi có thể sẽ không sử dụng điều này làm UID.


19
thật tiếc khi việc triển khai ANDROID_ID quá ... khập khiễng! Đánh giá từ tài liệu của Google, mục đích là một ID lâu dài hơn: A 64-bit number (as a hex string) that is randomly generated on the device's first boot and should remain constant for the lifetime of the device
Ai đó ở đâu đó vào

3
Theo liên kết chủ đề này "Ngoài ra, đã có ít nhất một lỗi được quan sát rộng rãi trong một thiết bị cầm tay phổ biến của một nhà sản xuất lớn, trong đó mọi trường hợp đều có ANDROID_ID giống nhau." Tốt hơn không sử dụng nó
Muhammad Riyaz

2
Đó là từ năm 2011 trong Froyo. Bây giờ nó không liên quan.
Aubtin Samai

Điều gì về sao lưu / khôi phục thiết bị hoặc sao chép thiết bị? bất kỳ ý tưởng nào về cơ hội có ANDROID_ID giống nhau? tất nhiên giả sử thiết bị không được root.
FunkSoulBrother

39

Với Android O, hành vi của ANDROID_ID sẽ thay đổi. ANDROID_ID sẽ khác nhau trên mỗi ứng dụng cho mỗi người dùng trên điện thoại.

Lấy từ: https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html

ID Android

Trong O, Android ID (Settings.Secure.ANDROID_ID hoặc SSAID) có giá trị khác nhau cho từng ứng dụng và từng người dùng trên thiết bị. Thay vào đó, các nhà phát triển yêu cầu số nhận dạng phạm vi thiết bị nên sử dụng số nhận dạng có thể đặt lại, chẳng hạn như ID quảng cáo, giúp người dùng kiểm soát nhiều hơn. ID quảng cáo cũng cung cấp cài đặt hướng tới người dùng để giới hạn theo dõi quảng cáo.

Ngoài ra trong Android O:

  • Giá trị ANDROID_ID sẽ không thay đổi khi gỡ cài đặt / cài đặt lại gói, miễn là tên gói và khóa ký giống nhau. Các ứng dụng có thể dựa vào giá trị này để duy trì trạng thái qua các lần cài đặt lại.
  • Nếu một ứng dụng đã được cài đặt trên thiết bị chạy phiên bản Android cũ hơn, thì ID Android vẫn giữ nguyên khi thiết bị được cập nhật lên Android O, trừ khi ứng dụng được gỡ cài đặt và cài đặt lại.
  • Giá trị Android ID chỉ thay đổi nếu thiết bị được khôi phục cài đặt gốc hoặc nếu khóa ký xoay vòng giữa
    các sự kiện gỡ cài đặt và cài đặt lại.
  • Thay đổi này chỉ bắt buộc đối với các nhà sản xuất thiết bị giao hàng với các dịch vụ của Google Play và ID quảng cáo. Các nhà sản xuất thiết bị khác có thể cung cấp ID có thể đặt lại thay thế hoặc tiếp tục cung cấp ID ANDROID.

Cảm ơn. Tôi đang vò đầu bứt tóc để cố gắng tìm hiểu lý do tại sao tôi không nhận được quảng cáo thử nghiệm trong điện thoại của vợ bằng ID (md5'ed) được báo cáo bởi ID thiết bị và sau đó lý do tại sao điều này không khớp với giá trị được báo cáo thông qua lệnh cài đặt adb shell. .. Tôi đã nghĩ rằng tôi sắp phát điên.
ecv

15

Vì vậy, nếu bạn muốn một cái gì đó độc đáo cho chính thiết bị, TM.getDeviceId() chỉ nên đủ.

Đây là mã hiển thị cách lấy ID người quản lý điện thoại. ID thiết bị android mà bạn đang sử dụng có thể thay đổi trên cài đặt gốc và một số nhà sản xuất cũng gặp vấn đề trong việc cung cấp id duy nhất.

TelephonyManager tm = 
        (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String androidId = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
Log.d("ID", "Android ID: " + androidId);
Log.d("ID", "Device ID : " + tm.getDeviceId());

Đảm bảo nhận quyền TelephonyManagerbằng cách sử dụng

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

3
Có, sử dụng getDeviceId () cũng hoạt động. Nhưng bạn nên rất cẩn thận vì nó có thể trả về null. (Trên các thiết bị mà không có một 3g / modem điện thoại) Một sử dụng giải pháp tôi là để rơi trở lại trên mac-address của Wifi (trong đó tất nhiên cũng có thể là mất tích, nhưng thường không phải trên cùng một thiết bị)
vdstw

19
Yêu cầu sự READ_PHONE_STATEcho phép là khủng khiếp. Sử dụng ANDROID_IDthay thế.
dolmen

vâng, nó có thể trả về giá trị không trên các thiết bị không có 3g (rất nhiều trong số chúng trên thị trường), sau đó bạn nên sử dụng WiFi - hướng dẫn của nó cũng có thể là vô hiệu cho đến khi bạn bật / tắt nó ít nhất một lần sau khi thiết bị khởi động lại. Và nếu không có wifi thì ... ác mộng thật, trên windows ce đã có HƯỚNG DẪN cho từng thiết bị và cuộc sống thật tươi đẹp.
marcinj

Hóa ra sau hàng nghìn yêu cầu rằng ID thiết bị, là IMEI có thể bị sao chép trên các thiết bị giả mạo, do đó không phải là giải pháp chứng minh đầy đủ. Tôi đang hoàn nguyên để sử dụng getSimSerialNumber và ANDROID_ID làm dự phòng.
Ajibola

Android 10 (API cấp 29) bổ sung các hạn chế đối với các số nhận dạng không thể đặt lại, bao gồm cả IMEI và số sê-ri. Trước khi bạn triển khai TM.getDeviceId()phương pháp này, trước tiên hãy xem các yêu cầu quyền mới đối với số nhận dạng thiết bị trên thiết bị Android> = 10.
Ezekiel Sebastine,

6

Tôi đã đọc một vài điều về điều này và rất tiếc là ANDROID_ID không nên dựa vào để xác định duy nhất một thiết bị riêng lẻ.

Nó dường như không được thực thi trong các yêu cầu tuân thủ của Android và vì vậy các nhà sản xuất dường như triển khai nó theo cách họ chọn, bao gồm một số sử dụng nó nhiều hơn như một ID 'model', v.v.

Ngoài ra, hãy lưu ý rằng ngay cả khi nhà sản xuất đã viết một trình tạo để biến nó thành UUID (ví dụ), nó không được đảm bảo tồn tại sau khi khôi phục cài đặt gốc.


6
Tôi nghĩ rằng nó được đảm bảo KHÔNG tồn tại khi khôi phục cài đặt gốc theo thiết kế, nó được đề cập ở đâu đó trong tài liệu. Và đó là cách thực hiện đúng.
Violet Giraffe

Vậy làm cách nào để tạo GUID?
IgorGanapolsky

6

Có rất nhiều giải pháp tồn tại nhưng không có giải pháp nào hoàn hảo. chúng ta hãy đi từng người một.

1. Unique Telephony Number (IMEI, MEID, ESN, IMSI)

  • Giải pháp này cần yêu cầu android.permission.READ_PHONE_STATE cho người dùng của bạn. Điều này có thể khó xác minh sau loại ứng dụng bạn đã tạo.

  • Hơn nữa, giải pháp này được giới hạn cho điện thoại thông minh vì máy tính bảng không có dịch vụ điện thoại. Một ưu điểm là giá trị vẫn tồn tại khi khôi phục cài đặt gốc trên thiết bị.

2. MAC Address

  • Bạn cũng có thể thử lấy Địa chỉ MAC từ thiết bị có phần cứng Wi-Fi hoặc Bluetooth. Tuy nhiên, giải pháp này không được khuyến khích vì không phải thiết bị nào cũng có kết nối Wi-Fi. Ngay cả khi người dùng có kết nối Wi-Fi, nó vẫn phải được bật để truy xuất dữ liệu. Nếu không, cuộc gọi không báo cáo Địa chỉ MAC.

3. Serial Number

  • Các thiết bị không có dịch vụ điện thoại như máy tính bảng phải báo cáo một ID thiết bị duy nhất khả dụng qua android.os.Build.SERIAL kể từ Android 2.3 Gingerbread. Một số điện thoại có dịch vụ điện thoại cũng có thể xác định số sê-ri. Giống như không phải tất cả các thiết bị Android đều có Số sê-ri, giải pháp này không đáng tin cậy.

4. Secure Android ID

  • Trên thiết bị khởi động lần đầu, một giá trị ngẫu nhiên được tạo và lưu trữ. Giá trị này có sẵn qua Settings.Secure.ANDROID_ID. Đó là số 64-bit sẽ không đổi trong suốt thời gian hoạt động của thiết bị. ANDROID_ID có vẻ là một lựa chọn tốt cho một số nhận dạng thiết bị duy nhất vì nó có sẵn cho điện thoại thông minh và máy tính bảng.

    String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
    
  • Tuy nhiên, giá trị có thể thay đổi nếu thực hiện khôi phục cài đặt gốc trên thiết bị. Cũng có một lỗi đã biết với một thiết bị cầm tay phổ biến của một nhà sản xuất trong đó mọi phiên bản đều có ANDROID_ID giống nhau. Rõ ràng, giải pháp không đáng tin cậy 100%.

5. Use UUID

  • Vì yêu cầu đối với hầu hết các ứng dụng là xác định một cài đặt cụ thể chứ không phải thiết bị vật lý, một giải pháp tốt để lấy id duy nhất cho người dùng nếu sử dụng lớp UUID. Giải pháp sau đã được Reto Meier từ Google trình bày trong bản trình bày Google I / O:

    private static String uniqueID = null;
    private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    public synchronized static String id(Context context) {
       if (uniqueID == null) {
           SharedPreferences sharedPrefs = context.getSharedPreferences(
                   PREF_UNIQUE_ID, Context.MODE_PRIVATE);
           uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
           if (uniqueID == null) {
               uniqueID = UUID.randomUUID().toString();
               Editor editor = sharedPrefs.edit();
               editor.putString(PREF_UNIQUE_ID, uniqueID);
               editor.commit();
           }
       }    return uniqueID;
    }
    

Xác định một thiết bị cụ thể trên Android không phải là một điều dễ dàng. Có nhiều lý do chính đáng để tránh điều đó. Giải pháp tốt nhất có lẽ là xác định một cài đặt cụ thể bằng cách sử dụng giải pháp UUID. tín dụng: blog


1

Chỉ cần liệt kê một giải pháp thay thế tại đây, ID quảng cáo:

https://support.google.com/googleplay/android-developer/answer/6048248?hl=en

Đã sao chép từ liên kết trên:

ID quảng cáo là ID duy nhất, người dùng có thể đặt lại để quảng cáo, do các dịch vụ của Google Play cung cấp. Nó cho phép người dùng kiểm soát tốt hơn và cung cấp cho các nhà phát triển một hệ thống tiêu chuẩn, đơn giản để tiếp tục kiếm tiền từ ứng dụng của họ. Nó cho phép người dùng đặt lại giá trị nhận dạng của họ hoặc chọn không tham gia quảng cáo được cá nhân hóa (trước đây gọi là quảng cáo dựa trên sở thích) trong ứng dụng Google Play.

Những hạn chế là:

  1. Chỉ các thiết bị hỗ trợ Google Play.
  2. Chính sách bảo mật: https://support.google.com/googleplay/android-developer/answer/113469?hl=en&rd=1#privacy

Điều này có hoạt động đối với điện thoại không có Google Play (dịch vụ) không?
Max Waterman

Đây không phải là một GUID
IgorGanapolsky

0
//Fields
String myID;
int myversion = 0;


myversion = Integer.valueOf(android.os.Build.VERSION.SDK);
if (myversion < 23) {
        TelephonyManager mngr = (TelephonyManager) 
getSystemService(Context.TELEPHONY_SERVICE);
        myID= mngr.getDeviceId();
    }
    else
    {
        myID = 
Settings.Secure.getString(getApplicationContext().getContentResolver(), 
Settings.Secure.ANDROID_ID);
    }

Có, Secure.ANDROID_ID là duy nhất cho mỗi thiết bị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.