Android Lint 在不应该标记 NewAPI 错误的地方

Android Lint flagging NewAPI Error where it should not

在我的 Android 项目中,我在清单文件中将 minSdkVersion 设置为 19targetSdkVersion 26。在其中一个 Java 文件中,我使用两个不同的 API 来安排警报,使用 if 语句检查 Android:

的当前版本
private void scheduleAlarm(AlarmManager alarmManager, long targetTime, PendingIntent pendingIntent, Intent intent) {
    if(VersionCheckUtils.isLollipopOrLater()) { // Lollipop is version 21
        // Code for versions after Lollipop
        logAlarm(targetTime, pendingIntent, intent, "Lollipop");
        alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(targetTime, pendingIntent),
                pendingIntent);
    }
    else {
        // Code for older versions
        logAlarm(targetTime, pendingIntent, intent, "Kitkat");
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, targetTime, pendingIntent);
    }
}

现在 Lint 不分析 if 语句并报告此错误:

NewApi: Calling new methods on older versions
../../src/main/java/org/bee/beezone/trafficcontrol/AlarmScheduler.java:61: Call requires API level 21 (current min is 19): android.app.AlarmManager#setAlarmClock

你如何处理这种情况?该代码实际上应该是安全的,但是 Android lint 似乎不理解这一点。

最后,我通过将这些行添加到 gradle 构建文件来停用 "NewApi" 检查:

android {
    ...
    lintOptions {
        disable 'NewApi'
    }
}

有没有更好的方法来处理这种情况?

我认为您会收到错误消息,因为您在一个方法中混合了针对不同 api 版本的两种不同方法。

您可以:

  • 在 scheduleAlarm 方法上使用 @SuppressLint("NewApi") 注释

移出 if 条件中的代码并使用 @TargetApi(n) 注解

private void scheduleAlarm(AlarmManager alarmManager, long targetTime, PendingIntent pendingIntent, Intent intent) {
    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Lollipop is version 21
        // Code for versions after Lollipop
        alarmLaterLollipop();
    }
    else {
        // Code for older versions
        alarmBeforeLollipop();
    }
}

@TargetApi(Build.VERSION_CODES.M)
private void alarmLaterLollipop(){
    logAlarm(targetTime, pendingIntent, intent, "Lollipop");
    alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(targetTime, pendingIntent),pendingIntent);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void alarmBeforeLollipop(){
    logAlarm(targetTime, pendingIntent, intent, "Kitkat");
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, targetTime, pendingIntent);
}