Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在低版本SDK调用高版本API?

如何在低版本SDK调用高版本API?

作者头像
吴延宝
发布于 2018-09-10 07:38:50
发布于 2018-09-10 07:38:50
5K10
代码可运行
举报
运行总次数:0
代码可运行

随着Android SDK版本不断的迭代更新,在新的SDK上总是会出现让人眼前一亮非常方便好用的API。但是这些新的API呢在低版本的SDK上是没有的,所以当我们的minSdkVersion的版本低于新API所在的版本时,我们直接使用新API在编译时会出现报错。如果只是想解决编译报错的问题呢,Android给我们提供了两种注解的方式避免编译时报错:

  • @SuppressLint
  • @TargetApi

这两种方法又有什么区别呢?

. SupressLint和TargetApi

SupressLint很显然的意思是忽略Lint检查,对于我们使用高版本API来说,可以使用@SuppressLint("NewApi")的方式让Lint在编译时忽略所调用API对版本的要求。而@TargetApi是忽略特定版本的API调用报错。

举个栗子:当你的项目minSdkVersion=9,你想使用API 11的新的方法时。此时,使用@TargetApi(11)@SuppressLint("NewApi")的效果一样,代码都不会报错。但是如果你使用了Api 19才出现的新的方法时,在使用@TargetApi的方法中还是会给你报错,而在另一个方式中依然不会报错。

那这么讲使用@SuppressLint("NewApi")就更好了?

. 正确的使用姿势

当然不是啦!我们要清楚一点,使用上面两种注释的方式只是让lint在编译时不再报错,在低版本的手机系统中,如果直接使用高版本的API肯定会报:“NoSuchMethod”的Crash的。

所以正确的做法应该是在注解的方法中,做版本判断,在低版本中依然使用老的方式处理。版本判断时我们需要判断具体的版本号,比如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1@TargetApi(9)
 2public void doSomeThing() {
 3    if(Build.VERSION.SDK_INT >= 9) {
 4        // 此时我们正常使用API 9的方法,如果这里误使用了Api 11中的方法,编译时就会报错
 5        // 提醒我们只是引入API 9中的方法
 6    } else {
 7        // TODO 使用老的方式
 8    }
 9}
10
11@SuppressLint("NewApi")
12public void doOthers() {
13    if(Build.VERSION.SDK_INT >= 9) {
14        // 此时我们正常使用API 9的方法,如果这里误使用了Api 11中的方法,编译不会报错
15        // 那么运行在低版本中将会引发Crash的风险
16    } else {
17        // TODO 使用老的方式
18    }
19}

所以,我们推荐使用@TargetApi的方式比较安全。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 南京Android部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
我很疑惑上面说的 “所以当我们的minSdkVersion的版本低于新API所在的版本时,我们直接使用新API在编译时会出现报错。” 我不太明白这句话的意思,为啥是最小版本sdk版本而不是当前系统的版本。我希望https://www.zhihu.com/question/380945917的问题能帮我都解答下
我很疑惑上面说的 “所以当我们的minSdkVersion的版本低于新API所在的版本时,我们直接使用新API在编译时会出现报错。” 我不太明白这句话的意思,为啥是最小版本sdk版本而不是当前系统的版本。我希望https://www.zhihu.com/question/380945917的问题能帮我都解答下
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Android开发笔记(八十二)SDK版本兼容
Android控件很多属性都有默认值,比如文字默认黑色、编辑框默认透明背景等等,但因为android是开源的,各厂商都会自行修修补补,所以很多时候默认值并不靠谱。举例如下: 1、在某些低版本的Android上,如不指定文字颜色textColor,则默认的文字颜色是白色; 2、编辑框有的默认透明背景加一根底线,有的默认白色圆角背景; 3、主题Theme.Holo默认是浅灰背景,但有的品牌手机上改成了深灰背景; 4、调用View的getDrawingCache方法对指定控件截图,默认背景是黑色,而不是我们在UI上看到的透明背景,是不是很惊讶?所以截图前要先设置好背景色。 所以,为了让app在不同设备上都是一样的显示风格,就得自己设置期望的各种属性值,另外也尽量不用系统自带的主题,如有可能自定义主题风格,这样即使设备厂商修改了默认属性值,app也仍然保持统一的风格。
aqi00
2019/01/18
1.1K0
2019年底腾讯Android研发岗面试复盘总结,还是体系的学习效果高
很多打算年初跳槽的,因为疫情的原因放缓了节奏,在家办公,不像平时那么方便去找工作跑面试了。
Android技术干货分享
2020/11/12
6450
2019年底腾讯Android研发岗面试复盘总结,还是体系的学习效果高
《Android编程权威指南》之Android SDK版本与兼容
https://developer.android.com/about/dashboards/index.html
用户8928967
2021/10/13
1.7K0
android下的SuppressLint与TargetApi
其实他们的作用都是屏蔽使用新的方法中的API时报错的问题。打个比方。我写了一个蓝牙操作的demo,它的配置是这样的:
程思扬
2022/01/10
6070
管中窥豹:结合NewApi实践来了解Lint代码扫描
导读 lint是著名的C/C++语言静态代码分析工具之一,Android Lint顾名思义,针对Android的静态代码分析工具,能够对Android项目中潜在的bug、可优化的代码、安全性、性能、可用性、可访问性、国际化等进行检查。 在Android SDK Tools 16及更高的版本中,Lint工具会自动安装。通过对Android工程源代码等进行扫描检查,可发现潜在的问题,更好的提升代码质量。Android Lint提供了命令行方式执行,也与IDE(如Eclipse、Android Studio)集成
腾讯移动品质中心TMQ
2018/02/08
1.5K0
管中窥豹:结合NewApi实践来了解Lint代码扫描
android定义新的api解决一些低版本不能运行的问题
Android Call requires API level 11 (current min is 8)的解决方案 【错误描述】     在用Eclipse开发过程中,为了兼容Android2.2和4.0以上版本,我在使用Notification类时做了2个版本的代码,代码根据系统版本不同执行相应模块,结果,等我输完代码,发现系统提示了一个这么的错误。 【原因分析】     不详,可能和Run Android Lint有点关系吧。就是创建项目时,我们设置了最低版本API Level,比如我的是8,因此,E
xiangzhihong
2018/01/29
7910
高版本->低版本迁移,低版本客户端连接高版本数据库EXP导出报错
需求:迁移部分表 11.2.0.3-->10.2.0.4,若迁移范围内的有些表在目标库已经存在,则替换。
Alfred Zhao
2019/05/24
2K0
关于Android中@SuppressLint(“NewApi“)、@TargetApi和@RequiresApi的区别
当我们使用一个较高版本才有的api时,编译器会报错,这个注解的作用仅仅是让编译通过,而并没有避免低版本的系统运行高版本的api的问题,在使用时我们需要自己判断版本号来使用不同的api。 目前官方建议使用@RequiresApi。
易帜
2022/02/09
1.3K0
[android] notification入门
通知栏,对话框,Toast是我们接触的三个提示框,通知栏是在系统的应用com.adnroid.systemui当中的
唯一Chat
2019/09/10
5280
语法降级与Polyfill:消灭低版本浏览器兼容问题
提到前端编译工具链方面,可能大家最新想到的是诸如@babel/preset-env、core-js、regenerator-runtime等工具。不过,我们今天要讲的是官方的 Vite 插件@vitejs/plugin-legacy,以及如何将这些底层的工具链接入到 Vite 中,并实现开箱即用的解决方案。
xiangzhihong
2023/07/09
4.1K1
语法降级与Polyfill:消灭低版本浏览器兼容问题
开发一款 SDK 需要注意哪些问题
当业务方的 Java 环境是 1.8 时,如果 SDK 是使用 Java 11 编译,则调用 SDK 相关代码的地方在编译时将会报错:
codelang
2024/02/17
3360
开发一款 SDK 需要注意哪些问题
Android之注解的使用介绍
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
李小白是一只喵
2021/07/08
6560
低版本Docker升级高版本Docker【详细教程、成功避坑】
推荐修改CentOS下的/etc/selinux/config 将SELINUX=disabled 改成 SELINUX=permissive
互联网-小阿宇
2022/11/21
7.8K0
低版本Docker升级高版本Docker【详细教程、成功避坑】
深入浅出Java注解
注解对于开发人员来讲既熟悉又陌生,熟悉是因为只要你是做开发,都会用到注解(常见的@Override);陌生是因为即使不使用注解也照常能够进行开发;注解不是必须的,但了解注解有助于我们深入理解某些第三方框架(比如Android Support Annotations、JUnit、xUtils、ActiveAndroid等),提高工作效率。
open
2020/03/19
7680
深入浅出Java注解
模仿安卓源码,手写过时的方法兼容低版本
我们经常会使用getColor(R.color.XXX)获取颜色的资源文件,但是在安卓6.0开始,这个方法被标注为过时,推荐使用两个参数的方法替代,如下图所示:
AWeiLoveAndroid
2018/09/03
6870
模仿安卓源码,手写过时的方法兼容低版本
Android 调试小技巧
最近在调试公司中的Android项目时,遇到的一些问题,及时做个总结,以免后面再遇到这类问题时再浪费时间。
音视频_李超
2020/04/02
8610
vue低版本浏览器兼容性(20181224更新)
promise在低版本浏览器需要通过pollyfill处理不同浏览器对promise解析的差问题,处理方法为,在main.js里加入如下代码 import promise from 'es6-promise'; promise.polyfill(); webpack中的babel处理的目录是在webpack.base.conf.js中通过includes配置的,默认没有包含node_modules下的库文件,某些npm包没有做es6新语法的处理,我们的webpack又没有编译这部分文件,就会报错,最常见的就
fastmock
2022/07/13
9890
美团外卖Android Lint代码检查实践
总第237篇 2018年 第29篇 概述 Lint是Google提供的Android静态代码检查工具,可以扫描并发现代码中潜在的问题,提醒开发人员及早修正,提高代码质量。除了Android原生提供的几百个Lint规则,还可以开发自定义Lint规则以满足实际需要。 为什么要使用Lint 在美团外卖Android App的迭代过程中,线上问题频繁发生。开发时很容易写出一些问题代码,例如Serializable的使用:实现了Serializable接口的类,如果其成员变量引用的对象没有实现Serializab
美团技术团队
2018/06/07
2.3K3
Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife
  最近发现这个项目好似迎来了第二春,GitHub上的Start和Fork增加的很快,我的猜测是学生在通过这个项目来学习和完成自己的作业。随着Android版本的更新,Android Studio的更新,项目中一些内容不能在新版本中很好的使用,甚至出现编译不了的情况,这对我来说没啥,但是对于拿到项目满心欢喜的学生来说,运行不了,无疑是致命的,而我写在项目Readme下面我将演示一下怎么在本地运行这个项目的代码。
晨曦_LLW
2022/11/14
1.4K0
Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife
Xcode14编译的APP低版本崩溃
测试说iOS 12的手机上安装Xcode14.0.2导出的新包后,打开就崩溃,但是在系统版本高的手机上就没有问题。
莫空9081
2022/10/11
3.4K1
推荐阅读
相关推荐
Android开发笔记(八十二)SDK版本兼容
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验