之前为了完成Android应用兼容性测试,特地去Android sdk 官网查看各个API版本之间的差异,并总结了一下,现将分享一下。
API 28
使用前台服务的应用必须请求 FOREGROUND_SERVICE 权限
Build.SERIAL 始终设置为 "UNKNOWN"(请求 READ_PHONE_STATE 权限,然后调用 getSerial)
以 Android 9 为目标平台的应用应采用私有 DNS API。 具体而言,当系统解析程序正在执行 DNS-over-TLS 时,应用应确保任何内置 DNS 客户端均使用加密的 DNS 查找与系统相同的主机名,或停用它而改用系统解析程序。
在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用
0 面积的视图(即宽度或高度为 0)再也不能被聚焦。
以 Android 9 或更高版本为目标的应用必须支持草案版 CSS 颜色模块级别 4 的行为(#80ff8080 将被解读为 50% 透明浅绿 (#80ff80))
在 Android 9 之前,暂停的应用发出的通知会被取消。 从 Android 9 开始,暂停的应用发出的通知将被隐藏,直至应用继续运行。
电源管理
UsageStatsManager.getAppStandbyBucket() 查找当前属于哪个群组(活跃、 工作集、 常用、 极少使用(网络)、 从未使用)后台对传感器的访问受限(不能访问麦克风或摄像头 使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件 使用变化或一次性报告模式的传感器不会接收事件)
限制访问通话记录 ( READ_CALL_LOG、WRITE_CALL_LOG 和 PROCESS_OUTGOING_CALLS 移入CALL_LOG 权限组)
API 26
颜色 #80ff8080 目前在 WebView 中被渲染为不透明浅红色 (#ff8080)。 先导部分(Android 会将其解读为 Alpha 部分)目前被忽略
com.android.launcher.action.INSTALL_SHORTCUT 广播不再会对您的应用有任何影响,因为它现在是私有的隐式广播
在 Android 8.0 中,以下函数使用 Locale.getDefault(Category.DISPLAY) 来代替 Locale.getDefault()
如果应用使用 SYSTEM_ALERT_WINDOW 权限并且尝试使用以下窗口类型之一来在其他应用和系统窗口上方显示提醒窗口:
• TYPE_PHONE
• TYPE_PRIORITY_PHONE
• TYPE_SYSTEM_ALERT
• TYPE_SYSTEM_OVERLAY
• TYPE_SYSTEM_ERROR
这些窗口将始终显示在使用 TYPE_APPLICATION_OVERLAY 窗口类型的窗口下方
- Android 8.0 对 ScanRecord.getBytes() 函数检索的数据长度做出以下变更:
• getBytes() 函数对于所接收的字节数不作任何假定。因此,应用不应受所返回的任何最小或最大字节数的影响。相反,应用应当计算所返回数组的长度。
• 兼容蓝牙 5 的设备返回的数据长度可能会超出之前最大约 60 个字节的限制。
• 如果远程设备未提供扫描响应,则也可能返回少于 60 个字节的数据。
应用请求 READ_CONTACTS 权限,它们仍可以读取每个联系人的使用情况数据。从 Android 8.0 开始,使用情况数据查询会返回近似值,而不是精确值。此行为变更会影响以下查询参数:TIMES_CONTACTED、TIMES_USED、LAST_TIME_CONTACTED、LAST_TIME_USED
AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始终引发 NullPointerException;之前,当集合为空时不会引发 NullPointerException
Android 8.0 已弃用 LOGIN_ACCOUNTS_CHANGED_ACTION。相反,应用在运行时应使用 addOnAccountsUpdatedListener() 获取帐号更新信息
Build.SERIAL 已弃用。需要知道硬件序列号的应用应改为使用新的 Build.getSerial() 函数,该函数要求具有 READ_PHONE_STATE 权限
List.sort() 的实现不能调用 Collections.sort()
DexFile API 现已弃用
通知
findViewById() 签名变更
Context.startForegroundService()在系统创建服务后,应用有五秒的时间来调用该服务的 startForeground() 方法以显示新服务的用户可见通知。如果应用在此时间限制内未调用 startForeground(),则系统将停止服务并声明此应用为 ANR
应用无法继续在其清单中为隐式广播注册广播接收器。 隐式广播是一种不专门针对该应用的广播
如果处于后台时您的应用需要创建一个前台服务,请使用新的 NotificationManager.startServiceInForeground()方法,而不是创建一个后台服务,然后尝试将其推到前台
API 25
CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO隐式广播删除
使用 SurfaceView 代替 TextureView,以实现省电
传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider
DownloadManager 不再按文件名分享私人存储的文件,旧版应用在访问 COLUMN_LOCAL_FILENAME 时可能出现无法访问的路径。面向 Android 7.0 或更高版本的应用在尝试访问 COLUMN_LOCAL_FILENAME 时会触发 SecurityException
API 23
运行时权限
对于使用 WLAN API 和 Bluetooth API 的应用,Android 移除了对设备本地硬件标识符的编程访问权。WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getAddress() 方法现在会返回常量值 02:00:00:00:00:00
要通过蓝牙和 WLAN 扫描访问附近外部设备的硬件标识符,您的应用必须拥有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限
移除了 Notification.setLatestEventInfo() 方法
不再支持通过 AudioManager 类直接设置音量或将特定音频流静音。setStreamSolo() 方法已弃用,您应该改为调用 requestAudioFocus() 方法。类似地,setStreamMute() 方法也已弃用,请改为调用 adjustStreamVolume() 方法并传入方向值 ADJUST_MUTE 或 ADJUST_UNMUTE
移除了对全局书签的支持。android.provider.Browser.getAllBookmarks() 和 android.provider.Browser.saveBookmark() 方法现已移除。同样,READ_HISTORY_BOOKMARKS 权限和 WRITE_HISTORY_BOOKMARKS 权限也已移除
DevicePolicyManager.createAndInitializeUser() 方法和 DevicePolicyManager.createUser() 方法已弃用
Device initializer API 现已删除
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS 已删除
这些设置不再通过 setGlobalSettings() 进行设置:
• BLUETOOTH_ON
• DEVELOPMENT_SETTINGS_ENABLED
• MODE_RINGER
• NETWORK_PREFERENCE
• WIFI_ON