Android9.0开发适配常见问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/abc6368765/article/details/102678857
  • 视图焦点

0 面积的视图(即宽度或高度为 0)无法再被聚焦。此外,Activity 不会再在轻触模式下隐式分配初始焦点,而是需要由您根据需要显式请求初始焦点。

  • HTTP请求被禁止

Android9.0之后,默认禁止不安全的HTTP请求,(在我们设置target=28后,在多款系统为9.0的手机上出现了大面积的图片显示不出来的问题,后来发现,不能正常显示的图片的url都是http的,能正常显示的图片都是https),如果我们的APP通讯协议使用的仍然还是Http而不是Https,如何处理呢?

方法1:在然后在manifest.xml中的application标签中引入usesCleartextTraffic属性

<application
...
android:usesCleartextTraffic="true"
...
>

方法2:配置networkSecurityConfig属性

则需要我们在res->xml文件夹下新建network_security_config.xml

<network-security-config>
  <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后在manifest.xml中的application标签中引入:

<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
>
  • Apache HTTP 客户端弃用

在 Android 6.0 中,我们移除了对 Apache HTTP 客户端的支持。从 Android 9 开始,该内容库已从 bootclasspath 中移除,且默认情况下应用无法使用它。

要继续使用 Apache HTTP 客户端,以 Android 9 及更高版本为目标平台的应用可以向其 AndroidManifest.xml 添加以下内容:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

注意:拥有的最低 SDK 为 23 或更低的应用需要有 android:required=“false” 属性,因为在 API 级别低于 24 的设备上,org.apache.http.legacy 库不可用。(在这些设备上,Apache HTTP 类在 bootclasspath 中提供。)

除了使用运行时 Apache 库,应用还可以将自己的 org.apache.http 库版本打包到其 APK 中。如果要进行此操作,您必须重新打包该库(使用一个类似于 Jar Jar 的实用程序),以避免运行时中提供的类存在类兼容性问题。

  • 默认启用网络传输层安全协议 (TLS)

如果您的应用以 Android 9 或更高版本为目标平台,则 isCleartextTrafficPermitted() 方法默认返回 false。如果您的应用需要针对特定网域启用明文,则您必须在应用的网络安全配置中,针对这些网域明确将 cleartextTrafficPermitted 设置为 true。

  • 按进程分设基于网络的数据目录

在 Android 9 中,为改善应用稳定性和数据完整性,应用无法再让多个进程共享一个 WebView 数据目录。通常情况下,此类数据目录会存储 Cookie、HTTP 缓存以及其他与网络浏览有关的持久性和临时性存储。

在大多数情况下,您的应用应仅在一个进程中使用 android.webkit 软件包中的类(如 WebView 和 CookieManager)。例如,您应该将使用 WebView 的所有 Activity 对象移入同一进程。您可以通过在应用的其他进程中调用 disableWebView(),更严格地执行“仅限一个进程”规则。该调用可防止 WebView 在这些其他进程中被错误地初始化,即使是从依赖内容库进行的调用也能防止。

如果您的应用必须在多个进程中使用 WebView 实例,则您必须先使用 WebView.setDataDirectorySuffix() 方法为每个进程指定唯一的数据目录后缀,然后再在相应进程中使用 WebView 的给定实例。该方法会将每个进程的网络数据放入应用数据目录内其自己的目录中。

注意:即使您使用 setDataDirectorySuffix(),系统也不会跨应用的进程界限共享 Cookie 以及其他网络数据。如果应用中的多个进程需要访问同一网络数据,您需要自行在这些进程之间复制该数据。例如,您可以调用 getCookie() 和 setCookie(),以在不同的进程之间手动传输 Cookie 数据。

  • 网络连接数据计数和多路径

在以 Android 9 或更高版本为目标平台的应用中,系统会统计并非当前默认网络的网络流量(例如,当设备连接到 WLAN 时的蜂窝流量),并在 NetworkStatsManager 类中提供查询该流量的方法。

具体而言,getMultipathPreference() 现在会返回一个基于上述网络流量的值。自 Android 9 开始,此方法会针对蜂窝数据返回 true,但当一天内累积的流量超过特定数量时,它会开始返回 false。在 Android 9 上运行的应用必须调用此方法并遵守该提示。

ConnectivityManager.NetworkCallback 类现在会将有关 VPN 的信息发送到应用。此项变更可以让应用更轻松地侦听连接事件,而无需混用同步和异步调用,也无需使用有限的 API。此外,它还意味着将设备同时连接至多个 WLAN 网络或多个蜂窝网络时,信息传输可按预期工作。

  • CSS RGBA 十六进制值处理

以 Android 9 或更高版本为目标平台的应用必须支持草稿版 CSS 颜色模块级别 4 行为,以便处理 4 位和 8 位十六进制数字 CSS 颜色。

Chrome 自版本 52 以来便一直支持 CSS 颜色模块级别 4,但 WebView 目前停用了此功能,因为现有 Android 应用被发现包含 Android ordering (ARGB) 中的 32 位十六进制颜色,而这会导致呈现错误。

例如,对于以 API 级别 27 或更低版本为目标的应用,颜色 #80ff8080 目前在 WebView 中呈现为不透明的浅红色(#ff8080)。先导组件(Android 将其解读为 Alpha 组件)目前被忽略。如果某个应用以 API 级别 28 或更高级别为目标,则 #80ff8080 会被解读为 50% 透明的浅绿色 (#80ff80)。

  • 文件的 MIME 类型嗅探:URI

低于 Android 9 的 Android 版本可以通过文件内容推断出 MIME 类型。从 Android 9(API 级别 28)开始,在 WebView 中加载 file: URI 时,应用必须使用正确的文件扩展名。

使用文件内容推断 MIME 类型可能会导致出现安全错误,现代浏览器通常不允许这样做。

如果文件具有可识别的文件扩展名(例如,.html、.txt、.js 或 .css),则 MIME 类型将由扩展名决定。如果文件没有扩展名或者扩展名无法识别,则 MME 类型将为纯文本。

例如,file:///sdcard/test.html 等 URI 将以 HTML 形式呈现,但 file:///sdcard/test 等 URI 将以纯文本形式呈现,即使相应文件中包含 HTML 数据也是如此。

  • 文档滚动元素

Android 9 可以正确处理文档的根元素为滚动元素的情况。在之前的版本中,滚动位置在正文元素上设置,根元素的滚动值为零。Android 9 支持符合标准的行为,在这种行为中,滚动元素是根元素。

此外,直接访问 document.body.scrollTop、document.body.scrollLeft、document.documentElement.scrollTop 或 document.documentElement.scrollLeft 的行为会因目标 SDK 的不同而异。要访问视口滚动值,请使用 document.scrollingElement(如果有)。

  • 来自已暂停应用的通知

在 Android 9 之前,已暂停的应用发出的通知会被取消。从 Android 9 开始,已暂停的应用发出的通知会被隐藏,直到应用恢复运行。

  • 后台对传感器的访问受限

Android 9 限制后台应用访问用户输入和传感器数据的能力。如果应用进入后台,则:

不能访问麦克风和摄像头
使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
使用变化或一次性报告模式的传感器不会接收事件。
就是说比如直播应用,或者导航应用,需要用到手机设备的麦克风,摄像头或者其他传感器,一旦应用进入后台,则收不到传感器的数据。

对此的解决方案,就是使用前台服务。在你的service中调用startForeground(NOTIFICATION_ID, notification);,方法有两个参数:唯一标识通知的整型数和状态栏的 Notification,这样服务就会运行在前台,我们在通知栏就能看到应用。

  • 限制访问通话记录和电话号码

对于需要访问通话敏感信息(如读取通话记录和识别电话号码)的应用,需要请求权限组CALL_LOG,否则会发生SecurityException。

一般对于类型通讯管家这种应用,就直接使用运行时权限请求CALL_LOG权限组就完事了,CALL_LOG权限组包括READ_CALL_LOG、WRITE_CALL_LOG 和 PROCESS_OUTGOING_CALLS。

  • 对使用非 SDK 接口的限制

为帮助确保应用稳定性和兼容性,此平台对某些非 SDK 函数和字段的使用进行了限制;无论您是直接访问这些函数和字段,还是通过反射或 JNI 访问,这些限制均适用。 在 Android 9 中,您的应用可以继续访问这些受限的接口;该平台通过 toast 和日志条目提醒您注意这些接口。

这意味着之前的好多黑科技在Android9.0之后可能就不能用了!
在 Android 9(API 级别 28)中,非受限灰名单中的非 SDK 接口称为浅灰名单,而受限灰名单中的非 SDK 接口称为深灰名单。也就是说,如果我们访问了深灰名单中的api,那就gg了!

  • 不能从非 Activity 环境中启动 Activity

在 Android 9 中,您不能从非 Activity 环境中启动 Activity,除非您传递 Intent 标志 FLAG_ACTIVITY_NEW_TASK。 如果您尝试在不传递此标志的情况下启动 Activity,则该 Activity 不会启动,系统会在日志中输出一则消息。

之前遇到在一个service中启动一个activity,在Android9.0上失效,原因就是没有添加FLAG_ACTIVITY_NEW_TASK。

猜你喜欢

转载自blog.csdn.net/abc6368765/article/details/102678857