Android 高版本API方法在低版本系统上的兼容性处理
Android 版本更替,新的版本带来新的特性,新的方法。
新的方法带来许多便利,但无法在低版本系统上运行,如果兼容性处理不恰当,APP在低版本系统上,运行时将会crash。
本文以一个具体的例子说明如何在使用高API level的方法时处理好兼容性问题。
例子:根据给出路径,获取此路径所在分区的总空间大小。
在安卓中的文件存储使用参考中提到:
获取文件系统用量情况,在API level 9及其以上的系统,可直接调用
File对象的相关方法,以下需自行计算
一般实现
就此需求而言,API level 9及其以上,调用 File.getTotalSpace() 即可, 但是在API level 8 以下系统File对象并不存在此方法。
如以下方法:
/**
 * Returns the total size in bytes of the partition containing this path.
 * Returns 0 if this path does not exist.
 *
 * @param path
 * @return -1 means path is null, 0 means path is not exist.
 */
public static long getTotalSpace(File path) {
    if (path == null) {
        return -1;
    }
    return path.getTotalSpace();
}
处理无法编译通过
如果minSdkVersion设置为8,那么build时候会报以下错误:
Call requires API level 9 (current min is 8)
为了编译可以通过,可以添加 @SuppressLint("NewApi") 或者 @TargeApi(9)。
用
@TargeApi($API_LEVEL)显式表明方法的API level要求,而不是@SuppressLint("NewApi");
但是这样只是能编译通过,到了API level8的系统运行,将会引发 java.lang.NoSuchMethodError。
正确的做法
为了运行时不报错, 需要:
- 判断运行时版本,在低版本系统不调用此方法
- 同时为了保证功能的完整性,需要提供低版本功能实现 - 如下: - /**
 * Returns the total size in bytes of the partition containing this path.
 * Returns 0 if this path does not exist.
 *
 * @param path
 * @return -1 means path is null, 0 means path is not exist.
 */
 @TargetApi(Build.VERSION_CODES.GINGERBREAD)
 // using @TargeApi instead of @SuppressLint("NewApi")
 @SuppressWarnings("deprecation")
 public static long getTotalSpace(File path) {
 if (path == null) {
 return -1;
 }
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
 return path.getTotalSpace();
 }
 // implements getTotalSpace() in API lower than GINGERBREAD
 else {
 if (!path.exists()) {
 return 0;
 } else {
 final StatFs stats = new StatFs(path.getPath());
 // Using deprecated method in low API level system,
 // add @SuppressWarnings("description") to suppress the warning
 return (long) stats.getBlockSize() * (long) stats.getBlockCount();
 }
 }
 }
 
总结
在使用高于minSdkVersion API level的方法需要:
- 用@TargeApi($API_LEVEL)使可以编译通过, 不建议使用@SuppressLint("NewApi");
- 运行时判断API level; 仅在足够高,有此方法的API level系统中,调用此方法;
- 保证功能完整性,保证低API版本通过其他方法提供功能实现。
Android 高版本API方法在低版本系统上的兼容性处理的更多相关文章
- SqlServer高版本数据本分还原到低版本方法
		最近遇见一个问题: 想要将Sqlserver高版本备份的数据还原到低版本SqlServer上去,但是这在SqlServer中是没法直接还原数据库的,所以经过一系列的请教总结出来一下可用方法. 首先.你 ... 
- Android API在不同版本系统上的兼容性
		随着安卓版本的不断更新,新的API不断涌出,有时候高版本的API会在低版本crash的. 如果minSdkVersion设置过低,在build的时候,就会报错(Call requires API le ... 
- 从高版本JDK换成低版本JDK报错Unsupported major.minor version 52.0的解决方案
		从高版本JDK换成低版本JDK报错Unsupported major.minor version 52.0 java.lang.UnsupportedClassVersionError: PR/Sor ... 
- 高版本SQL备份在低版本SQL还原问题
		问题描述: 高版本SQL备份在低版本SQL还原问题(出现媒体簇的结构不正确) 分析原因: SQL版本兼容问题,SQL SERVER兼容级别是用作向下兼容用,高版本的SQL备份在低版本中不兼容 ... 
- windows下多个python版本共存,如何在Windows7系统上安装最新的64位Python3.6.2
		windows下多个python版本共存,如何在Windows7系统上安装最新的64位Python3.6.2 1.官网下载python3.6.2https://www.python.org/ftp/p ... 
- iOS高版本备份恢复到低版本系统的方法
		一般来说,在更新iOS系统的时候我们都会建议大家先用iTunes对系统进行完整备份.但时不时都会有人偷懒,或者使用手机OTA升级而没有对系统备份,最终导致不满意新系统了,想降级却无备份可以恢复的尴尬局 ... 
- 从高版本JDK换成低版本JDK报错Unsupported major.minor version 52.0
		ava.lang.UnsupportedClassVersionError: PR/Sort : Unsupported major.minor version 52.0这个错误是由于高版本的java ... 
- split方法在低版本IE浏览器上无法解析的问题
		前一篇不知道怎么被博客园给删了,重新补发一个. 最近在项目中发现一个很诡异的问题,通过js获取cookie时,发现赋给用户name的时候IE9和低于9以下的浏览器对比时获取到的名字不一样,通过调试发现 ... 
- SqlServer高版本数据备份还原到低版本(转)
		原文地址:https://www.jb51.net/article/96454.htm 想要将Sqlserver2014高版本备份的数据还原到低版本SqlServer2008R2上去,但是这在SqlS ... 
随机推荐
- iPhone新建项目不能全屏
			上个周做项目的时候,发现新建了一个项目不能全屏.伤透了我的脑筋,然后又请教了团队里其他两个大牛帮我搞定了这个问题. 虽然是搞定了,但也看的出大牛也是云里雾里.歪打正着解决的. 今天又想新做个项目,这个 ... 
- Hexo博客收录百度和谷歌-基于Next主题
			Hexo博客收录百度和谷歌-基于Next主题(应该是比较全面的一篇教程) 我们的博客做出来当然是希望别人来访问,但是Github和Coding都做了防爬虫处理,这样子我们博客可能就无法被搜索引擎收录, ... 
- HttpWebRequest调用WebService后台需要Session信息问题的解决办法
			今天在用HttpWebRequest调用后台ASP.NET 的WebService方法时遇到了一个问题,后台的WebService方法里使用到了Session对象中的用户信息,而Session对象中的 ... 
- PHP面向对象 封装与继承
			知识点: PHP封装三个关键词: 一.public 公有的,被public修饰的属性和方法,对象可以任意访问和调用 二.private 私有的,被private修饰的属性和方法,只能在类内部的方法可以 ... 
- POJ 2942 Knights of the Round Table 补图+tarjan求点双联通分量+二分图染色+debug
			题面还好,就不描述了 重点说题解: 由于仇恨关系不好处理,所以可以搞补图存不仇恨关系, 如果一个桌子上面的人能坐到一起,显然他们满足能构成一个环 所以跑点双联通分量 求点双联通分量我用的是向栈中pus ... 
- vue动态(type可变)input绑定
			遇到如下错误: v-model does not support dynamic input types 解决方法: vue 2.5.0以上,支持动态绑定 <input :type=" ... 
- 收藏一个JavaScript字符串连接方法
			最近在看一同事写的代码时,有一个字符串用了一堆"+"号,看了半天没明天到底会输出什么样的内容,就想到用字符串连接的类,把以前的方法写成了类的方式,方便调用.下面的类支持实例调用和静 ... 
- 华中农业大学第四届程序设计大赛网络同步赛 I
			Problem I: Catching Dogs Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1130 Solved: 292[Submit][St ... 
- java算法(二) 快速排序
			快速排序是一种交换排序. 快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数. 然后再 ... 
- HTTP Basic 机制
			package com.enation.app.shop.component.payment.plugin.cod; import java.io.IOException; import java.u ... 
