2013-06-11 23 views
10

Tôi đang phát triển một ứng dụng Android và tôi sẽ sử dụng thư viện LVL để kiểm tra giấy phép chơi google.android.Settings.Secure.ANDROID_ID

Sau khi đọc tài liệu LVL, tôi đã đọc rằng tôi phải lấy android.Settings.Secure.ANDROID_ID để làm mờ các phản hồi của Google Play.

Nhưng tôi cũng đã đọc rằng ANDROID_ID thu được từ TelephonyManager đôi khi giống nhau đối với các thiết bị khác nhau.

Trước tiên, nó không đáng tin cậy 100% đối với các bản phát hành Android trước 2.2 (“Froyo”). Ngoài ra, đã có ít nhất một lỗi được quan sát rộng rãi trong một chiếc điện thoại phổ biến từ một nhà sản xuất lớn, trong đó mỗi trường hợp có cùng ANDROID_ID

Điều đó có đúng không?

Cảm ơn

Trả lời

14

Hãy xem xét trường hợp của tôi:

Same serial number on several android devices. Adb is useless. How can I change the serial number?

Vì vậy, tôi did'nt giải quyết vấn đề với ADB nhưng để xác định một thiết bị Android của tôi sử dụng mã này (sử dụng getDeviceId(context)):

public static String getDeviceId(Context context) { 
    String id = getUniqueID(context); 
    if (id == null) 
     id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); 
    return id; 
} 

private static String getUniqueID(Context context) { 

    String telephonyDeviceId = "NoTelephonyId"; 
    String androidDeviceId = "NoAndroidId"; 

    // get telephony id 
    try { 
     final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
     telephonyDeviceId = tm.getDeviceId(); 
     if (telephonyDeviceId == null) { 
      telephonyDeviceId = "NoTelephonyId"; 
     } 
    } catch (Exception e) { 
    } 

    // get internal android device id 
    try { 
     androidDeviceId = android.provider.Settings.Secure.getString(context.getContentResolver(), 
       android.provider.Settings.Secure.ANDROID_ID); 
     if (androidDeviceId == null) { 
      androidDeviceId = "NoAndroidId"; 
     } 
    } catch (Exception e) { 

    } 

    // build up the uuid 
    try { 
     String id = getStringIntegerHexBlocks(androidDeviceId.hashCode()) 
       + "-" 
       + getStringIntegerHexBlocks(telephonyDeviceId.hashCode()); 

     return id; 
    } catch (Exception e) { 
     return "0000-0000-1111-1111"; 
    } 
} 

public static String getStringIntegerHexBlocks(int value) { 
    String result = ""; 
    String string = Integer.toHexString(value); 

    int remain = 8 - string.length(); 
    char[] chars = new char[remain]; 
    Arrays.fill(chars, '0'); 
    string = new String(chars) + string; 

    int count = 0; 
    for (int i = string.length() - 1; i >= 0; i--) { 
     count++; 
     result = string.substring(i, i + 1) + result; 
     if (count == 4) { 
      result = "-" + result; 
      count = 0; 
     } 
    } 

    if (result.startsWith("-")) { 
     result = result.substring(1, result.length()); 
    } 

    return result; 
} 

Tôi sử dụng nó để xác định một cài đặt ứng dụng cụ thể khi gọi các dịch vụ web của tôi. Như bạn có thể thấy tôi cố gắng phê duyệt khác nhau, dựa trên TelephonyManager và ANDROID_ID.

Tôi nhận được một chuỗi như xxxx-xxxx-xxxx-xxxx trong đó x là ký tự hex.

Tôi mua rất nhiều thuốc Trung Quốc chi phí thấp và tất cả trong số này có cùng DEVICE_IDsố serial cùng !! Vì vậy, giải pháp của tôi. Nó hoạt động tốt ngay bây giờ.

+0

Bạn nói rằng bạn theo dõi cài đặt ứng dụng độc đáo. Nó sẽ không được dễ dàng hơn chỉ để tiết kiệm một số chuỗi generatad để sở thích chia sẻ, nếu một không được lưu lại, và sử dụng nó? Tôi có nghĩa là như sử dụng một boolean idGenerated, khi lần đầu tiên tạo ra đặt nó thành sự thật, và nếu nó là đúng thì lấy id từ sharedpreferences, theo cách này bạn sẽ có một id cài đặt duy nhất cho mỗi lần cài đặt. – lxknvlk

+1

@lxknvlk Tôi cần cùng một id nếu tôi gỡ cài đặt ứng dụng và cài đặt lại nó. –

3

Xét rằng đoạn văn trích dẫn của bạn comes from Google itself, vâng, đó là sự thật.

+0

Có lẽ vì cả hai mối quan tâm và yêu cầu sử dụng nó đến từ Google, thực tế là nó có thể không phải là duy nhất là cuối cùng bất lợi (tức là, dễ bị giả mạo/snooping) nhưng hy vọng không phải cái gì đó làm cho thuật toán thất bại. –

+0

Vì vậy, để phát triển giấy phép kiểm tra nó không quan trọng rằng ANDROID_ID không phải là duy nhất, phải không? – Eduardo

+0

@Eduardo: Tôi chưa bao giờ sử dụng LVL, vì vậy tôi không thể trả lời câu hỏi đó. Tôi chỉ đơn thuần là giải quyết của bạn "Có đúng không?" câu hỏi. – CommonsWare