Android Lint 在不应该标记 NewAPI 错误的地方
Android Lint flagging NewAPI Error where it should not
在我的 Android 项目中,我在清单文件中将 minSdkVersion
设置为 19
和 targetSdkVersion
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);
}
在我的 Android 项目中,我在清单文件中将 minSdkVersion
设置为 19
和 targetSdkVersion
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);
}