Android API sürümünü programlı olarak alma


Yanıtlar:


1067

Android belgelerinde açıklandığı gibi, telefonun çalıştığı SDK düzeyi (tamsayı) şu dillerde kullanılabilir:

android.os.Build.VERSION.SDK_INT

Bu int'e karşılık gelen android.os.Build.VERSION_CODESsınıf sınıftadır.

Kod örneği:

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
}

Düzenleme : Bu SDK_INT Donut (android 1.6 / API4) beri kullanılabilir, bu yüzden uygulamanızı kullandığınızda Cupcake (android 1.5 / API3) ile retro uyumlu olmadığından emin olun veya uygulamanız çökecektir (hassasiyet için Programmer Bruce sayesinde) .

İlgili android belgeleri burada ve burada


18
Kod 1.5 üzerinde çalışıyorsa, API 4 ile tanıtıldığından SDK_INT'e başvurmak bir istisna atar. (Evet, API 4 koduyla derlenmiş bir APK'yı 1.5'te çalıştırabilirsiniz. Evet, bu API 4 koduna ulaşıldığında , bir istisna oluşturur.)
Programcı Bruce

@ProgrammerBruce çökme nasıl önlenir? Ya da retro uyumlu olmamak nasıl ?
Coeur

1
@ Cœur Android 1.5 ile uyumlu bir uygulama retro oluşturmak günümüzde pek kullanışlı değil. Sadece proje ayarlamak minSdkVersioniçin 4(Android 1.6) ve devam edin.
ol_v_er

Neden String yerine android.os.Build.VERSION.SDK kullanılmıyor? Tüm Android sürümleri için çalışır
PYK

@PYK Bu özellik android.os.Build.VERSION.SDK kullanımdan kaldırılmıştır, bu nedenle kullanılmamalıdır. developer.android.com/reference/android/os/…
ol_v_er

146

Çok kolay:

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

Çıktı:

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

2
Build.VERSION.RELEASE aradığım şeydi. Teşekkürler @CommonSenseCode
axierjhtjz

81
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 olmayan bir işletim sisteminiz olabilir (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 Bu nedenle Build.VERSION.RELEASE, standart Android sürümünü kullanıyor olsanız da olmasanız da çalışır!

Kullanmak için bunu yapabilirsin;

String androidOS = Build.VERSION.RELEASE;

9
Dokümanlara göre int android.os.Build.VERSION.SDK_INTve public static final int SDK_INTve Added in API level 4int (Tamsayı değil) nasıl geri dönebilirdi NULL? NULLonun Yapı veya VERSİYONU olabilir böylece bir devlet bir nesne içindir nullsadece teorik olarak ancak bu durumda SDK_INTancak RELEASEbir NPE neden olacaktır da. SDK_INT muhtemelen "Böyle bir yöntem istisnası yok" veya buna benzer bir şeye neden olabilir, ancak null veya NPE değil. Yalnızca özel ROM dokümanları ve yöntem olarak bildirilirse public static final Integer SDK_INT. Ben sadece geçici bir çözüm bulmak için bir sorunun doğasını belirlemeye çalışıyorum.
Stan

3
Herkes bunun gerçekten doğru olup olmadığını doğrulayabilir mi? Stan'in yorumu null değerinin mümkün olmadığını açıkça ortaya koyuyor. Ve özel Android ROM'ları / işletim sistemleri kesinlikle bazı sürümlerden kaynaklanıyor mu? Yani kesinlikle Build.VERSION.SDK_INT bunu yansıtmalı mı?
BT

3
İddia gerçekten desteklenmediği ve hakkındaki uyarının nullmantıklı olmadığı için bunu reddettim .
Sam

Köklü telefon veya Özel rom'lar asla bu numaraya dokunmamalıdır. Genellikle Build.VERSION.RELEASE değiştirir.
Phuah Yee Keat

Özel OS / Rom'lar söz konusu olduğunda bilinen birçok sorun var. O zamanlar eski Android'imde (GS3 demek istiyorum) sahip olduğum sürümde bu sorun vardı. Sabit kodlanmış değerlerle ilgili pek çok sorun var veya sadece doğru olmayan değerler var. Zor örnek, Wi-Fi Mac Adreslerinin sabit kodlanması.
Falcon165o

31

Tüm bunları göz önünde bulundurarak, cihazın Froyo veya daha yeni bir Android OS (2.2+) olup olmadığını tespit etmek için kullandığım kod:

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

Açıkçası, eğer durum genel denetleyiciye ihtiyacınız olması durumunda Android'in 1.0 ve 1.5 sürümlerini dikkate alacaksa değiştirebilirsiniz. Muhtemelen böyle bir şeyle sonuçlanacaksınız:

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

Kodun sizin için çalışmadığını bildirin.


29

bunu dene:

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

9

android.os.Build.VERSION.SDK size API Düzeyi değerini vermelidir. Api seviyesinden android versiyonuna eşlemeyi android dokümantasyonunda kolayca bulabilirsiniz. Ben inanıyorum, 8 2.2 için, 7 2.1 için, vb.


Bu yöntem kullanımdan kaldırıldı.
Adi

4

Anladım. Sınıf getApplicationInfo()yöntemini kullanıyor Context.


1
Bu, uygulamanın hangi API sürümlerini desteklediğini açıklayan APK'nın minSdkVersion ve targetSdkVersion'ını elde etmenizi sağlar. Bu, uygulamanın şu anda üzerinde çalıştığı telefonun API sürümü değil.
OldSchool4664

2

SDK.INT, Android 1.6 ve üstü için desteklenir

SDK tüm sürümler için desteklenir

Ben de öyle:

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

Kredi: CommonsWare bu cevap üzerinde


SDK, Java'da kullanımdan kaldırıldı.
limonik

0

i bu yazdı daha handeled numarası olarak sürümü var tercih ederim:

  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

Mutlu Kodlama Çalışıyor

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Not Lütfen içe aktarma paketinizin doğru olduğundan emin olun (uygulama paketi adınızı içe aktarın, aksi takdirde düzgün çalışmaz)


-2

Kullanılan kodu geliştirdim

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