프로그래밍 방식으로 Android API 버전 검색


답변:


1067

Android 문서에 설명 된대로 전화기가 실행중인 SDK 레벨 (정수)은 다음에서 사용할 수 있습니다.

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는 Donut (android 1.6 / API4)부터 사용할 수 있으므로 사용할 때 응용 프로그램이 Cupcake (android 1.5 / API3)와 레트로 호환되지 않는지 확인하십시오. .

해당 안드로이드 문서는 여기여기에


18
코드가 1.5에서 실행중인 경우 API_ 4에서 도입되었으므로 SDK_INT를 참조하면 예외가 발생합니다. (예, API 4 코드가 1.5로 컴파일 된 APK를 1.5에서 실행할 수 있습니다. 예외가 발생합니다.)
프로그래머 Bruce

@ProgrammerBruce 충돌을 방지하는 방법? 또는 레트로 호환 되지 않는 방법은 무엇입니까?
Cœur

1
@ Cœur 나는 안드로이드 1.5와 호환되는 앱 레트로를 만드는 것이 요즘 유용하지 않다고 생각합니다. 프로젝트 minSdkVersion4(Android 1.6)으로 설정하고 계속하십시오.
ol_v_er

왜 대신 android.os.Build.VERSION.SDK 문자열을 사용 하지 않습니까? 모든 안드로이드 버전에서 작동
PYK

@PYK이 속성 android.os.Build.VERSION.SDK는 더 이상 사용되지 않으므로 사용해서는 안됩니다. developer.android.com/reference/android/os/…
ol_v_er 오전

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
Build.VERSION.RELEASE는 내가 찾고 있던 것입니다. 감사합니다 @CommonSenseCode
axierjhtjz

81
Build.VERSION.RELEASE;

그러면 실제 버전 번호가 표시됩니다. 일명 2.3.3 또는 2.2. Build.VERSION.SDK_INT 사용의 문제는 루팅 된 전화 또는 사용자 정의 롬이 있고 비표준 OS (일명 내 안드로이드가 2.3.5를 실행 중)를 가질 수 있으며 Build.VERSION.SDK_INT를 사용할 때 null을 반환한다는 것입니다 따라서 Build.VERSION.RELEASE는 표준 Android 버전 사용 여부에 관계없이 작동합니다!

그것을 사용하기 위해, 당신은 이것을 할 수 있습니다;

String androidOS = Build.VERSION.RELEASE;

9
문서에 따르면 int android.os.Build.VERSION.SDK_INTpublic static final int SDK_INTAdded in API level 4방법 (안 정수) 수익을 int로 수 NULL? NULL그 빌드 또는 버전이 될 수 있도록 상태는 객체입니다 null뿐만 아니라 이론적으로하지만,이 경우에 SDK_INT있지만 RELEASENPE의 원인이됩니다뿐만 아니라. SDK_INT는 "No such method exception"또는 이와 유사한 것이지만 null 또는 NPE는 발생하지 않을 수 있습니다. 사용자 정의 ROM만이 문서를 중단하고 메소드가로 선언 된 경우 public static final Integer SDK_INT. 해결 방법을 만들기 위해 문제의 본질을 결정하려고합니다.
Stan

3
누구든지 이것이 사실인지 확인할 수 있습니까? Stan의 의견은 null이 불가능하다는 것을 분명히합니다. 그리고 커스텀 안드로이드 ROM / OS는 반드시 어떤 버전의 빌드에서 나온 것입니까? 반드시 Build.VERSION.SDK_INT가 이것을 반영해야합니까?
BT

3
소유권 주장이 실제로 백업되지 않았으며 이에 대한 경고 null가 이해가되지 않기 때문에이를 하향 투표했습니다 .
Sam

루팅 된 전화 또는 커스텀 롬은 절대이 번호를 건드리지 않아야합니다. 그들은 보통 Build.VERSION.RELEASE를 변경합니다.
Phuah Yee Keat 2

커스텀 OS / 롬과 관련하여 알려진 문제가 많이 있습니다. 당시 내 구형 Android에서 가지고 있던 버전 (GS3이라고 말하고 싶습니다)에 문제가 있습니다. 하드 코딩 된 값이나 값에는 많은 문제가 있었으며 그저 정확하지 않았습니다. 어려운 예, Wi-Fi Mac 주소는 하드 코딩되어 있습니다.
Falcon165o

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는 API 레벨의 가치를 제공해야합니다. 안드로이드 문서에서 API 레벨에서 안드로이드 버전으로의 매핑을 쉽게 찾을 수 있습니다. 8은 2.2, 7은 2.1, 등등입니다.


이 방법은 더 이상 사용되지 않습니다.
Adi

4

알았다. 클래스 의 getApplicationInfo()메소드를 사용합니다 Context.


1
그러면 앱에서 지원하는 API 버전을 설명하는 APK의 minSdkVersion 및 targetSdkVersion이 표시됩니다. 앱이 현재 실행중인 휴대 전화의 API 버전이 아닙니다.
OldSchool4664

2

SDK.INT는 Android 1.6 이상에서 지원 됩니다

SDK는 모든 버전에서 지원 됩니다

그래서 나는 :

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

크레디트 : 이 답변에 대한 CommonsWare


Java에서는 SDK가 더 이상 사용되지 않습니다.
limonik

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.