ฉันจะตรวจสอบเวอร์ชั่นของระบบ Android ได้อย่างไร


494

ไม่มีใครรู้ว่าฉันสามารถตรวจสอบรุ่นของระบบ (เช่น1.0, 2.2ฯลฯ ) programatically?


มีทางลัด (โค้ดขนาดสั้นหรือเทมเพลตสด) เพื่อเพิ่มการตรวจสอบนี้ใน android studio
Basheer AL-MOMANI

คำตอบ:


420

android.os.Build.VERSIONตรวจสอบ

  • CODENAME: ชื่อรหัสพัฒนาปัจจุบันหรือสตริง "REL" หากนี่เป็นบิลด์ที่วางจำหน่าย
  • INCREMENTAL: ค่าภายในที่ใช้โดยตัวควบคุมแหล่งข้อมูลต้นแบบเพื่อแสดงถึงโครงสร้างนี้
  • RELEASE: สตริงรุ่นที่ผู้ใช้มองเห็นได้

72
ตัวอย่างใด ๆ เกี่ยวกับวิธีการใช้งาน?
Jonathan

1
ส่วนที่ยากเกี่ยวกับเรื่องนี้คือ SDK_INT ได้รับการกำหนดใน API ระดับ 4 และการใช้ล้มเหลวในวันที่ 1-3 ไม่มีใครรู้วิธีจัดการกับสิ่งนั้นอย่างดีหรือไม่?
Zordid

SDK มีให้บริการตั้งแต่ API 1 และยังมี INCREMENTAL สำหรับทุกรุ่น
nuala

1
Build.VERSION.RELEASE เป็นสตริงดังนั้นคุณสามารถใช้สตริงนี้ได้ตามต้องการ
paiego

8
ไม่ต้องกังวลแม้แต่ตอนนี้ cavemen กำลังใช้ Android APIs 1-3 อยู่ @Zordid
Josh

811

ตัวอย่างวิธีใช้:

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

24
ฉันเพิกเฉยต่อรุ่นเก่ากว่า Eclair (7), Android 2.1 และในไม่ช้าเราก็หยุดการสนับสนุน 2.1 เช่นกัน แต่คุณสามารถใช้ SDK แทน SDK_INT
ATom

12
SDK เลิกใช้งานในระดับ API 4 ใช้ SDK_INT แทน
erdomester

ฉันมีคำถาม: หากมันทำงานบนระบบที่เก่ากว่า GINGERBREAD เราจะไม่สามารถรับ android.os.Build.VERSION_CODES.GINGERBREAD แอปจะทำงานผิดพลาดหรือไม่
HongchaoZhang

ไม่เพราะ GINGERBREAD จะแทนที่ด้วยตัวเลขในระหว่างการสร้าง java จำเป็นต้องใช้ Android รุ่นคอมไพล์ที่ใหญ่กว่าเท่านั้น
Atom

97

Build.Versionเป็นสถานที่ที่ไปสำหรับข้อมูลนี้ นี่คือข้อมูลโค้ดสำหรับวิธีการจัดรูปแบบ

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

ดูเหมือนว่า "Android SDK: 19 (4.4.4)"


63
Build.VERSION.RELEASE;

ที่จะให้ตัวเลขจริงของรุ่นของคุณ aka 2.3.3 หรือ 2.2 ปัญหาเกี่ยวกับการใช้ Build.VERSION.SDK_INT คือถ้าคุณมีโทรศัพท์รูทหรือรอมที่กำหนดเองคุณอาจไม่มีระบบปฏิบัติการมาตรฐาน (หรือที่เรียกว่า android ของฉันใช้ 2.3.5) และจะส่งคืนค่า null เมื่อใช้ Build.VERSION.SDK_INT ดังนั้น Build.VERSION.RELEASE จะทำงานไม่ว่าอะไรก็ตาม!


จาก SDK: "สตริงรุ่นที่ผู้ใช้มองเห็นได้เช่น" 1.0 "หรือ" 3.4b5 " .... "3.4b5" ฉันจะกำหนดหมายเลขรุ่นได้อย่างไร
davs

คำตอบทั้งหมด 2.3.3 คือหมายเลขเวอร์ชันหรือ 2.2 หรือ 2.3.5 (รอมที่กำหนดเองในกรณีของฉัน) นั่นคือหมายเลขเวอร์ชันระบบปฏิบัติการโดยรวม
Falcon165o

มันกลับมาเหมือนเมนู >> การตั้งค่า >> เกี่ยวกับโทรศัพท์ ควรมีข้อความระบุว่าเวอร์ชั่นของเฟิร์มแวร์หรือบางอย่างที่มีผลกระทบ
Falcon165o

58
int จะคืนค่าว่างได้อย่างไร? SDK_INT เป็น int ดั้งเดิม
Zsolt Safrany

57

สำหรับการตรวจสอบเวอร์ชั่นของอุปกรณ์ที่มากกว่าหรือเท่ากับ Marshmallow ให้ใช้รหัสนี้

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

    }

สำหรับ ckecking others เพียงแค่เปลี่ยน VERSION_CODES เช่น
K สำหรับ kitkat,
L สำหรับ loolipop N สำหรับ Nougat และอื่น ๆ ...


48

คุณสามารถหารุ่น Android Build.VERSIONกำลังมองหาที่

เอกสารแนะนำให้คุณตรวจสอบBuild.VERSION.SDK_INTค่าBuild.VERSION_CODESต่างๆ

นี่เป็นเรื่องปกติตราบใดที่คุณรู้ว่าBuild.VERSION.SDK_INTมีการเปิดตัวใน API ระดับ 4 เท่านั้นซึ่งก็คือ Android 1.6 (Donut) ดังนั้นสิ่งนี้จะไม่ส่งผลกระทบต่อคุณ แต่ถ้าคุณต้องการให้แอปของคุณทำงานบน Android 1.5 หรือBuild.VERSION.SDKเก่ากว่าคุณจะต้องใช้การเลิกใช้แทน


30

ฉันไม่สามารถแสดงความคิดเห็นกับคำตอบได้ แต่มีข้อผิดพลาดอย่างใหญ่หลวงในคำตอบของ Kaushik: SDK_INT ไม่เหมือนกับรุ่นของระบบ แต่จริงๆแล้วหมายถึงระดับ API

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

ค่าBuild.VERSION_CODES.ICE_CREAM_SANDWICHเท่ากับ 14. 14 คือระดับ API ของ Ice Cream Sandwich ในขณะที่รุ่นของระบบคือ 4.0 ดังนั้นหากคุณเขียน 4.0 โค้ดของคุณจะถูกเรียกใช้งานบนอุปกรณ์ทั้งหมดที่เริ่มต้นจาก Donut เนื่องจาก 4 คือระดับ API ของ Donut ( Build.VERSION_CODES.DONUTเท่ากับ 4)

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

ตัวอย่างนี้เป็นเหตุผลว่าทำไมการใช้ 'หมายเลขมายากล' เป็นนิสัยที่ไม่ดี


7
จริงๆแล้ว Build.VERSION.SDK_INT เป็นระดับ API ไม่ใช่รหัสเวอร์ชัน ดังนั้นเส้นที่เหมาะสมจะเป็นif(Build.VERSION.SDK_INT >= 15){
erdomester

จะเกิดอะไรขึ้นถ้าฉันบอกคุณว่ารหัสเวอร์ชั่นเหมือนกับระดับ API และ SDK_INT ของ ICE_CREAM_SANDWICH คือ 14 ไม่ใช่ 15 @erdomester
Beyondo

19

ตัวอย่างเช่นฟีเจอร์ใช้งานได้กับ api21 up เท่านั้นดังต่อไปนี้เราแก้ไขข้อบกพร่องใน api21 down

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

19

ระวังให้ดีว่าBuild.VERSION.SDK_INTไม่น่าเชื่อถือมันได้รับการกล่าวถึงโดย @ Falcon165o และเมื่อเร็ว ๆ นี้ฉันก็พบกับสิ่งนั้นเช่นกัน

ดังนั้นเพื่อให้ได้ข้อมูล String (ตามรายการเวอร์ชั่น Android ) ของ Android ที่ติดตั้งอยู่ในปัจจุบันฉันทำโค้ดแบบนี้:

ชวา

//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
}

ตัวอย่างผลลัพธ์ที่ผลิต:

Marshmallow v6.0, ระดับ API: 23


1
รหัสนี้ขัดข้องที่ Double.parseDouble (Build.VERSION.RELEASE) เมื่อการเผยแพร่มีจุดมากกว่าหนึ่งจุด ตัวอย่าง 7.1.1
Miklós Keresztes

@ MiklósKeresztesขอบคุณสำหรับความคิดเห็นที่ให้ข้อมูล - ฉันคงคำตอบแล้ว
Nikita Kurtin

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

คุณช่วยอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับโซลูชันที่คุณให้ได้ไหม
abarisone

3

ใช้คลาสนี้

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

ใช้วิธีนี้:

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

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

สิ่งนี้จะช่วยได้อย่างไร
samuel owino

1

ให้คุณมีbashบนอุปกรณ์ Android ของคุณคุณสามารถใช้ฟังก์ชั่นทุบตีนี้:

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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.