การดึงเวอร์ชั่น Android API โดยทางโปรแกรม


581

มีวิธีการรับรุ่น API ที่โทรศัพท์กำลังทำงานอยู่หรือไม่?


62
@SteveHaley เรามักจะพิจารณาว่าสิ่งที่มาก่อนไม่ใช่สิ่งที่ซ้ำกันในภายหลัง
rds

5
เป็นไปได้ที่ซ้ำกันของวิธีการเรียกคืน android sdk version?
taocp

คำตอบ:


1067

ตามที่อธิบายไว้ในเอกสารประกอบ Android ระดับ SDK (จำนวนเต็ม) ที่โทรศัพท์กำลังใช้งานมีอยู่ใน:

android.os.Build.VERSION.SDK_INT

คลาสที่สอดคล้องกับ int นี้อยู่ในandroid.os.Build.VERSION_CODESชั้นเรียน

ตัวอย่างรหัส:

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
}

แก้ไข : SDK_INT นี้มีให้ตั้งแต่ Donut (android 1.6 / API4) ดังนั้นตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณไม่รองรับ retro (Cupcake 1.5 / API3) ย้อนยุคเมื่อคุณใช้งานหรือแอปพลิเคชันของคุณจะทำงานผิดพลาด .

เอกสาร Android ที่สอดคล้องกันอยู่ที่นี่และที่นี่


18
หากรหัสทำงานบน 1.5 การอ้างอิง SDK_INT จะทำให้เกิดข้อยกเว้นเนื่องจากถูกนำมาใช้กับ API 4 (ใช่คุณสามารถเรียกใช้ APK ที่คอมไพล์ด้วยรหัส API 4 บน 1.5 และใช่เมื่อถึงรหัส API 4 มันจะโยนข้อยกเว้น)
โปรแกรมเมอร์ Bruce

@ProgrammerBruce วิธีป้องกันความผิดพลาด? หรือวิธีที่จะไม่เข้ากันได้ย้อนยุค?
Cœur

1
@ ฉันคิดว่าการสร้างแอพพลิเคชั่นย้อนยุคที่รองรับ Android 1.5 นั้นไม่มีประโยชน์จริงๆในปัจจุบัน เพียงตั้งค่าโครงการของคุณminSdkVersionเป็น4(Android 1.6) และดำเนินการต่อ
ol_v_er

ทำไมไม่ใช้ String android.os.Build.VERSION.SDKแทนล่ะ ใช้งานได้กับ Android ทุกรุ่น
PYK

@PYK คุณลักษณะนี้ android.os.Build.VERSION.SDK เลิกใช้แล้วดังนั้นจึงไม่ควรใช้ developer.android.com/reference/android/os/…
ol_v_er

146

ง่ายมาก:

   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
    );

เอาท์พุท:

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

2
Build.VERSION.RELEASE คือสิ่งที่ฉันกำลังมองหา ขอบคุณ @CommonSenseCode
axierjhtjz

81
Build.VERSION.RELEASE;

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

หากต้องการใช้คุณสามารถทำได้

String androidOS = Build.VERSION.RELEASE;

9
ตามเอกสารint android.os.Build.VERSION.SDK_INTและ public static final int SDK_INTและ Added in API level 4วิธีการที่จะ int (ไม่ใช่จำนวนเต็ม) กลับมาNULL? NULLเป็นสถานะสำหรับวัตถุดังนั้น Build หรือ VERSION อาจเป็นnullเหตุผลทางทฤษฎี แต่ในกรณีเช่นนี้ไม่เพียงSDK_INTแต่RELEASEจะทำให้เกิด NPE ด้วยเช่นกัน SDK_INT อาจทำให้ "ไม่มีข้อยกเว้นวิธีการดังกล่าว" หรืออะไรทำนองนั้น แต่ไม่ใช่ null หรือ NPE public static final Integer SDK_INTหากรอมที่กำหนดเองเท่านั้นแบ่งเอกสารและวิธีการประกาศให้เป็น ฉันแค่พยายามที่จะกำหนดลักษณะของปัญหาที่จะทำให้การแก้ปัญหา
สแตน

3
ทุกคนสามารถยืนยันได้หรือไม่ว่าเป็นกรณีนี้จริงหรือ ความคิดเห็นของ Stan ทำให้ชัดเจนว่า null เป็นไปไม่ได้ และ Android ROM แบบกำหนดเอง / OS ต้องมีต้นกำเนิดมาจากรุ่นต่อ ๆ ไปหรือไม่? ดังนั้น Build.VERSION.SDK_INT ควรสะท้อนถึงสิ่งนี้หรือไม่
BT

3
ฉันได้ลบล้างสิ่งนี้เนื่องจากข้อเรียกร้องไม่ได้รับการสำรองจริงๆและการเตือนnullไม่เหมาะสม
Sam

โทรศัพท์ที่ได้รับการเจาะรูหรือที่กำหนดเองจะต้องไม่แตะหมายเลขนี้ พวกเขามักจะเปลี่ยน Build.VERSION.RELEASE
Phuah Yee Keat

มีปัญหามากมายที่รู้จักเมื่อพูดถึง Custom OS / Roms รุ่นที่ฉันใช้กับ Android รุ่นเก่าในขณะนั้น (ฉันอยากจะบอกว่า GS3) มีปัญหานั้น มีปัญหามากมายเกี่ยวกับค่าฮาร์ดโค้ดหรือค่าที่ไม่ถูกต้อง ตัวอย่างยากที่อยู่ Mac Wi-Fi ถูกเข้ารหัสยาก
Falcon165o

31

คำนึงถึงทั้งหมดที่กล่าวมานี่คือรหัสที่ฉันใช้ในการตรวจสอบว่าอุปกรณ์มี Froyo หรือ Android OS รุ่นใหม่กว่า (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;
}

เห็นได้ชัดว่าคุณสามารถแก้ไขได้หากเงื่อนไขที่จะต้องคำนึงถึง Android เวอร์ชัน 1.0 และ 1.5 ในกรณีที่คุณต้องการตัวตรวจสอบทั่วไป คุณอาจจะได้อะไรแบบนี้:

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

แจ้งให้เราทราบว่ารหัสไม่ทำงานสำหรับคุณ



9

android.os.Build.VERSION.SDK ควรให้คุณค่ากับระดับ API คุณสามารถค้นหาการแมปจากระดับ API ไปเป็น Android ได้ในเอกสารประกอบ Android ฉันเชื่อว่า 8 คือ 2.2, 7 สำหรับ 2.1 และอื่น ๆ


วิธีนี้เลิกใช้แล้ว
Adi

4

เข้าใจแล้ว มันใช้getApplicationInfo()วิธีการContextเรียน


1
สิ่งนี้จะให้ minSdkVersion และ targetSdkVersion ของ APK ซึ่งให้คำอธิบายเกี่ยวกับเวอร์ชัน API ที่แอพรองรับ นี่ไม่ใช่รุ่น API ของโทรศัพท์ที่แอพกำลังทำงานอยู่
OldSchool4664

2

SDK.INT รองรับAndroid 1.6ขึ้นไป

SDK รองรับทุกรุ่น

ดังนั้นฉัน:

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

ให้เครดิตกับ: CommonsWareมากกว่าคำตอบนี้


SDK เลิกใช้แล้วใน Java
limonik

0

ฉันชอบมีรุ่นเป็นหมายเลขที่จะ handeled easyway มากกว่าที่ฉันเขียนนี้:

  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

มันทำงานได้ดี

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

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


-2

ฉันปรับปรุงรหัสที่ฉันใช้

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