Bagaimana saya bisa memeriksa versi sistem Android?


494

Adakah yang tahu bagaimana cara memeriksa versi sistem (mis 1.0. 2.2, Dll.) Secara terprogram?


apakah ada pintasan (cuplikan kode atau templat langsung) untuk menambahkan cek ini di studio android
Basheer AL-MOMANI

Jawaban:


420

Periksa android.os.Build.VERSION.

  • CODENAME: Codename pengembangan saat ini, atau string "REL" jika ini adalah rilis build.
  • INCREMENTAL: Nilai internal yang digunakan oleh kontrol sumber yang mendasarinya untuk mewakili build ini.
  • RELEASE: String versi yang dapat dilihat pengguna.

72
Adakah contoh tentang cara menggunakannya?
Jonathan

1
Bagian tersulit dari ini adalah SDK_INT telah didefinisikan di API Level 4 dan menggunakannya gagal pada 1-3. Adakah yang tahu cara menangani hal itu dengan baik?
Zordid

SDK tersedia sejak API 1, juga INCREMENTAL tersedia untuk semua versi.
nuala

1
Build.VERSION.RELEASE adalah sebuah String, oleh karena itu Anda dapat menggunakan String ini sesuka Anda.
paiego

8
Jangan khawatir, bahkan manusia gua pun tidak menggunakan API Android 1-3 hari ini. @Zordid
Josh

811

Contoh cara menggunakannya:

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

24
Saya benar-benar mengabaikan versi yang lebih lama dari Eclair (7), Android 2.1 dan segera kami menghentikan dukungan untuk 2.1 juga. Tapi Anda bisa menggunakan SDK bukan SDK_INT.
ATom

12
SDK didepresiasikan di API level 4. Gunakan SDK_INT sebagai gantinya.
erdomester

Saya punya pertanyaan: jika itu berjalan pada sistem yang lebih tua dari GINGERBREAD, maka kita tidak bisa mendapatkan android.os.Build.VERSION_CODES.GINGERBREAD, apakah aplikasinya akan macet?
HongchaoZhang

Tidak, karena GINGERBREAD akan diganti hanya dengan nomor selama pembuatan java. Anda hanya perlu menggunakan versi kompilasi Android yang lebih besar.
ATom

97

Build.Version adalah tempat untuk data ini. Berikut ini cuplikan kode untuk cara memformatnya.

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

Sepertinya ini "Android SDK: 19 (4.4.4)"


63
Build.VERSION.RELEASE;

Itu akan memberi Anda angka aktual dari versi Anda; alias 2.3.3 atau 2.2. Masalah dengan menggunakan Build.VERSION.SDK_INT adalah jika Anda memiliki ponsel yang di-rooting atau custom rom, Anda mungkin tidak memiliki OS standar (alias android saya menjalankan 2.3.5) dan itu akan menghasilkan nol saat menggunakan Build.VERSION.SDK_INT jadi Build.VERSION.RELEASE akan bekerja apa pun yang terjadi!


Dari SDK: "String versi yang dapat dilihat pengguna. Misalnya," 1.0 "atau" 3.4b5 "." .... "3.4b5" bagaimana saya bisa menentukan nomor versi mana itu?
davs

Seluruh jawaban 2.3.3 adalah nomor versi, atau 2.2, atau 2.3.5 (custom rom dalam kasus saya). Itu adalah nomor Versi OS secara keseluruhan.
Falcon165o

Ini mengembalikan hal yang sama Menu >> Pengaturan >> Tentang Telepon. Itu harus diberi label Versi Firmware atau sesuatu yang mempengaruhi itu.
Falcon165o

58
Bagaimana bisa int mengembalikan nol? SDK_INT adalah int primitif.
Zsolt Safrany

57

Untuk memeriksa versi perangkat yang lebih besar atau sama dengan Marshmallow, gunakan kode ini.

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

    }

untuk mengecek orang lain cukup ubah VERSION_CODES seperti,
K untuk kitkat,
L untuk loolipop N untuk Nougat dan seterusnya ...


48

Anda dapat mengetahui versi Android yang melihatnya Build.VERSION.

Dokumentasi merekomendasikan Anda memeriksa Build.VERSION.SDK_INTnilai-nilai di Build.VERSION_CODES.

Ini bagus selama Anda menyadari bahwa Build.VERSION.SDK_INTitu hanya diperkenalkan di API Level 4, yang berarti Android 1.6 (Donat). Jadi ini tidak akan memengaruhi Anda, tetapi jika Anda ingin aplikasi Anda berjalan di Android 1.5 atau lebih lama maka Anda harus menggunakan yang sudah usang Build.VERSION.SDK.


30

Saya tidak bisa mengomentari jawabannya, tetapi ada kesalahan besar dalam jawaban Kaushik: SDK_INT tidak sama dengan versi sistem tetapi sebenarnya mengacu pada Tingkat API.

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

Nilai Build.VERSION_CODES.ICE_CREAM_SANDWICHsama dengan 14. 14 adalah level API dari Ice Cream Sandwich, sedangkan versi sistem adalah 4.0. Jadi jika Anda menulis 4.0, kode Anda akan dieksekusi pada semua perangkat mulai dari Donut, karena 4 adalah tingkat API dari Donut ( Build.VERSION_CODES.DONUTsama dengan 4).

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

Contoh ini adalah alasan mengapa menggunakan 'angka ajaib' adalah kebiasaan buruk.


7
Sebenarnya, Build.VERSION.SDK_INT adalah level API, bukan kode versi. Jadi garis yang tepat adalahif(Build.VERSION.SDK_INT >= 15){
erdomester

Bagaimana jika saya memberi tahu Anda kode versi sama dengan tingkat API dan SDK_INT dari ICE_CREAM_SANDWICH adalah 14 bukan 15? @erdomester
Beyondo

19

Sebagai contoh, sebuah fitur hanya berfungsi untuk api21 ke atas berikut ini kami memperbaiki bug di api21 ke bawah

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

19

Sadarilah bahwa Build.VERSION.SDK_INT tidak dapat diandalkan, ini disebutkan oleh @ Falcon165o dan baru-baru ini saya juga menabraknya.

Jadi untuk mendapatkan data String (berdasarkan daftar versi Android ) dari android yang saat ini diinstal, saya membuat kode seperti ini:

Jawa

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

Contoh output yang dihasilkannya:

Marshmallow v6.0, API Level: 23


1
Kode ini mogok di Double.parseDouble (Build.VERSION.RELEASE) saat rilis berisi lebih dari satu titik. Misalnya 7.1.1
Miklós Keresztes

@ MiklósKeresztes Terima kasih atas komentar informatif - Saya telah memperbaiki jawaban saya.
Nikita Kurtin

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

Bisakah Anda menjelaskan lebih lanjut jawaban Anda dengan menambahkan sedikit deskripsi tentang solusi yang Anda berikan?
abarisone

3

gunakan kelas ini

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

Gunakan metode ini:

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

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

Bagaimana ini membantu?
samuel owino

1

Karena Anda memiliki bashperangkat Android, Anda dapat menggunakan fungsi bash ini:

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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.