后臺定位權(quán)限
AndroidQ新引入了后臺定位權(quán)限赵辕,是危險權(quán)限需要代碼動態(tài)申請
<!--允許App在后臺獲得位置信息-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
這個權(quán)限必須配合下面兩個權(quán)限使用,單獨寫沒有任何效果
<!--允許獲得精確的GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--允許獲得粗略的基站網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Google加入這個權(quán)限邻遏,意在將App是否能定位的權(quán)利分為前臺和后臺分別交給用戶決定,減少App在后臺靜默定位的可能性,減少用戶的個人信息的泄露森渐。
Android Q后臺定位權(quán)限的更改總而言之就是,如果項目中沒有用到后臺實時定位冒晰,則并無多大改動同衣;如果涉及到后臺定位,那就需要同定位權(quán)限一同去申請授權(quán)即可壶运。
唯一標(biāo)識符更改
AndroidQ對設(shè)備的系統(tǒng)標(biāo)識增加了更多的限制和修改耐齐,AndroidQ將徹底禁止第三方應(yīng)用獲取設(shè)備的imei序列號,無論你是以target多少版本編譯的應(yīng)用,都不能在AndroidQ的設(shè)備上獲得設(shè)備標(biāo)識符埠况。所以如果你只是想得到唯一標(biāo)識符耸携,請不要再加入READ_PHONE_STATE權(quán)限,不會生效辕翰。
如果你的應(yīng)用可以加入系統(tǒng)級應(yīng)用夺衍,那么你需要加入權(quán)限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission. READ_PRIVILEGED_PHONE_STATE"/>
READ_PRIVILEGED_PHONE_STATE為系統(tǒng)級別權(quán)限,第三方應(yīng)用加入無效喜命。
如果依然使用獲取imel相關(guān)的代碼時
如果應(yīng)用以 Android Q 為目標(biāo)平臺沟沙,則會發(fā)生 SecurityException。
如果應(yīng)用以 Android 9(API 級別 28)或更低版本為目標(biāo)平臺渊抄,則相應(yīng)方法會返回 null 或占位符數(shù)據(jù)(如果應(yīng)用具有 READ_PHONE_STATE 權(quán)限)尝胆。否則,會發(fā)生 SecurityException护桦。
使用 Android 標(biāo)識符的最佳做法:https://developer.android.com/training/articles/user-data-ids
一個不變和基本不重復(fù)的UUID方法:
public static String getUUID() {
String serial = null;
String m_szDevIDShort = "35" +
Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
Build.USER.length() % 10; //13 位
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
serial = android.os.Build.getSerial();
} else {
serial = Build.SERIAL;
}
//API>=9 使用serial號
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
} catch (Exception exception) {
//serial需要一個初始化
serial = "serial"; // 隨便一個初始化
}
//使用硬件信息拼湊出來的15位號碼
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
后臺Activity啟動限制
AndroidQ加強(qiáng)了關(guān)于后臺Activity的啟動限制含衔,App不可以隨意的從后臺拉起Activity:https://developer.android.com/preview/privacy/background-activity-starts
從 Android Q 測試版 5 開始,此項變更具有以下特性:
如果您在未與用戶互動的情況下啟動 Activity二庵,則會影響您的應(yīng)用
使用由通知觸發(fā)的 Activity 進(jìn)行緩解
通過開啟允許系統(tǒng)執(zhí)行后臺活動開發(fā)者選項停用限制
該行為變更仍會在設(shè)備升級到 Android Q 后生效贪染。
分區(qū)存儲
為了讓用戶更好地控制自己的文件,減少文件混亂情況催享,Android Q 更改了應(yīng)用對設(shè)備外部存儲設(shè)備中的文件(例如存儲在路徑
/sdcard
下的文件)的訪問方式杭隙。Android Q 會繼續(xù)使用READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
權(quán)限,這些權(quán)限與面向用戶的存儲運行時權(quán)限相對應(yīng)因妙。
不過痰憎,默認(rèn)情況下,以 Android Q 為目標(biāo)平臺的應(yīng)用(以及選擇接受這些變更的應(yīng)用)在訪問外部存儲設(shè)備中的文件時會進(jìn)入過濾視圖攀涵。此類應(yīng)用只能查看特定于應(yīng)用的目錄和特定類型的媒體铣耘,因此應(yīng)用無需請求任何其他用戶權(quán)限。在早期測試版(READ_MEDIA_IMAGES以故、READ_MEDIA_AUDIO 和 READ_MEDIA_VIDEO)中引入的特定于媒體集合的權(quán)限現(xiàn)已過時蜗细。
相機(jī)和網(wǎng)絡(luò)連接變更
訪問所有相機(jī)信息都需要獲得權(quán)限
Android Q 更改了 getCameraCharacteristics() 方法默認(rèn)返回的信息的廣度。具體而言怒详,您的應(yīng)用必須具有 CAMERA 權(quán)限才能訪問此方法的返回值中可能包含的設(shè)備特定元數(shù)據(jù)炉媒。
對啟用和停用 WLAN 的限制
以 Android Q 為目標(biāo)平臺的應(yīng)用無法啟用或停用 WLAN。WifiManager.setWifiEnabled() 方法始終返回 false昆烁。
如果需要吊骤,請使用設(shè)置面板提示用戶啟用和停用 WLAN。
WLAN 網(wǎng)絡(luò)配置限制
為了保護(hù)用戶隱私静尼,現(xiàn)在只有系統(tǒng)應(yīng)用和設(shè)備政策控制器 (DPC) 支持手動配置系統(tǒng)的 WLAN 網(wǎng)絡(luò)列表水援。給定 DPC 可以是設(shè)備所有者或配置文件所有者密强。
如果您的應(yīng)用不屬于以上其中一個類別,而且以 Android Q 為目標(biāo)平臺蜗元,則下列方法將不再返回有用數(shù)據(jù):
-
getConfiguredNetworks()
方法始終返回空列表或渤。 - 每個返回整數(shù)值的網(wǎng)絡(luò)操作方法(
addNetwork()
和updateNetwork()
)始終返回 -1。 - 每個返回布爾值的網(wǎng)絡(luò)操作(
removeNetwork()
奕扣、reassociate()
薪鹦、enableNetwork()
、disableNetwork()
惯豆、reconnect()
和disconnect()
)始終返回false
池磁。
注意:如果運營商應(yīng)用調(diào)用 getConfiguredNetworks()
,系統(tǒng)便會返回僅包含運營商配置的網(wǎng)絡(luò)的列表楷兽。
如果您的應(yīng)用需要連接到 WLAN 網(wǎng)絡(luò)地熄,請使用以下備用方法:
- 要觸發(fā)與 WLAN 網(wǎng)絡(luò)的即時本地連接,請在標(biāo)準(zhǔn)
NetworkRequest
對象中使用WifiNetworkSpecifier
芯杀。 - 要添加 WLAN 網(wǎng)絡(luò)以便考慮為用戶提供互聯(lián)網(wǎng)訪問權(quán)限端考,請使用
WifiNetworkSuggestion
對象。您可以通過分別調(diào)用addNetworkSuggestions()
和removeNetworkSuggestions()
添加和移除在自動連接網(wǎng)絡(luò)選擇對話框中顯示的網(wǎng)絡(luò)揭厚。這些方法不需要任何位置權(quán)限却特。
telephony API、WLAN API 和 Bluetooth API 需要精確位置權(quán)限
除非您的應(yīng)用具有 ACCESS_FINE_LOCATION
權(quán)限筛圆,否則應(yīng)用在 Android Q 上運行時無法使用 WLAN API裂明、Wi-Fi Aware API 或 Bluetooth API 中的多種方法。下面列出了受影響的方法太援。
注意:如果您的應(yīng)用在 Android Q 上運行但以 Android 9(API 級別 28)或更低版本為目標(biāo)平臺闽晦,則只要您的應(yīng)用具有 ACCESS_COARSE_LOCATION
或 ACCESS_FINE_LOCATION
權(quán)限,您就可以使用受影響的 API提岔。