Android 高版本API方法在低版本系統(tǒng)上的兼容性處理
Android 版本更替,新的版本帶來新的特性,新的方法。
新的方法帶來許多便利,但無法在低版本系統(tǒng)上運(yùn)行,如果兼容性處理不恰當(dāng),APP在低版本系統(tǒng)上,運(yùn)行時將會crash。
本文以一個具體的例子說明如何在使用高API level的方法時處理好兼容性問題。
例子:根據(jù)給出路徑,獲取此路徑所在分區(qū)的總空間大小。
在安卓中的文件存儲使用參考中提到:
獲取文件系統(tǒng)用量情況,在API level 9及其以上的系統(tǒng),可直接調(diào)用File對象的相關(guān)方法,以下需自行計(jì)算
一般實(shí)現(xiàn)
就此需求而言,API level 9及其以上,調(diào)用 File.getTotalSpace() 即可, 但是在API level 8 以下系統(tǒng)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設(shè)置為8,那么build時候會報以下錯誤:
Call requires API level 9 (current min is 8)
為了編譯可以通過,可以添加 @SuppressLint("NewApi") 或者 @TargeApi(9)。
用@TargeApi($API_LEVEL)顯式表明方法的API level要求,而不是@SuppressLint("NewApi");
但是這樣只是能編譯通過,到了API level8的系統(tǒng)運(yùn)行,將會引發(fā) java.lang.NoSuchMethodError。
正確的做法
為了運(yùn)行時不報錯, 需要:
判斷運(yùn)行時版本,在低版本系統(tǒng)不調(diào)用此方法
同時為了保證功能的完整性,需要提供低版本功能實(shí)現(xiàn)
如下:
/** * 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(); } } }
總結(jié)
在使用高于minSdkVersion API level的方法需要:
- 用@TargeApi($API_LEVEL) 使可以編譯通過, 不建議使用@SuppressLint("NewApi");
- 運(yùn)行時判斷API level; 僅在足夠高,有此方法的API level系統(tǒng)中,調(diào)用此方法;
- 保證功能完整性,保證低API版本通過其他方法提供功能實(shí)現(xiàn)。
通過此文希望能幫助到您,解決Android版本API兼容性問題!謝謝大家對本站的支持!
相關(guān)文章
Android調(diào)用默認(rèn)瀏覽器打開指定Url的方法實(shí)例
業(yè)務(wù)員有需求要將一個wap站在手機(jī)上以App的形式打開,還不要嵌套WebView,只能以瀏覽器打開.查了點(diǎn)資料,就有了下面這代碼2013-09-09Android自定義圓弧進(jìn)度條加數(shù)字動態(tài)變化
這篇文章主要為大家詳細(xì)介紹了Android自定義圓弧進(jìn)度條加數(shù)字動態(tài)變化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07Android實(shí)現(xiàn)手機(jī)定位的案例代碼
今天小編就為大家分享一篇關(guān)于Android實(shí)現(xiàn)手機(jī)定位的案例代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03Android 四種動畫效果的調(diào)用實(shí)現(xiàn)代碼
在這里, 我將每種動畫分別應(yīng)用于四個按鈕為例,需要的朋友可以參考下2013-01-01Android實(shí)現(xiàn)拍照及圖片裁剪(6.0以上權(quán)限處理及7.0以上文件管理)
本篇文章主要介紹了Android實(shí)現(xiàn)拍照及圖片裁剪(6.0以上權(quán)限處理及7.0以上文件管理),非常具有實(shí)用價值,需要的朋友可以參考下2017-10-10Android利用滑動菜單框架實(shí)現(xiàn)滑動菜單效果
這篇文章主要介紹了Android實(shí)現(xiàn)滑動菜單特效之滑動菜單框架完全解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05android項(xiàng)目從Eclipse遷移到Android studio中常見問題解決方法
android項(xiàng)目從Eclipse遷移到Android studio中經(jīng)常會遇到一些問題,本文提供了Android studio使用中常見問題解決方法2018-03-03Android開發(fā)之ProgressBar字體隨著進(jìn)度條的加載而滾動
這篇文章主要介紹了Android開發(fā)之ProgressBar字體隨著進(jìn)度條的加載而滾動,需要的朋友可以參考下2017-09-09android 布局之ConstraintLayout的使用
這篇文章主要介紹了android 布局之ConstraintLayout的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04Flutter實(shí)現(xiàn)軟鍵盤與其它區(qū)域絲滑切換效果
這篇文章主要為大家詳細(xì)介紹了如何使用Flutter實(shí)現(xiàn)軟鍵盤與其它區(qū)域絲滑切換效果,文中的示例代碼講解詳細(xì),需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03