【问题标题】:Android Lint flagging NewAPI Error where it should notAndroid Lint 在不应该的地方标记 NewAPI 错误
【发布时间】:2017-10-24 09:34:41
【问题描述】:

在我的 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'
    }
}

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

【问题讨论】:

    标签: java android lint


    【解决方案1】:

    我认为您收到错误是因为您在一个方法中混合了针对不同 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);
    }
    

    【讨论】:

    • 是的,这是一个比我在问题中建议的更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多