एंड्रॉइड एपीआई संस्करण को प्रोग्रामिक रूप से पुनर्प्राप्त करना


581

क्या एपीआई संस्करण प्राप्त करने का कोई तरीका है जो फोन वर्तमान में चल रहा है?


62
@SteveHaley आमतौर पर हम मानते हैं कि जो चीज़ पहले आती है वह उस चीज़ का डुप्लिकेट नहीं है जो बाद में दिखाई देती है।
आरडीएस

जवाबों:


1067

जैसा कि Android प्रलेखन में वर्णित है, एसडीके स्तर (पूर्णांक) जो फोन चल रहा है वह इसमें उपलब्ध है:

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 डोनट (एंड्रॉइड 1.6 / एपीआई 4) के बाद से उपलब्ध है, इसलिए सुनिश्चित करें कि आपका आवेदन कपकेक (एंड्रॉइड 1.5 / एपीआई 3) के साथ रेट्रो-संगत नहीं है जब आप इसका उपयोग करते हैं या आपका एप्लिकेशन क्रैश हो जाएगा (सटीक के लिए प्रोग्रामर ब्रूस के लिए धन्यवाद) ।

इसी तरह के Android प्रलेखन यहाँ और यहाँ है


18
यदि कोड 1.5 पर चल रहा है, तो संदर्भित SDK_INT अपवाद को फेंक देगा, क्योंकि यह एपीआई 4 के साथ पेश किया गया था (हां, आप 1.5 पर एपीआई 4 कोड के साथ संकलित एक एपीके चला सकते हैं। और हां, जब एपीआई 4 कोड पहुंच जाता है। , यह एक अपवाद फेंक देता है।)
प्रोग्रामर ब्रूस

@ProgrammerBruce दुर्घटना को कैसे रोकें? या रेट्रो-संगत कैसे नहीं हो सकता है?
करूर

1
@ मुझे लगता है कि एंड्रॉइड 1.5 के लिए संगत एक ऐप रेट्रो बनाना वास्तव में आजकल उपयोगी नहीं है। बस अपनी परियोजना के लिए सेट minSdkVersionकरने के लिए 4(एंड्रॉयड 1.6) और चले जाते हैं।
ol_v_er

इसके बजाय स्ट्रिंग android.os.Build.VERSION.SDK का उपयोग क्यों नहीं करते हैं ? यह सभी Android संस्करणों के लिए काम करता है
PYK

@PYK यह विशेषता android.os.Build.VERSION.SDK पदावनत है, इसलिए इसका उपयोग नहीं किया जाना चाहिए। डेवलपर
.android.com

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
बिल्ड.VERSION.RELEASE मैं क्या देख रहा था। धन्यवाद @CommonSenseCode
axierjhtjz

81
Build.VERSION.RELEASE;

यह आपको आपके संस्करण की वास्तविक संख्या देगा; उर्फ 2.3.3 या 2.2। Build.VERSION.SDK_INT का उपयोग करने के साथ समस्या यह है कि यदि आपके पास रूट फोन या कस्टम रोम है, तो आपके पास एक गैर मानक OS हो सकता है (aka my android 2.3.5 चल रहा है) और बिल्ड .VERS.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एक वस्तु के लिए एक राज्य है तो इसका निर्माण या संस्करण nullसैद्धांतिक रूप से हो सकता है लेकिन ऐसे मामले में न केवल SDK_INTबल्कि RELEASEएक एनपीई का कारण होगा। SDK_INT शायद "ऐसा कोई विधि अपवाद नहीं" या ऐसा कुछ हो सकता है, लेकिन अशक्त या NPE नहीं। यदि केवल कस्टम ROM डॉक्स और के रूप में घोषित विधि को तोड़ता है public static final Integer SDK_INT। मैं केवल समस्या को हल करने के लिए किसी समस्या की प्रकृति निर्धारित करने का प्रयास कर रहा हूं।
स्टेन

3
क्या कोई सत्यापित कर सकता है कि क्या यह वास्तव में मामला है? स्टेन की टिप्पणी से यह स्पष्ट हो जाता है कि अशक्त संभव नहीं है। और कस्टम एंड्रॉइड रॉम / ओएस का निश्चित रूप से संस्करण के कुछ निर्माण से उत्पन्न होना है? तो निश्चित रूप से Build.VERSION.SDK_INT को यह प्रतिबिंबित करना चाहिए?
बीटी

3
मैंने इसे अस्वीकार कर दिया है क्योंकि दावा वास्तव में समर्थित नहीं है और इस बारे में चेतावनी का nullकोई मतलब नहीं है।
सैम

रूट किए गए फोन या कस्टम रोम को इस नंबर को कभी नहीं छूना चाहिए। वे आमतौर पर Build.VERSION.RELEASE बदल देते हैं।
फुआ ये की

कस्टम ओएस / रोम्स की बात आती है, तो बहुत सारे ज्ञात मुद्दे हैं। उस समय मेरे पुराने Android पर जो संस्करण था (मैं कहना चाहता हूं कि GS3) उस मुद्दे पर था। हार्डकोडेड मानों या मानों के साथ बहुत सारे मुद्दे हैं, जो अभी सही नहीं थे। हार्ड उदाहरण, वाई-फाई मैक एड्रेस हार्ड कोडित किया जा रहा है।
फाल्कन 165o

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

जाहिर है, अगर आप जेनेरिक चेकर की जरूरत है तो आप 1.0 या 1.5 Android के संस्करणों को ध्यान में रख सकते हैं। आप शायद कुछ इस तरह से खत्म करेंगे:

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

अगर कोड आपके लिए काम नहीं कर रहा है तो मुझे बताएं।


29

इसे इस्तेमाल करे:

 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 आपको एपीआई स्तर का मूल्य देना चाहिए। आप एंड्रॉइड डॉक्यूमेंट में एपी लेवल से लेकर एंड्रॉइड वर्जन तक मैपिंग को आसानी से पा सकते हैं। मेरा मानना ​​है, 8 2.2 के लिए है, 7 2.1 के लिए, और इसी तरह।


यह विधि पदावनत है।
आदि

4

समझ गया। कक्षा की getApplicationInfo()विधि का उपयोग करते हुए Context


1
यह आपको एपीके के minSdkVersion और targetSdkVersion मिलेगा, जो बताता है कि ऐप किस एपीआई का समर्थन करता है। यह वर्तमान में चल रहे फोन का एपीआई संस्करण नहीं है।
OldSchool4664

2

SDK.INT एंड्रॉइड 1.6 और ऊपर के लिए समर्थित है

एसडीके सभी संस्करणों के लिए समर्थित है

इसलिए मैं करता हूँ:

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

इस जवाब पर : CommonsWare


एसडीके ने जावा में पदावनत किया।
मर्यादा

0

मैं पसंद करता हूं कि संस्करण जितना मैंने लिखा है उससे अधिक आसान तरीके से संभाला जा सके।

  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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.