如何确定应用程序是否在Android M上运行(开发者预览版)

Ema*_*lin 2 android android-6.0-marshmallow

注意:这个问题是针对Android M开发者预览而不是官方Android 6.0.

android.os.Build.VERSION.SDK_INT在Android M上返回22(22是LOLLIPOP_MR1的api级别).我们如何检查应用程序是否在Android M上运行?我有这样的想法,但显然不起作用:

public boolean isAndroidMOrHigher() {
    return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.MNC;
}
Run Code Online (Sandbox Code Playgroud)

我为什么需要这个?例如,检查我是否需要请求权限,因为Android M有一个新的权限模型.

我能做到这一点:

public boolean isAndroidMOrHigher() {
    return "M".equalsIgnoreCase(Build.VERSION.RELEASE);
}
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个黑客IMO.

真的有两个问题:

  • 最干净的方法是什么?
  • 这是一个错误还是应该是这样的?

Com*_*are 6

最干净的方法是什么?

更新:Google代码示例显示了不同的选项:"MNC".equals(Build.VERSION.CODENAME).

就个人而言,我正在看PREVIEW_SDK_INT,如果它存在:

static private boolean putMarzipanInYourPiePlateBingo() {
  boolean result=false;

  if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP_MR1) {
    try {
      Field f=Build.VERSION.class.getField("PREVIEW_SDK_INT");

      if (f.getInt(null)>0) {
        result=true;
      }
    }
    catch (NoSuchFieldException e) {
      // no problem, must really be API 22
    }
    catch (IllegalAccessException e) {
      // ummm... this shouldn't happen
    }
  }

  return(result);
}
Run Code Online (Sandbox Code Playgroud)

这比你的M支票更麻烦.但是,如果Google决定玩更多游戏(例如,更改Build.VERSION.RELEASE),我认为这种方法会更稳定.

这是一个错误还是应该是这样的?

一个男人的错误是另一个男人按照预期工作.