ChatGPT解决这个技术问题 Extra ChatGPT

如何查看安卓系统版本?

有谁知道如何以编程方式检查系统版本(例如 1.02.2 等)?

是否有快捷方式(代码片段或实时模板)在 android studio 中添加此检查

A
ATom

示例如何使用它:

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

我完全忽略了任何比 Eclair (7)、Android 2.1 更旧的版本,很快我们也停止了对 2.1 的支持。但是您可以使用 SDK 而不是 SDK_INT。
SDK 在 API 级别 4 中被弃用。请改用 SDK_INT。
我有一个问题:如果它运行在比 GINGERBREAD 更早的系统上,那么我们无法获取 android.os.Build.VERSION_CODES.GIGERBREAD,应用程序会崩溃吗?
不,因为 GINGERBREAD 将在 java 构建期间被替换为仅数字。只需要使用更大的Android编译版本。
由于某种原因,我得到了 Unresolved reference: Manifest
M
Marek Sebera

检查android.os.Build.VERSION

CODENAME:当前开发代号,或者如果这是发布版本,则为字符串“REL”。 INCREMENTAL:底层源代码控制用于表示此构建的内部值。 RELEASE:用户可见的版本字符串。


有关如何使用它的任何示例?
难点在于 SDK_INT 已在 API 级别 4 中定义,并且在 1-3 上使用它失败。有人知道如何很好地处理它吗?
SDK 从 API 1 开始可用,INCREMENTAL 也适用于所有版本。
Build.VERSION.RELEASE 是一个字符串,因此您可以随意使用此字符串。
别担心,即使是穴居人今天也没有使用 android API 1-3。 @Zordid
j
jpotts18

Build.Version 是获取此数据的位置。这是如何格式化它的代码片段。

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

看起来像这样“Android SDK:19(4.4.4)”


p
paulcab

要检查大于或等于 Marshmallow 的设备版本,请使用此代码。

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

    }

要检查其他人,只需更改 VERSION_CODES,例如 K 代表 kitkat,L 代表循环播放 N 代表牛轧糖等等...


F
Falcon165o
Build.VERSION.RELEASE;

这将为您提供版本的实际数量;又名 2.3.3 或 2.2。使用 Build.VERSION.SDK_INT 的问题是,如果你有一个 root 手机或自定义 rom,你可能有一个非标准操作系统(也就是我的 android 正在运行 2.3.5),并且在使用 Build.VERSION.SDK_INT 时将返回 null所以 Build.VERSION.RELEASE 无论如何都会起作用!


来自 SDK:“用户可见的版本字符串。例如,“1.0”或“3.4b5”。 ....“3.4b5”如何确定它是哪个版本号?
整个答案 2.3.3 是版本号,或 2.2,或 2.3.5(在我的情况下是自定义 rom)。这是整个操作系统版本号。
它返回相同的菜单>>设置>>关于电话。它应该被标记为固件版本或类似的东西。
int 怎么会返回 null 呢? SDK_INT 是原始 int。
D
Dave Webb

您可以通过 Build.VERSION 找到 Android 版本。

该文档建议您对照 Build.VERSION_CODES 中的值检查 Build.VERSION.SDK_INT

只要您意识到 Build.VERSION.SDK_INT 仅在 API 级别 4(即 Android 1.6 (Donut) 中引入)就可以了。因此这不会影响您,但如果您确实希望您的应用程序在 Android 1.5 或更早版本上运行,那么您将不得不改用已弃用的 Build.VERSION.SDK


M
Michał Kisiel

我无法对答案发表评论,但 Kaushik 的答案存在一个巨大的错误:SDK_INT 与系统版本不同,但实际上是指 API 级别。

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

Build.VERSION_CODES.ICE_CREAM_SANDWICH 的值等于 14。14 是 Ice Cream Sandwich 的 API 级别,而系统版本是 4.0。所以如果你写的是 4.0,你的代码会在所有设备上从 Donut 开始执行,因为 4 是 Donut 的 API 级别(Build.VERSION_CODES.DONUT 等于 4)。

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

这个例子是为什么使用“幻数”是一个坏习惯的一个原因。


实际上,Build.VERSION.SDK_INT 是 API 级别,而不是版本代码。所以正确的行是 if(Build.VERSION.SDK_INT >= 15){
如果我告诉您版本代码与 API 级别相同,并且 ICE_CREAM_SANDWICH 的 SDK_INT 是 14 而不是 15,该怎么办? @erdomester
N
Nikita Kurtin

请注意,Build.VERSION.SDK_INT 不可靠,@Falcon165o 提到了它,最近我也遇到了那个。

因此,为了获取当前安装的 android 的 String 数据(基于 Android version list),我编写了如下代码:

爪哇

//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
    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";
    else if(release < 10)  codeName="Pie";
    else if(release >= 10) codeName="Android "+((int)release);//since API 29 no more candy code names
    return codeName+" v"+release+", API Level: "+Build.VERSION.SDK_INT;
}

科特林

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
    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"
    else if (release < 10)  codeName = "Pie"
    else if (release >= 10) codeName = "Android "+(release.toInt())//since API 29 no more candy code names
    return codeName + " v" + release + ", API Level: " + Build.VERSION.SDK_INT
}

它产生的输出示例:

棉花糖 v6.0,API 级别:23


当版本包含多个点时,此代码在 Double.parseDouble(Build.VERSION.RELEASE) 处崩溃。例如 7.1.1
@MiklósKeresztes 感谢您提供丰富的评论 - 我已经修复了我的答案。
H
HOSHYAR Ahmadpour

例如,一个功能仅适用于 api21 up 下面我们修复了 api21 down 中的错误

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

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

您能否详细说明您的答案,添加更多关于您提供的解决方案的描述?
M
Manoj Tarkar

使用此方法:

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

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

这有什么帮助?
B
Basheer AL-MOMANI

使用这个类

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

S
SebMa

鉴于您的 android 设备上有 bash,您可以使用此 bash 功能:

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
}

M
Mikhail Sharin

根据Android文档:

Build.VERSION.RELEASE – “用户可见的版本字符串。例如,“1.0”或“3.4b5”或“bananas””

为了获得一个普通的 Android 版本(2.3、5.1、12.0 等),我使用这个函数:

private fun getVersion(): Float {
    val release = Build.VERSION.RELEASE
    val parsedVersion = "\\d+(\\.\\d+)?".toRegex()
        .find(release)?.value
    if (parsedVersion.isNullOrBlank()) return 0f
    return try {
        parsedVersion.toFloat()
    } catch (e: Exception) {
        0f
    }
}