Làm cách nào để kiểm tra phiên bản hệ thống của Android?


494

Có ai biết làm thế nào tôi có thể kiểm tra phiên bản hệ thống (ví dụ như 1.0, 2.2, vv) programatically?


có lối tắt (đoạn mã hoặc mẫu trực tiếp) để thêm kiểm tra này trong studio android
Basheer AL-MOMANI

Câu trả lời:


420

Kiểm tra android.os.Build.VERSION.

  • CODENAME: Tên mã phát triển hiện tại hoặc chuỗi "REL" nếu đây là bản dựng phát hành.
  • INCREMENTAL: Giá trị bên trong được sử dụng bởi điều khiển nguồn cơ bản để thể hiện bản dựng này.
  • RELEASE: Chuỗi phiên bản người dùng có thể nhìn thấy.

72
bất kỳ ví dụ về cách sử dụng nó?
Jonathan

1
Điều khó khăn ở đây là SDK_INT đã được xác định trong API cấp 4 và sử dụng nó không thành công vào ngày 1-3. Có ai biết làm thế nào để đối phó với điều đó?
Zordid

SDK có sẵn kể từ API 1, và INCREMENTAL có sẵn cho tất cả các phiên bản.
bến

1
Build.VERSION.RELEASE là một Chuỗi, do đó bạn có thể sử dụng Chuỗi này theo cách bạn muốn.
paiego

8
Đừng lo lắng, ngay cả những người đi trước cũng không sử dụng API Android 1-3. @Zordid
Josh

811

Ví dụ cách sử dụng nó:

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

24
Tôi hoàn toàn bỏ qua bất kỳ phiên bản cũ nào hơn Eclair (7), Android 2.1 và chúng tôi sẽ sớm ngừng hỗ trợ cho phiên bản 2.1. Nhưng bạn có thể sử dụng SDK thay vì SDK_INT.
ATom

12
SDK đã được xác định ở cấp độ API 4. Thay vào đó, hãy sử dụng SDK_INT.
erdomester

Tôi có một câu hỏi: nếu nó đang chạy trên một hệ thống cũ hơn GINGERBREAD, thì chúng ta không thể có được android.os.Build.VERSION_CODES.GINGERBREAD, ứng dụng có bị sập không?
HongchaoZhang

Không, bởi vì GINGERBREAD sẽ được thay thế bằng chỉ số trong quá trình xây dựng java. Chỉ cần sử dụng phiên bản biên dịch lớn hơn của Android.
ATom

97

Build.Version là nơi dành cho dữ liệu này. Đây là một đoạn mã cho cách định dạng nó.

public String getAndroidVersion() {
    String release = Build.VERSION.RELEASE;
    int sdkVersion = Build.VERSION.SDK_INT;
    return "Android SDK: " + sdkVersion + " (" + release +")";
}

Trông giống như "SDK Android: 19 (4.4.4)"


63
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ể không có hệ điều hành chuẩn nào (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 không có vấn đề gì!


Từ SDK: "Chuỗi phiên bản người dùng có thể nhìn thấy. Ví dụ:" 1.0 "hoặc" 3.4b5 "." .... "3,4b5" làm cách nào để xác định số phiên bản nào?
davs

Toàn bộ câu trả lời 2.3.3 là số phiên bản, hoặc 2.2 hoặc 2.3.5 (rom tùy chỉnh trong trường hợp của tôi). Đó là số phiên bản HĐH nói chung.
Falcon165o

Nó trả về cùng một thứ Menu >> Cài đặt >> Giới thiệu về điện thoại. Nó nên được dán nhãn Phiên bản phần sụn hoặc một cái gì đó để ảnh hưởng.
Falcon165o

58
Làm thế quái nào một int có thể trả lại một null? SDK_INT là một int nguyên thủy.
Zsolt Safrany

57

Để kiểm tra phiên bản thiết bị lớn hơn hoặc bằng Marshmallow, hãy sử dụng mã này.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){

    }

để kiểm tra người khác, chỉ cần thay đổi VERSION_CODES như,
K cho kitkat,
L cho loolipop N cho Nougat, v.v.


48

Bạn có thể tìm hiểu phiên bản Android đang xem Build.VERSION.

Các tài liệu khuyên bạn nên kiểm tra Build.VERSION.SDK_INTđối với các giá trị trong Build.VERSION_CODES.

Điều này tốt miễn là bạn nhận ra rằng nó Build.VERSION.SDK_INTchỉ được giới thiệu trong API cấp 4, tức là nói Android 1.6 (Donut). Vì vậy, điều này sẽ không ảnh hưởng đến bạn, nhưng nếu bạn muốn ứng dụng của mình chạy trên Android 1.5 trở về trước thì bạn sẽ phải sử dụng phần không dùng nữa Build.VERSION.SDK.


30

Tôi không thể nhận xét về các câu trả lời, nhưng có một lỗi rất lớn trong câu trả lời của Kaushik: SDK_INT không giống với phiên bản hệ thống nhưng thực sự đề cập đến Cấp độ API.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
    //this code will be executed on devices running ICS or later
}

Giá trị Build.VERSION_CODES.ICE_CREAM_SANDWICHbằng 14. 14 là cấp độ API của Ice Cream Sandwich, trong khi phiên bản hệ thống là 4.0. Vì vậy, nếu bạn viết 4.0, mã của bạn sẽ được thực thi trên tất cả các thiết bị bắt đầu từ Donut, vì 4 là cấp API của Donut ( Build.VERSION_CODES.DONUTbằng 4).

if(Build.VERSION.SDK_INT >= 4.0){
    //this code will be executed on devices running on DONUT (NOT ICS) or later
}

Ví dụ này là một lý do tại sao sử dụng 'số ma thuật' là một thói quen xấu.


7
Trên thực tế, Build.VERSION.SDK_INT là cấp API, không phải mã phiên bản. Vì vậy, dòng thích hợp sẽ làif(Build.VERSION.SDK_INT >= 15){
erdomester

Điều gì sẽ xảy ra nếu tôi nói với bạn mã phiên bản giống với cấp API và SDK_INT của ICE_CREAM_SANDWICH là 14 chứ không phải 15? @erdomester
Beyondo

19

Ví dụ: một tính năng chỉ hoạt động cho api21 trở lên sau đây chúng tôi sửa các lỗi trong api21 xuống

    if(Build.VERSION.SDK_INT >= 21) {
    //only api 21 above
    }else{
   //only api 21 down
    }

19

Xin lưu ý rằng Build.VERSION.SDK_INT không đáng tin cậy, nó được đề cập bởi @ Falcon165o và gần đây tôi cũng gặp phải vấn đề đó.

Vì vậy, để có được dữ liệu Chuỗi (dựa trên danh sách phiên bản Android ) của Android hiện đang cài đặt, tôi đã tạo một mã như thế này:

Java

//Current Android version data
public static String currentVersion(){
    double release=Double.parseDouble(Build.VERSION.RELEASE.replaceAll("(\\d+[.]\\d+)(.*)","$1"));
    String codeName="Unsupported";//below Jelly bean OR above Oreo
    if(release>=4.1 && release<4.4)codeName="Jelly Bean";
    else if(release<5)codeName="Kit Kat";
    else if(release<6)codeName="Lollipop";
    else if(release<7)codeName="Marshmallow";
    else if(release<8)codeName="Nougat";
    else if(release<9)codeName="Oreo";
    return codeName+" v"+release+", API Level: "+Build.VERSION.SDK_INT;
}

Kotlin

fun currentVersion(): String {
    val release = java.lang.Double.parseDouble(java.lang.String(Build.VERSION.RELEASE).replaceAll("(\\d+[.]\\d+)(.*)", "$1"))
    var codeName = "Unsupported"//below Jelly bean OR above Oreo
    if (release >= 4.1 && release < 4.4)  codeName = "Jelly Bean"
    else if (release < 5) codeName = "Kit Kat"
    else if (release < 6) codeName = "Lollipop"
    else if (release < 7) codeName = "Marshmallow"
    else if (release < 8) codeName = "Nougat"
    else if (release < 9) codeName = "Oreo"
    return codeName + " v" + release + ", API Level: " + Build.VERSION.SDK_INT
}

Ví dụ về một đầu ra mà nó tạo ra:

Marshmallow v6.0, Cấp API: 23


1
Mã này bị sập tại Double.parseDouble (Build.VERSION.RELEASE) khi bản phát hành chứa nhiều hơn một dấu chấm. Ví dụ 7.1.1
Miklós Keresztes

@ MiklósKeresztes Cảm ơn bạn đã nhận xét thông tin - Tôi đã sửa câu trả lời của mình.
Nikita Kurtin

7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}

Bạn có thể vui lòng giải thích thêm câu trả lời của bạn thêm một chút mô tả về giải pháp bạn cung cấp không?
abarisone

3

sử dụng lớp học này

import android.os.Build;

/**
 * Created by MOMANI on 2016/04/14.
 */
public class AndroidVersionUtil {
    public static int getApiVersion() {
        return android.os.Build.VERSION.SDK_INT;
    }

    public static boolean isApiVersionGraterOrEqual(int thisVersion) {
        return android.os.Build.VERSION.SDK_INT >= thisVersion;
    }
}

3

Sử dụng phương pháp này:

 public static String getAndroidVersion() {
        String versionName = "";

        try {
             versionName = String.valueOf(Build.VERSION.RELEASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }

Điều này sẽ giúp như thế nào?
samuel owino

1

Nếu bạn có bashtrên thiết bị Android của mình, bạn có thể sử dụng chức năng bash này:

function androidCodeName {
    androidRelease=$(getprop ro.build.version.release)
    androidCodeName=$(getprop ro.build.version.codename)

    # Time "androidRelease" x10 to test it as an integer
    case $androidRelease in
        [0-9].[0-9]|[0-9].[0-9].|[0-9].[0-9].[0-9])  androidRelease=$(echo $androidRelease | cut -d. -f1-2 | tr -d .);;
        [0-9].) androidRelease=$(echo $androidRelease | sed 's/\./0/');;
        [0-9]) androidRelease+="0";;
    esac

    [ -n "$androidRelease" ] && [ $androidCodeName = REL ] && {
    # Do not use "androidCodeName" when it equals to "REL" but infer it from "androidRelease"
        androidCodeName=""
        case $androidRelease in
        10) androidCodeName+=NoCodename;;
        11) androidCodeName+="Petit Four";;
        15) androidCodeName+=Cupcake;;
        20|21) androidCodeName+=Eclair;;
        22) androidCodeName+=FroYo;;
        23) androidCodeName+=Gingerbread;;
        30|31|32) androidCodeName+=Honeycomb;;
        40) androidCodeName+="Ice Cream Sandwich";;
        41|42|43) androidCodeName+="Jelly Bean";;
        44) androidCodeName+=KitKat;;
        50|51) androidCodeName+=Lollipop;;
        60) androidCodeName+=Marshmallow;;
        70|71) androidCodeName+=Nougat;;
        80|81) androidCodeName+=Oreo;;
        90) androidCodeName+=Pie;;
        100) androidCodeName+=ToBeReleased;;
        *) androidCodeName=unknown;;
        esac
    }
    echo $androidCodeName
}
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.