<h1>导读</h1>
<hr>
<p><strong>文中链接请自行科学上网</strong></p>
<p><strong>Android Q Beta 1</strong>刚出,讲道理国内是不到下半年不用理睬<strong>Q</strong>的,但是上月末的一封华为要求适配Q的邮件要求我们在5月底之前完成相关适配,不然应用会被下架。</p>
<p>一开始还心生奇怪,为什么这次华为的邮件来的那么早以及严格。当我仔细阅读了官方文档之后发现<strong>Q</strong>的更新特别多,且不适配<strong>应用可能无法正常运行</strong>(不管targetSDK是否为Q)。</p>
<p>国内相关的文章还比较少,本文将总结归纳AndroidQ官方文档并将自己所踩过的坑记录下来,以便大家少走弯路。</p>
<p>本文将从三个角度介绍<strong>Android Q</strong>的部分适配问题,也是大家开发适配过程中<strong>大概率</strong>会遇到的问题:</p>
<ul><li>Q 行为变更:所有应用 <code>(不管targetSdk是多少,对所有跑在Q设备上的应用均有影响)</code></li><li>Q 行为变更:以 Android Q 为目标平台的应用<code>(targetSDK == Q 才有影响)</code></li><li>项目升级遇到的问题</li></ul>
<p>至于<strong>Q的新功能及SDK</strong>,我粗略扫了一眼,项目中并没有涉及,故暂不介绍,只放出链接<a href="https://link.juejin.im?target=https%3A%2F%2Fdeveloper.android.com%2Fpreview%2Ffeatures">AndroidQ新API及功能</a>。</p>
<h1>Q 行为变更:所有应用</h1>
<hr>
<ul><li> <h2>用户隐私权限变更</h2>
<blockquote>
<p>AndroidQ引入了大量更改和限制以增强对用户隐私的保护。</p>
</blockquote> <p>官方文档将这一部分内容独立于<strong>Q 行为变更:所有应用</strong>来介绍,是因为这一部分内容<strong>庞大且重要</strong> ,个人认为<strong>Q</strong>的最大更新就是<strong>用户隐私权限变更</strong>。具体变更的权限如下:</p>
<table><thead><tr><th>权限</th><th>受影响应用</th><th>如何启用(影响范围)</th></tr></thead><tbody><tr><td>存储权限</td><td>访问和共享外部存储设备中的文件的应用</td><td>adb shell sm set-isolated-storage on(下文详述)</td></tr><tr><td>定位权限</td><td>在后台时请求访问用户位置信息的应用</td><td>这种权限策略在 Android Q 上始终处于启用状态</td></tr><tr><td>从后台启动 Activity</td><td>不需要用户互动就启动 Activity 的应用</td><td>关闭允许系统执行后台活动开发者选项即可启用限制</td></tr><tr><td>设备标识符(deviceId)</td><td>访问设备序列号或 IMEI 的应用</td><td>在搭载 Android Q 的设备上安装应用</td></tr><tr><td>无线扫描权限</td><td>使用 WLAN API 和 Bluetooth API 的应用</td><td>以 Android Q 为目标平台</td></tr></tbody></table><p>因为<code>从后台启动Activity权限</code>和<code>无线扫描权限</code>两种权限的变更影响较少。本文不作详述,如有涉及请查阅<a href="https://link.juejin.im?target=https%3A%2F%2Fdeveloper.android.com%2Fpreview%2Fprivacy%2Fbackground-activity-starts">官方文档</a>。</p> <pre class="blockcode"><code> 从后台启动Activity权限变更仅针对与用户毫无交互就启动一个Activity的情况,(比如微信登陆授权)
复制代码</code></pre> <p>以下会着重介绍<code>存储权限</code>,<code>定位权限</code>和<code>设备标识符</code>三种权限的变更与适配</p>
<ul><li> <h3>存储权限</h3>
<blockquote>
<p>Android Q 在外部存储设备中为每个应用提供了一个“隔离存储沙盒”(例如 /sdcard)。任何其他应用都无法直接访问您应用的沙盒文件。由于文件是您应用的私有文件,因此您不再需要任何权限即可在外部存储设备中访问和保存自己的文件。此变更可让您更轻松地保证用户文件的隐私性,并有助于减少应用所需的权限数量。</p>
</blockquote> <p><strong>沙盒</strong>,简单而言就是应用专属文件夹,并且访问这个文件夹无需权限。谷歌官方<strong>推荐</strong>应用在沙盒内存储文件的地址为<code>Context.getExternalFilesDir()</code>下的文件夹。比如要存储一张图片,则应放在<code>Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)</code>中。</p> <p>以下将按访问的目标文件的地址介绍如何适配。</p>
<ul><li> <p>访问自己文件:Q中用更精细的媒体特定权限<strong>替换并取消</strong>了 <code>READ_EXTERNAL_STORAGE</code> 和 <code>WRITE_EXTERNAL_STORAGE</code>权限,<strong>并且无需特定权限</strong>,应用即可访问<strong>自己沙盒中</strong>的文件。</p> </li><li> <p>访问系统媒体文件:Q中引入了一个新定义<strong>媒体文件的共享集合</strong>,如果要访问沙盒外的媒体共享文件,比如<strong>照片,音乐,视频等</strong>,需要申请新的<strong>媒体权限</strong>:<code>READ_MEDIA_IMAGES</code>,<code> |
|