Android @TargetApi(apiVersion) : Call requires API level 21 (current min is 16)

在实现WebView页面截长图功能时遇到API兼容性问题,调用需要API 21,但项目最小支持API为16。通过添加@TargetApi注解可以消除lint警告,但仍需在API调用前进行版本判断,防止在低版本系统中崩溃。文章探讨了@TargetApi和@SuppressLint的使用区别,并提示全文已迁移。

在做WebView页面截长图功能的过程中,由于API

WebView.enableSlowWholeDocumentDraw()

的调用,出现了一个异常:Call requires API level 21 (current min is 16) 

关于页面截长图功能,感兴趣的话可以看我的另一篇博文:Android实现截屏和截长图功能的几种方法

出现这个异常的原因:项目的minSdkVersion是16,但是上述API调用要求的最低API版本是21。android lint说会“警告此应用程序所针对的所有版本中没有可用的调用”,也就是会出现版本兼容问题,在21以下版本的系统中,应用调用上述API会崩溃。

消除此警告的办法也很简单:在调用上述API的方法体外加注释即可:

@Target(21)

但还需要在API方法调用时做系统版本判断,以在21以下版本的系统中解决调用崩溃的问题:

if (Build.VERSION.SDK_INT >= 21) {              
   WebView.enableSlowWholeDocumentDraw();
}

 

要消除上述警告,还有一个注释可用,略有区别:

 

@SuppressLint("NewApi")

区别在于:

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

抱歉,博客做了下迁移,本文继续阅读请访问:Android bug:@TargetApi(apiVersion) : Call requires API level 21 (current min is 16)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 

 

你遇到的提示: ``` Call requires API level 26 (current min is 24): onAction ``` 是一个 **Android Lint 警告**,表示你调用的方法 `onAction` 只在 **API 级别 26(Android 8.0, Oreo)及以上可用**,而你的应用设置的 `minSdkVersion` 是 24(Android 7.0),因此该调用在低版本设备上运行时会崩溃。 --- ### 🔍 错误原因分析 这个警告通常出现在以下场景中: - 你调用了某个方法(比如 `RemoteActionCompat.onAction()` 或其他系统类中的 `onAction` 方法),但该方法是在 **API 26 才引入的**; - 你的项目 `build.gradle` 中设置了: ```gradle minSdkVersion 24 ``` - 因此 Android Studio 的静态检查工具 Lint 提醒你:如果API 26+ 上运行,此调用会导致 `NoSuchMethodError` 或类似崩溃。 > ⚠️ 注意:即使你使用了 `Build.VERSION.SDK_INT` 判断,Lint 仍会报黄/红,除非显式处理。 --- ### ✅ 正确解决方案:运行时版本检查 + `@TargetApi` / `@RequiresApi` #### ✅ 方案一:【推荐】使用 `Build.VERSION.SDK_INT` 显式判断版本 ```kotlin if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 只在 API 26+ 调用 onAction someObject.onAction() } else { // 降级处理:忽略、日志、替代逻辑等 Log.d("MyTag", "onAction not supported on API < 26") } ``` 这样就能安全地调用高版本 API,同时兼容低版本设备。 --- #### ✅ 方案二:如果你封装了一个只在高版本才执行的方法,使用 `@RequiresApi` 需要导入注解: ```kotlin import android.annotation.TargetApi import android.os.Build @TargetApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O) fun callOnAction() { someObject.onAction() } ``` 然后在调用处仍然要做版本判断: ```kotlin if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { callOnAction() } ``` > 💡 `@TargetApi` 和 `@RequiresApi` 是编译期提示,告诉 Lint 这个方法已确保只在高版本调用。 --- ### 🛠 示例完整代码(Kotlin) 假设你在使用 `RemoteAction` 类的 `onAction()` 方法(实际是私有或受限 API): ```kotlin import android.os.Build import androidx.core.util.Consumer fun safeInvokeOnAction() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 假设这是一个 API 26+ 才有的方法 remoteAction.onAction() } else { // 替代方案或空实现 Log.w("MyFeature", "onAction is not available on API < 26") } } ``` 或者更优雅地结合 `Consumer` 封装回调: ```kotlin val callback: () -> Unit = { Log.d("MyApp", "Action performed") } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 使用 onAction 注册回调 remoteAction.setOnClickAction(callback::invoke) } else { // 使用旧方式,如 PendingIntent 或 Handler button.setOnClickListener { callback() } } ``` --- ### 📦 补充说明:为什么会出现这种问题? | 场景 | 解释 | |------|------| | 使用 Support Library 或 AndroidX 未正确封装 | 某些新功能没有向下兼容包装 | | 直接调用隐藏或新添加的系统 API | 如 `RemoteAction`, `NotificationChannel`, `Autofill` 等 | | 第三方库内部调用了高版本 API 但没做兼容 | 导致你在低版本 crash | --- ### ✅ 如何避免此类问题? 1. **始终查看方法上的 `@RequiresApi(api)` 注解** 2. 使用 Android Studio 的自动提示:按 Alt+Enter 快速修复 3. 使用 AndroidX 库(它们通常已做兼容封装) 4. 在 `minSdkVersion < 26` 时,要直接调用原生 API,优先查文档是否有兼容类 例如: - 使用 `RemoteActionCompat`(虽然目前存在官方版本) - 使用 `PendingIntent` + BroadcastReceiver 兼容旧版通知点击 --- ### 🧩 特殊情况:你是想注册“按键动作”响应? 如果你是在开发 **TV 或可穿戴设备应用**,并试图监听用户操作按钮(如语音助手键、快捷键),建议使用如下兼容方式: ```kotlin // 兼容所有版本的按钮监听 view.setOnClickListener { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { remoteAction.onAction() } else { fallbackAction() } } ``` --- ### ✅ 总结 | 方法 | 是否推荐 | 说明 | |------|----------|------| | `if (SDK_INT >= O)` 判断 | ⭐⭐⭐⭐⭐ | 最安全可靠 | | `@RequiresApi` + 注解 | ⭐⭐⭐⭐ | 配合判断使用 | | 忽略警告(SuppressLint) | ⚠️ 推荐 | 容易导致 Crash | | 强行反射调用 | ⛔ 危险 | 可能被限制(非 SDK 接口) | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值