Android'in sistem sürümünü nasıl kontrol edebilirim?


494

Sistem sürümünü (örn 1.0. 2.2, Vb.) Programlı olarak nasıl kontrol edebileceğimi bilen var mı ?


android stüdyoda bu çeki eklemek için kısayol (kod snippet'i veya canlı şablon) var
Basheer AL-MOMANI

Yanıtlar:


420

Kontrol edin android.os.Build.VERSION.

  • CODENAME: Geçerli geliştirme kod adı veya bir sürüm derlemesi ise "REL" dizesi.
  • INCREMENTAL: Bu derlemeyi temsil etmek için temel kaynak denetimi tarafından kullanılan dahili değer.
  • RELEASE: Kullanıcı tarafından görülebilir sürüm dizesi.

72
nasıl kullanılacağına dair herhangi bir örnek var mı?
Jonathan

1
Bunun zor kısmı, SDK_INT'in API Seviye 4'te tanımlanmış olması ve kullanılması 1-3'te başarısız olmasıdır. Bununla nasıl güzel başa çıkılacağını bilen var mı?
Mart'ta Zordid

SDK API 1'den beri kullanılabilir, ayrıca INCREMENTAL tüm sürümler için kullanılabilir.
nuala

1
Build.VERSION.RELEASE bir String'dir, bu nedenle bu String'i istediğiniz gibi kullanabilirsiniz.
paiego

8
Endişelenme, cavemen bile bugün android API 1-3 kullanmıyor. @Zordid
Josh

811

Nasıl kullanılacağıyla ilgili örnek:

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'den daha eski bir sürümü tamamen görmezden geliyorum ve çok yakında 2.1 için desteği de durduruyoruz. Ancak SDK_INT yerine SDK'yı kullanabilirsiniz.
ATom

12
SDK, API düzey 4'te tasvir edildi. Bunun yerine SDK_INT kullanın.
erdomester

Bir sorum var: GINGERBREAD'den daha eski bir sistemde çalışıyorsa, android.os.Build.VERSION_CODES.GINGERBREAD'i alamayız, uygulama çökecek mi?
HongchaoZhang

Hayır, çünkü GINGERBREAD, java derlemesi sırasında yalnızca sayı ile değiştirilecek. Sadece Android'in daha büyük derleme sürümünü kullanmak gerekir.
ATom

97

Build.Version bu veriler için gidilecek yerdir. Biçimlendirmek için bir kod pasajı.

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

Görünüşe göre "Android SDK: 19 (4.4.4)"


63
Build.VERSION.RELEASE;

Bu size sürümünüzün gerçek sayılarını verecektir; aka 2.3.3 veya 2.2. Build.VERSION.SDK_INT kullanmayla ilgili sorun, köklü bir telefonunuz veya özel romunuz varsa, standart bir işletim sisteminiz olmayabilir (diğer bir deyişle androidim 2.3.5 çalıştırıyor olabilir) ve Build.VERSION.SDK_INT kullanırken boş bir değer döndürür yani Build.VERSION.RELEASE ne olursa olsun çalışır!


SDK'dan: "Kullanıcı tarafından görülebilir sürüm dizesi. Örneğin," 1.0 "veya" 3.4b5 "." .... "3.4b5" Hangi sürüm numarasının olduğunu nasıl belirleyebilirim?
davs

Bütün cevap 2.3.3, sürüm numarası veya 2.2 veya 2.3.5 (benim durumumda özel rom). Bu bir bütün olarak OS Sürüm numarasıdır.
Falcon165o

Aynı şeyi döndürür Menü >> Ayarlar >> Telefon Hakkında. Firmware Sürümü veya bunu etkileyen bir şey olarak etiketlenmelidir.
Falcon165o

58
Bir int nasıl bir sıfır döndürür? SDK_INT ilkel bir int.
Zsolt Safrany

57

Marshmallow'a eşit veya daha büyük cihaz sürümünü kontrol etmek için bu kodu kullanın.

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

    }

başkalarını tıkamak için sadece VERSION_CODES,
kitkat
için K, Nougat için loolipop N için L vb.


48

Baktığınız Android sürümünü öğrenebilirsiniz Build.VERSION.

Belgeler Build.VERSION.SDK_INT, içindeki değerlere karşı kontrol etmenizi önerir Build.VERSION_CODES.

Build.VERSION.SDK_INTSadece Android 1.6 (Donut) gibi API Seviye 4'te tanıtıldığını bildiğiniz sürece bu iyi . Bu sizi etkilemez, ancak uygulamanızın Android 1.5 veya önceki sürümlerde çalışmasını istiyorsanız, kullanımdan kaldırılmış olanı Build.VERSION.SDKkullanmanız gerekir.


30

Cevaplar hakkında yorum yapamam, ancak Kaushik'in cevabında büyük bir hata var: SDK_INT sistem sürümü ile aynı değil ama aslında API Seviyesine atıfta bulunuyor.

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

Değer Build.VERSION_CODES.ICE_CREAM_SANDWICH14'e eşittir. 14, Ice Cream Sandwich'in API seviyesidir, sistem sürümü ise 4.0'dır. Bu nedenle, 4.0 yazarsanız, kod Donut'tan başlayarak tüm cihazlarda yürütülür, çünkü 4 Donut'un API seviyesidir ( Build.VERSION_CODES.DONUT4'e eşittir).

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

Bu örnek, 'sihirli sayı' kullanmanın kötü bir alışkanlık olmasının bir nedenidir.


7
Aslında Build.VERSION.SDK_INT, sürüm kodu değil API düzeyidir. Böylece doğru çizgi olurduif(Build.VERSION.SDK_INT >= 15){
erdomester

Sürüm kodunun API düzeyiyle aynı olduğunu ve ICE_CREAM_SANDWICH'nin SDK_INT'inin 14 değil 15 olduğunu söylersem ne olur? @erdomester
Beyondo

19

Örneğin, bir özellik yalnızca api21 için çalışır, aşağıda api21'deki hataları düzeltiriz

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

19

Unutmayın Build.VERSION.SDK_INT güvenilir değil, Falcon165o @ tarafından bahsedilen ve son zamanlarda ben de o birine ran.

Şu anda yüklü android Dize verilerini ( Android sürüm listesine göre ) almak için , böyle bir kod yaptım:

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
}

Ürettiği bir çıktı örneği:

Marshmallow v6.0, API Seviyesi: 23


1
Sürüm birden fazla nokta içerdiğinde, Double.parseDouble (Build.VERSION.RELEASE) öğesinde bu kod çöküyor. Örneğin 7.1.1
Miklós Keresztes

@ MiklósKeresztes Bilgilendirici yorumunuz için teşekkür ederim - Cevabımı düzelttim.
Nikita Kurtin

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

Verdiğiniz çözüm hakkında biraz daha açıklama ekleyerek cevabınızı biraz daha açıklayabilir misiniz?
abarisone

3

bu sınıfı kullan

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

Bu yöntemi kullanın:

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

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

Bu nasıl yardımcı olacak?
samuel owino

1

bashAndroid cihazınızda olduğu göz önüne alındığında , bu bash işlevini kullanabilirsiniz:

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.