Mengambil versi Android API secara terprogram

Jawaban:

1067

Seperti yang dijelaskan dalam dokumentasi Android, level SDK (integer) yang dijalankan ponsel tersedia di:

android.os.Build.VERSION.SDK_INT

Kelas yang terkait dengan int ini ada di android.os.Build.VERSION_CODESkelas.

Contoh kode:

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
}

Sunting : SDK_INT ini tersedia sejak Donut (android 1.6 / API4) jadi pastikan aplikasi Anda tidak kompatibel dengan Cupcake (android 1.5 / API3) saat Anda menggunakannya atau aplikasi Anda akan macet (terima kasih kepada Programmer Bruce untuk ketepatannya) .

Dokumentasi android yang sesuai ada di sini dan di sini

ol_v_er
sumber
18
Jika kode ini berjalan pada 1.5, maka referensi SDK_INT akan mengeluarkan pengecualian, karena diperkenalkan dengan API 4. (Ya, Anda dapat menjalankan APK yang dikompilasi dengan kode API 4 pada 1.5. Dan ya, ketika kode API 4 tercapai , itu melempar pengecualian.)
Programmer Bruce
@ProgrammerBruce bagaimana mencegah crash? Atau bagaimana agar tidak kompatibel dengan retro?
Cœur
1
@ Cœur Saya pikir membangun aplikasi retro yang kompatibel dengan Android 1.5 tidak begitu berguna saat ini. Cukup atur proyek Anda minSdkVersionke 4(Android 1.6) dan lanjutkan.
ol_v_er
Mengapa tidak menggunakan String android.os.Build.VERSION.SDK ? Ini bekerja untuk semua versi Android
PYK
@PYK Atribut ini android.os.Build.VERSION.SDK sudah usang, jadi tidak boleh digunakan. developer.android.com/reference/android/os/…
ol_v_er
146

Sangat mudah:

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

Keluaran:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2
CommonSenseCode
sumber
2
Build.VERSION.RELEASE adalah apa yang saya cari. Terima kasih @CommonSenseCode
axierjhtjz
81
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 bisa memiliki OS yang tidak 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 tidak masalah menggunakan versi Android standar atau tidak!

Untuk menggunakannya, Anda bisa melakukan ini;

String androidOS = Build.VERSION.RELEASE;
Falcon165o
sumber
9
Menurut dokumen int android.os.Build.VERSION.SDK_INTdan public static final int SDK_INTdan Added in API level 4bagaimana int (bukan Integer) kembali NULL? NULLadalah keadaan untuk objek sehingga Build atau VERSION-nya bisa secara nullteoritis tetapi dalam kasus seperti itu tidak hanya SDK_INTtetapi RELEASEjuga akan menyebabkan NPE. SDK_INT mungkin dapat menyebabkan "Tidak ada pengecualian metode seperti itu" atau sesuatu seperti itu tetapi tidak null atau NPE. Jika hanya custom ROM yang merusak dokumen dan metode yang dinyatakan sebagai public static final Integer SDK_INT. Saya hanya mencoba menentukan sifat masalah untuk membuat solusi.
Stan
3
Adakah yang bisa memverifikasi apakah ini memang masalahnya? Komentar Stan membuatnya sangat jelas bahwa null tidak mungkin. Dan custom Android ROM / OS tentunya harus berasal dari versi build? Jadi, pasti Build.VERSION.SDK_INT harus mencerminkan ini?
BT
3
Saya telah menurunkan ini karena klaim tidak benar-benar didukung dan peringatan tentang nulltidak masuk akal.
Sam
Telepon yang di-root atau ROM kustom tidak boleh menyentuh nomor ini. Mereka biasanya mengubah Build.VERSION.RELEASE.
Phuah Yee Keat
Ada banyak masalah yang diketahui terkait Custom OS / Roms. Versi yang saya miliki di Android lama saya pada waktu itu (saya ingin mengatakan GS3) memiliki masalah itu. Ada banyak masalah dengan nilai-nilai hardcoded atau nilai-nilai di sana tidak hanya benar. Contoh sulit, Alamat Wi-Fi Mac sedang dikodekan dengan keras.
Falcon165o
31

Dengan mempertimbangkan semua kata, berikut adalah kode yang saya gunakan untuk mendeteksi apakah perangkat memiliki Froyo atau OS Android yang lebih baru (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;
}

Jelas, Anda dapat memodifikasi bahwa jika kondisi mempertimbangkan versi 1.0 & 1.5 Android jika Anda memerlukan pemeriksa generik. Anda mungkin akan berakhir dengan sesuatu seperti ini:

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

Beri tahu saya jika kode tidak berfungsi untuk Anda.

nikib3ro
sumber
29

coba ini:

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

android.os.Build.VERSION.SDK akan memberi Anda nilai Level API. Anda dapat dengan mudah menemukan pemetaan dari tingkat api ke versi android di dokumentasi android. Saya percaya, 8 untuk 2.2, 7 untuk 2.1, dan seterusnya.

jvdneste
sumber
Metode ini sudah usang.
Adi
4

Oke. Ini menggunakan getApplicationInfo()metode Contextkelas.

Parth Mehta
sumber
1
Ini akan memberi Anda minSdkVersion dan targetSdkVersion APK, yang menjelaskan versi API mana yang didukung aplikasi. Ini bukan versi API dari ponsel yang sedang dijalankan aplikasi ini.
OldSchool4664
2

SDK.INT didukung untuk Android 1.6 dan lebih tinggi

SDK didukung untuk semua versi

Jadi saya lakukan:

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

Kredit ke: CommonsWare atas jawaban ini

PYK
sumber
SDK sudah tidak digunakan lagi di Jawa.
limonik
0

Saya lebih suka memiliki versi sebagai nomor handeled lebih mudah daripada saya menulis ini:

  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();
}
alex
sumber
0

Ini Coding Selamat Bekerja

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Catatan Harap pastikan paket impor Anda sudah benar (impor paket nama paket aplikasi Anda jika tidak berfungsi dengan benar)

Keshav Gera
sumber
-2

Saya memperbaiki kode yang saya gunakan

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