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

正确的做法

为了运行时不报错, 需要:

  1. 判断运行时版本,在低版本系统不调用此方法
  2. 同时为了保证功能的完整性,需要提供低版本功能实现

    如下:

    /**
     * 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的方法需要:

  1. @TargeApi($API_LEVEL) 使可以编译通过, 不建议使用@SuppressLint("NewApi");
  2. 运行时判断API level; 仅在足够高,有此方法的API level系统中,调用此方法;
  3. 保证功能完整性,保证低API版本通过其他方法提供功能实现。

推荐:

时间: 2024-10-26 03:23:51

Android 高版本API方法在低版本系统上的兼容性处理的相关文章

SqlServer高版本数据本分还原到低版本方法

最近遇见一个问题: 想要将Sqlserver高版本备份的数据还原到低版本SqlServer上去,但是这在SqlServer中是没法直接还原数据库的,所以经过一系列的请教总结出来一下可用方法. 首先.你得在电脑上装有你将要操作的高版本以及低版本的SqlServer或者你能够连上SqlServer高版本所在的数据库(便于后面拷贝数据), 第二步.打开高版本数据库中你需要备份的数据库,将你备份的数据库相关的登录名或者用户删除.右键数据库->任务->生成脚本.在生成脚本的“选择对象”步骤选择“编写整个

Android API在不同版本系统上的兼容性

随着安卓版本的不断更新,新的API不断涌出,有时候高版本的API会在低版本crash的. 如果minSdkVersion设置过低,在build的时候,就会报错(Call requires API level 17 (current min is 9)): 这时候为了编译可以通过,可以添加 @SuppressLint("NewApi") 或者 @TargeApi(9)注解. 这样只是编译通过,运行时依然会crash的. 正确的做法 为了运行时不报错, 需要: 判断运行时版本,在低版本系统

如何将access高版本数据库保存为低版本的?

打开高版本的access,点击打开,选择数据库文件,当前对话框中打开按钮旁边有个小的下拉三角形,点开,点击以独占的方式打开. 打开数据库后在[文件]/[保存并发布]选择低版本的数据库. #access 如何将access高版本数据库保存为低版本的?

如何把高版本的sqlserver 还原到低版本的 sqlserver

原文:如何把高版本的sqlserver 还原到低版本的 sqlserver 本例为sql2012 还原到sql2008. 要实现的功能是把sql2012的数据库备份到sql2008,数据库名字为Test,并且这两个数据库在不同的电脑中. 微软的软件设计方案基本上都是新版本兼容旧版本,旧版本不兼容新版本 步骤如下: 1.首先把要把sql2012中要备份的数据库设置为兼容2008. 右键sql2012中的数据库Test-属性-选项  看到如下图: 2.右键Test-任务-生成脚本,下一步-下一步到达

split方法在低版本IE浏览器上无法解析的问题

今天在项目中发现一个很诡异的问题,通过js获取cookie时,发现赋给用户name的时候IE9和低于9以下的浏览器对比时获取到的名字不一样,通过调试发现是split方法在解析||时当值为空时就会出现被“吃掉”的问题. 当我们在开发的过程想要对特定的字符进行分割,首相想到的就是使用split函数,这样是一个效率非常高的方法.但是让人叹息的是该方法虽然可以在Chrome和Firefox正常运作,但是在低版本IE浏览器却无法正常工作,IE9及以上版本都没有问题.split方法是支持正则表达式的,ES中

用VC2010以上版本编译可以在低版本XP和2003的运行程序的方法

2013-09-17   作者:佚名   来源:本站整理   浏览:2001   评论:1 一直以来倍受此事困拢,vc2010以上版本编译出的exe或dll总是会引用kernel32.dll的EncodePointer和DecodePointer两个api,这两个api在xp sp2以下版本上找不到,虽然这种版本用户较少,但总有人在用,微软这贱人又不考虑这种低端用,无奈之下,我用过3种方法,记录如下. 1.使用vc2008的库,用2010的编译器.这种方法需要先找一份vc2008的库,而且在工程

Oracle 数据迁移(从Oracle11G高版本迁移到Oracle10G低版本)

1,数据库状况    生产环境是11G,linux系统,测试环境是10G,windows系统,需要从生产环境导出一个用户下所有的数据,导入测试环境中.    因为数据量比较小,准备采用EXP和IMP工具来做. 2,在生产环境上导出用户数据    命令:       exp \'system/syspl as sysdba\' owner=PLAS buffer=10240000 FILE=/tmp/PLAS_20141113.DMP 执行过程:[[email protected] ~]$  ex

Object.create()方法的低版本兼容问题

Object.prototype.create = function(obj) { if(Object.prototype.create){ return Object.prototype.create //特性检测,判断浏览器是否兼容 }else{ function F(){ F.prototype = obj; //以传入参数为原型构造对象 return new F(); } } };

高版本的xcode使用低版本的Simulator

1.打开xcode5.0的目录:Finder中点击“应用程序”,找到xcode,右击选择“显示包内容”,进入“Contents—Developer—Platforms—iPhoneOS.platform—Developer—SDKs”2.加载xcode4.6的安装包,同样“显示包内容”,定位到与上方(1)相同目录,将其中的“iPhoneOS6.1.sdk”,复制到xcode5.0的上方目录中3.打开xcode5.0的Contents—Developer—Platforms—iPhoneSimul