所有應(yīng)用:無(wú)論 targetSdkVersion 是否小于 28脓钾,都需要修改應(yīng)用以正確支持這些變更。
API 28+ 應(yīng)用的行為變更:指 targetSdkVersion 為 28 或更高的應(yīng)用病蛉。
一: 所有應(yīng)用
1. 后臺(tái)對(duì)傳感器的訪(fǎng)問(wèn)受限
為了增強(qiáng)用戶(hù)隱私椿息,Android 9 限制后臺(tái)應(yīng)用訪(fǎng)問(wèn)用戶(hù)隱私數(shù)據(jù)漓穿,如麥克風(fēng)或攝像頭、連續(xù)報(bào)告模式的傳感器(加速度計(jì)和陀螺儀)残黑、如果需要在運(yùn)行 Android 9 的設(shè)備上檢測(cè)傳感器事件党瓮,請(qǐng)使用前臺(tái)服務(wù)俗冻。
2. 限制訪(fǎng)問(wèn)通話(huà)記錄
如果需要訪(fǎng)問(wèn)通話(huà)記錄或者需要處理去電怨咪,必須向 CALL_LOG 權(quán)限組明確請(qǐng)求這些權(quán)限僚饭。 否則會(huì)發(fā)生 SecurityException。
3. 限制訪(fǎng)問(wèn)電話(huà)號(hào)碼
要從手機(jī)狀態(tài)中讀取電話(huà)號(hào)碼冰木,請(qǐng)根據(jù)您的用例更新應(yīng)用以請(qǐng)求必要的權(quán)限:
要通過(guò) PHONE_STATE Intent 操作讀取電話(huà)號(hào)碼穷劈,同時(shí)需要 READ_CALL_LOG 權(quán)限和 READ_PHONE_STATE 權(quán)限。
要從 onCallStateChanged() 中讀取電話(huà)號(hào)碼踊沸,只需要 READ_CALL_LOG 權(quán)限歇终。 不需要 READ_PHONE_STATE 權(quán)限。
4. 啟動(dòng)Activity
在9.0 中逼龟,不能直接非 Activity 環(huán)境中(比如Service评凝,Application)啟動(dòng) Activity,需要在 Intent 中添加標(biāo)志 FLAG_ACTIVITY_NEW_TASK
Intent intent = new Intent(this, TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
5. 劉海屏適配
如果你的頁(yè)面不需要全屏顯示(顯示的內(nèi)容不在狀態(tài)欄區(qū)域)腺律,那么不需要額外的適配工作奕短。
如果你想利用起來(lái)劉海區(qū)域,就需要獲取劉海位置等信息進(jìn)行適配匀钧。
顯示屏缺口支持
6. 對(duì)使用非 SDK 接口的限制
二:API 28+ 應(yīng)用的行為變更
1. 前臺(tái)服務(wù)
Android 9 開(kāi)始翎碑,啟動(dòng)前臺(tái)服務(wù)必須請(qǐng)求 FOREGROUND_SERVICE 權(quán)限。這是普通權(quán)限之斯,只要在清單文件中聲明即可日杈。
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
2. 構(gòu)建序列號(hào)棄用
在 Android 9 中,Build.SERIAL
始終設(shè)為 "UNKNOWN"
,以保護(hù)用戶(hù)隱私莉擒。
如果需要訪(fǎng)問(wèn)設(shè)備的硬件序列號(hào)酿炸,應(yīng)改為請(qǐng)求 READ_PHONE_STATE
權(quán)限,然后調(diào)用 getSerial()涨冀。
3. 默認(rèn)啟用網(wǎng)絡(luò)傳輸層安全協(xié)議 (TLS)填硕。
如果應(yīng)用以 Android 9 或更高版本為目標(biāo)平臺(tái),則 isCleartextTrafficPermitted() 方法默認(rèn)返回 false鹿鳖。如果需要針對(duì)特定網(wǎng)域啟用明文扁眯,則您必須在應(yīng)用的網(wǎng)絡(luò)安全配置中,針對(duì)這些網(wǎng)域明確將 cleartextTrafficPermitted 設(shè)置為 true栓辜。
解決方案:
(1)后臺(tái)接口改用 https
請(qǐng)求
(2)targetSdkVersion
降到 27 或以下
(3)在清單文件 application
節(jié)點(diǎn)下添加 android:usesCleartextTraffic="true"
原來(lái)默認(rèn)為 true恋拍,但在 Android 9.0 中默認(rèn)值改為了 false,因此將配置手動(dòng)設(shè)為 true 即可解決明文傳輸被限制的問(wèn)題
(4)更改網(wǎng)絡(luò)安全配置:
首先在 res
目錄下新建 xml
文件夾藕甩,添加 network_security_config.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 全部域名使用 http -->
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
也可以指定部分支持的 http 域名:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 部分域名使用 http -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">secure.example.com</domain>
<domain includeSubdomains="true">cdn.example1.com</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml
中的 application
節(jié)點(diǎn)添加該配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
...
</application>
</manifest>
4. Apache HTTP 客戶(hù)端棄用
從 Android 9.0 開(kāi)始,默認(rèn)情況下該庫(kù)已從 bootclasspath 中移除周荐,要想繼續(xù)使用 Apache HTTP狭莱,需要在應(yīng)用的 AndroidManifest.xml 文件中添加:
<manifest ... >
<application>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
...
</application>
</manifest>