Android targetSdkVersion升級到28在9.0系統(tǒng)遇到的問題

最近將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種:

  1. 全部切換為 https,不過目前看起來不太現(xiàn)實,因為 app 里除了本公司的 http 請求外,可能會對接很多第三方服務(wù),對應(yīng)第三方的東西我們無法控制;
  2. 在 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ù)更新中...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容