最近將targetSdkVersion升級為28了,升級之后在Android 9.0及以上系統(tǒng)中,發(fā)生了一些兼容性問題,現(xiàn)在把實際項目中碰到的問題總結(jié)如下:
1. HTTP請求被禁止
碰到的第一個問題就是,發(fā)現(xiàn)在 Android 9.0 系統(tǒng)的手機中,所有 http 的接口或鏈接都無法訪問了,但是在 9.0 以下的系統(tǒng)中是沒有這個問題的。經(jīng)過查閱資料,原因是早在 6.0 系統(tǒng)時,Android 就引入了對 https 的推薦支持,從 9.0 系統(tǒng)開始,默認所有的 http 請求都被認為是不安全的請求,全被系統(tǒng)阻止了。解決方案有2種:
- 全部切換為 https,不過目前看起來不太現(xiàn)實,因為 app 里除了本公司的 http 請求外,可能會對接很多第三方服務(wù),對應(yīng)第三方的東西我們無法控制;
- 在 AndroidManifest.xml 的 application 里增加配置
android:usesCleartextTraffic="true",強制允許使用 http 請求,這是推薦的做法;
2. EditText 不會自動獲取焦點
在 9.0 中我們發(fā)現(xiàn)好多頁面的輸入框,在頁面進入時,不會自動獲得焦點,必須手動點擊一下輸入框,該輸入框才會獲得焦點。這個特別影響用戶體驗,特別是像注冊登錄頁面,頁面進入后我們都是自動彈出輸入法,用戶可以直接輸入文本。但是現(xiàn)在是軟鍵盤雖然可能彈出了,但是沒有任何一個輸入框獲得焦點,也無法直接輸入文本了。
后來找到原因是:9.0開始不再隱式分配觸摸模式下的初始焦點。 也就是說在 9.0 以前的系統(tǒng)中,如果一個頁面中有類似 EditText 之類的輸入框存在的話,Activity 打開時會默認將焦點分配在第一個 EditText 上,但是現(xiàn)在則不會了,你必須通過代碼手動請求初始焦點(如果需要的話)。
EditText et;
et.requestFocus()
3. Apache HttpClient 被棄用
這是從 bugly 上看到的一個錯誤:
java.lang.NoClassDefFoundError:Failed resolution of: Lorg/apache/http/conn/scheme/SchemeRegistry;
com.tencent.open.utils.HttpUtils.getHttpClient(ProGuard:626)
......
Caused by:
java.lang.ClassNotFoundException:Didn't find class "org.apache.http.conn.scheme.SchemeRegistry"
從網(wǎng)上找到的資料說:從 6.0 開始 sdk 就已經(jīng)移除了 HttpClient 相關(guān)的 api,從 9.0 開始 org.apache.http.legacy 庫將從 bootclasspath 中刪除。說實話,還在用 HttpClient 的也是老古董的產(chǎn)品了,現(xiàn)在誰不用 OkHttp 呢。但是上面這個錯誤,我們發(fā)現(xiàn)是在 9.0 系統(tǒng)的手機上,通過騰訊QQ分享時引起的一個閃退。這真的是很蛋疼的事情,騰訊QQ的分享 SDK 居然有用到 HttpClient 的東西,目前我們又不能把它剔除掉,那怎么解決呢,幸好還有辦法:
<application>
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
</application>
后面可能還會碰到更多的問題,持續(xù)更新中...