Truy xuất phiên bản API Android theo chương trình


Câu trả lời:


1067

Như được mô tả trong tài liệu Android, cấp SDK (số nguyên) mà điện thoại đang chạy có sẵn trong:

android.os.Build.VERSION.SDK_INT

Lớp tương ứng với int này nằm trong android.os.Build.VERSION_CODES lớp.

Mã ví dụ:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    // Do something for lollipop and above versions
} else{
    // do something for phones running an SDK before lollipop
}

Biên tập : SDK_INT này khả dụng vì Donut (android 1.6 / API4) vì vậy hãy đảm bảo ứng dụng của bạn không tương thích retro với Cupcake (android 1.5 / API3) khi bạn sử dụng hoặc ứng dụng của bạn sẽ gặp sự cố (nhờ độ chính xác của Lập trình viên Bruce) .

Tài liệu Android tương ứng có ở đâyđây


18
Nếu mã đang chạy trên 1.5, thì tham chiếu SDK_INT sẽ đưa ra một ngoại lệ, vì nó được giới thiệu với API 4. (Có, bạn có thể chạy APK được biên dịch với mã API 4 trên 1.5. Và có, khi đạt được mã API 4 đó , nó không có ngoại lệ.)
Lập trình viên Bruce

@ProgrammerBruce làm thế nào để ngăn chặn sự cố? Hoặc làm thế nào để không tương thích với retro?
Cœur

1
@ Cœur Tôi nghĩ rằng việc xây dựng một ứng dụng tương thích với Android 1.5 hiện nay không thực sự hữu ích. Chỉ cần đặt dự án của bạn minSdkVersionthành 4(Android 1.6) và tiếp tục.
ol_v_er

Tại sao không sử dụng Chuỗi android.os.Build.VERSION.SDK thay thế? Nó hoạt động cho tất cả các phiên bản Android
PYK

@PYK Thuộc tính này android.os.Build.VERSION.SDK không được dùng nữa, vì vậy không nên sử dụng nó. developer.android.com/reference/android/os/ cường
ol_v_er

146

Rất dễ:

   String manufacturer = Build.MANUFACTURER;
   String model = Build.MODEL;
   int version = Build.VERSION.SDK_INT;
   String versionRelease = Build.VERSION.RELEASE;

Log.e("MyActivity", "manufacturer " + manufacturer
            + " \n model " + model
            + " \n version " + version
            + " \n versionRelease " + versionRelease
    );

Đầu ra:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2

2
Build.VERSION.RELEASE là những gì tôi đang tìm kiếm. Cảm ơn @CommonSenseCode
axierjhtjz 20/03/19

81
Build.VERSION.RELEASE;

Điều đó sẽ cung cấp cho bạn những con số thực tế của phiên bản của bạn; aka 2.3.3 hoặc 2.2. Vấn đề với việc sử dụng Build.VERSION.SDK_INT là nếu bạn có điện thoại đã root hoặc rom tùy chỉnh, bạn có thể có một hệ điều hành không chuẩn (hay còn gọi là Android của tôi đang chạy 2.3.5) và điều đó sẽ trả về null khi sử dụng Build.VERSION.SDK_INT vì vậy Build.VERSION.RELEASE sẽ hoạt động bất kể sử dụng phiên bản Android tiêu chuẩn hay không!

Để sử dụng nó, bạn có thể làm điều này;

String androidOS = Build.VERSION.RELEASE;

9
Theo tài liệu int android.os.Build.VERSION.SDK_INTpublic static final int SDK_INTAdded in API level 4cách thể int (không Integer) trở lại NULL? NULLlà một trạng thái cho một đối tượng để Build hoặc VERSION của nó có thể nullvề mặt lý thuyết nhưng trong trường hợp đó không chỉ SDK_INTmà còn RELEASEgây ra NPE. SDK_INT có thể có thể gây ra "Không có ngoại lệ phương thức như vậy" hoặc đại loại như thế nhưng không phải là null hoặc NPE. Nếu chỉ ROM tùy chỉnh phá vỡ các tài liệu và phương thức được khai báo là public static final Integer SDK_INT. Tôi chỉ đang cố xác định bản chất của một vấn đề để giải quyết.
Stan

3
Bất cứ ai có thể xác minh nếu đây là trong thực tế trường hợp? Nhận xét của Stan cho thấy khá rõ rằng null là không thể. Và ROM / HĐH Android tùy chỉnh chắc chắn phải bắt nguồn từ một số bản dựng của phiên bản? Vì vậy, chắc chắn Build.VERSION.SDK_INT sẽ phản ánh điều này?
BT

3
Tôi đã đánh giá thấp điều này vì yêu cầu không thực sự được sao lưu và cảnh báo về nullđiều đó không có ý nghĩa.
Sam

Điện thoại đã root hoặc tùy chỉnh rom không bao giờ chạm vào số này. Họ thường thay đổi Build.VERSION.RELEASE mặc dù.
Phuah Yee Keat

Có rất nhiều vấn đề được biết đến khi nói đến Hệ điều hành / Rom tùy chỉnh. Phiên bản tôi có trên Android cũ của tôi vào thời điểm đó (tôi muốn nói GS3) có vấn đề đó. Đã có rất nhiều vấn đề với các giá trị được mã hóa cứng hoặc các giá trị không đúng. Ví dụ cứng, Địa chỉ Mac Wi-Fi được mã hóa cứng.
Falcon165o

31

Có tính đến tất cả, đây là mã tôi sử dụng để phát hiện nếu thiết bị có hệ điều hành Android hoặc Froyo mới hơn (2.2+):

public static boolean froyoOrNewer() {
    // SDK_INT is introduced in 1.6 (API Level 4) so code referencing that would fail
    // Also we can't use SDK_INT since some modified ROMs play around with this value, RELEASE is most versatile variable
    if (android.os.Build.VERSION.RELEASE.startsWith("1.") ||
        android.os.Build.VERSION.RELEASE.startsWith("2.0") ||
        android.os.Build.VERSION.RELEASE.startsWith("2.1"))
        return false;

    return true;
}

Rõ ràng, bạn có thể sửa đổi nếu có điều kiện để đưa vào tài khoản phiên bản 1.0 & 1.5 của Android trong trường hợp bạn cần kiểm tra chung. Bạn có thể sẽ kết thúc với một cái gì đó như thế này:

// returns true if current Android OS on device is >= verCode 
public static boolean androidMinimum(int verCode) {
    if (android.os.Build.VERSION.RELEASE.startsWith("1.0"))
        return verCode == 1;
    else if (android.os.Build.VERSION.RELEASE.startsWith("1.1")) {
        return verCode <= 2;
    } else if (android.os.Build.VERSION.RELEASE.startsWith("1.5")) {
        return verCode <= 3;
    } else {
        return android.os.Build.VERSION.SDK_INT >= verCode;
    }
}

Hãy cho tôi biết nếu mã không hoạt động cho bạn.


29

thử cái này:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
 }

9

android.os.Build.VERSION.SDK sẽ cung cấp cho bạn giá trị của Cấp độ API. Bạn có thể dễ dàng tìm thấy ánh xạ từ cấp độ api đến phiên bản Android trong tài liệu Android. Tôi tin rằng, 8 là cho 2.2, 7 cho 2.1, v.v.


Phương pháp này không được chấp nhận.
Adi

4

Hiểu rồi. Nó sử dụng getApplicationInfo()phương thức của Contextlớp.


1
Điều này sẽ giúp bạn có được minSdkVersion và targetSdkVersion của APK, mô tả các phiên bản API mà ứng dụng hỗ trợ. Đây không phải là phiên bản API của điện thoại mà ứng dụng hiện đang chạy.
OldSchool4664

2

SDK.INT được hỗ trợ cho Android 1.6 trở lên

SDK được hỗ trợ cho tất cả các phiên bản

Vì vậy tôi làm:

String sdk_version_number = android.os.Build.VERSION.SDK;

Tín dụng cho: CommonsWare trên câu trả lời này


SDK không dùng nữa trong Java.
limonik

0

Tôi thích có phiên bản là số được xử lý dễ dàng hơn tôi đã viết này:

  public static float getAPIVerison() {

    Float f = null;
    try {
        StringBuilder strBuild = new StringBuilder();
        strBuild.append(android.os.Build.VERSION.RELEASE.substring(0, 2));
        f = new Float(strBuild.toString());
    } catch (NumberFormatException e) {
        Log.e("", "error retriving api version" + e.getMessage());
    }

    return f.floatValue();
}

0

Mã hóa hạnh phúc làm việc của nó

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Lưu ý Vui lòng đảm bảo gói nhập của bạn là chính xác (nhập gói gói tên ứng dụng của bạn nếu không nó không hoạt động đúng)


-2

Tôi đã cải thiện mã tôi đã sử dụng

public static float getAPIVerison() {

    float f=1f;
    try {
        StringBuilder strBuild = new StringBuilder();
        strBuild.append(android.os.Build.VERSION.RELEASE.substring(0, 2));
        f= Float.valueOf(strBuild.toString());
    } catch (NumberFormatException e) {
        Log.e("myApp", "error retriving api version" + e.getMessage());
    }

    return f;
}
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.