Android适配之版本适配

这篇文章用来记录学习和开发时遇到的版本适配问题,持续更新

\color{red}{Android9.0即API 28-适配}
  • 全面屏、刘海屏的适配:
    Android 9 支持最新的全面屏,其中包含为摄像头和扬声器预留空间的屏幕缺口。
    通过 DisplayCutout 类可确定非功能区域的位置和形状,这些区域不应显示内容。
    要确定这些屏幕缺口区域是否存在及其位置,使用 getDisplayCutout()函数。
    LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT:
    只有当DisplayCutout完全包含在系统栏中时,才允许窗口扩展到DisplayCutout区域。否则,窗口的布局不会与显示剪切区域重叠。
    LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES:
    屏幕短边有cutout,会延伸过去;若cutout在长边,一定不会延伸过去。
    LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER:
    窗口决不允许与显示剪切区域重叠。
    设置代码:
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
getWindow().setAttributes(lp);
  • 通知功能的变更
    Android 8.0 引入了通知渠道,允许您为要显示的每种通知类型创建可由用户自定义的渠道。 Android 9 通过下列变更简化通知渠道设置:
    1.)屏蔽渠道组:现在,用户可以针对某个应用在通知设置中屏蔽整个渠道组。 您可以使用 isBlocked() 函数确定何时屏蔽一个渠道组,从而不会向该组中的渠道发送任何通知。
    此外,您的应用可以使用全新的 getNotificationChannelGroup() 函数查询当前渠道组设置。
    2.)全新的广播 Intent 类型:现在,当通知渠道和渠道组的屏蔽状态发生变更时,Android 系统将发送广播 Intent。 拥有已屏蔽的渠道或渠道组的应用可以侦听这些 Intent 并做出相应的回应。
    有关这些 Intent 操作和 extra 的更多信息,请参阅 NotificationManager 参考中更新的常量列表。 有关响应广播 Intent 的信息,请参阅广播。

  • 权限收紧
    1.)为了增强用户隐私,Android 9 引入了若干行为变更,如限制后台应用访问设备传感器、限制通过 Wi-Fi 扫描检索到的信息,以及与通话、手机状态和 Wi-Fi 扫描相关的新权限规则和权限组。
    无论采用哪一种目标 SDK 版本,这些变更都会影响运行于 Android 9 上的所有应用。
    2.)Android 9 限制后台应用访问用户输入和传感器数据的能力。
    如果您的应用在运行 Android 9 设备的后台运行,系统将对您的应用采取以下限制:
    您的应用不能访问麦克风或摄像头。
    使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
    使用变化或一次性报告模式的传感器不会接收事件。
    如果您的应用需要在运行 Android 9 的设备上检测传感器事件,请使用前台服务。

  • 对使用非 SDK 接口的限制
    目前处理方式扫描代码,避免使用或者使用类似的替代方法,如果避免不了,最粗暴的是try-catch,正统做法是每处都做if-else的Android9适配,如果是第三方库,可以屏蔽入口,或者反编译sdk处理,
    处理起来比较复杂,官方受限制名单也还没完全确定,等待后续解决办法吧。

\color{red}{Android8.0即API 26-27适配}
  • 自定义icon-launcher图标

  • 通知相关修改
    1.)通知渠道组 NotificationChannel,渠道ID channelId的规则,大改很多,包括提供了应用桌面图标有通知显示小圆点,长按图标还能进行消息操作等
    显示小圆点:
    channel.setShowBadge(true);
    右上角还有一个数字角标:
    Notification.Builder builder=new Notification.Builder(this, channelId);
    builder.setNumber(10);
    通知超时:
    Notification.Builder builder=new Notification.Builder(this, channelId);
    builder.setTimeoutAfter(timeout*1000)
    背景颜色:这个属性要生效,必须是持续任务,且是前台服务
    builder.setColorized(true);
    builder.setColor(Color.BLACK);
    通知清除回调:
    系统现在可区分通知是由用户清除,还是由应用自己移除。要查看清除通知的方式,应实现NotificationListenerService类的新onNotificationRemoved()方法
    AndroidManifest里面不要忘记加配置,这么做,我还是可以保证你没有任何回调会发生,因为这里面有个别别窍,要手动开启通知访问权限。来看模拟器上的操作流程,设置>应用和通知>高级>特殊应用权限->通知使用权
    通过判断第三个参数reason是REASON_CANCEL还是REASON_LISTENER_CANCEL就可以知道是用户删除还是系统删除了

  • 后台服务限制
    在后台中运行的服务会消耗系统资源,这可能降低用户体验。 为了缓解这一问题,系统对这些服务施加了一些限制。那么什么情况下应用被视为处于前台?
    1.)具有可见Activity(不管该Activity已启动还是已暂停)
    2.)具有前台服务
    3.)另一个前台应用已关联到该应用(不管是通过绑定到其中一个服务,还是通过使用其中一个内容提供程序)。
    例如,如果另一个应用绑定到该应用的服务,那么该应用处于前台:输入法、壁纸服务、语音等
    如果以上条件均不满足,应用将被视为处于后台。
    startForegroundService方法调用后,记得5秒钟内调用startForeground方法,否则系统将停止服务并声明此应用为ANR。具体使用看官方文档即可,不做赘述。
    4.)后台位置限制:
    之前说的后台服务限制目前只针对目标SDK版本为8.0的app,但是涉及到后台位置限制就是所有版本SDK都要调整的了,它限制后台应用每小时只接收几次位置更新。
    当然,解决的办法是一样的,依然是建立前台服务

  • Android 8.0去除“允许未知来源”选项,需手动确认。
    如果我们的App具备安装App的功能,那么AndroidManifest文件需要包含REQUEST_INSTALL_PACKAGES权限,未声明此权限的应用将无法安装其他应用。
    我们可以选择使用 Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES这个action将用户引导至安装未知应用权限界面。
    同时也可以使用 packageManager.canRequestPackageInstalls()查询此权限的状态
    不过最简单的办法就是直接在AndroidManifest中配置一下就行了,这样会在App调用安装界面的同时,系统会自动询问用户完成授权,体验尚可。

  • 悬浮窗相关
    这个东西篇幅较长,使用频率不高,后面可能会单独一篇文章说这个,在此便不做赘述,有兴趣的可自行了解。

\color{red}{Android7.0即API 24-25适配}
  • FileProvider
    对于app目标版本大于等于24的应用,禁止在应用外部公开 file:// URI , 如果一项包含文件 URI 的 intent 离开应用,则应用出现 FileUriExposedException 异常。
    要应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider类。如需了解有关权限和共享文件的详细信息,请参阅官方文档。
    FileProvider 实际上是 ContentProvider 的一个子类,它的作用也比较明显,file://Uri 不给用,那么换个 Uri 为 content:// 来替代。

接下来看下如何使用:
1、定义 FileProvider
我们先在 AndroidManifest 中进行注册

  <!-- provider -->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.hccf.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths_public" />
        </provider>

2、指定可分享的文件路径
FileProvider 只能为指定的目录中的文件生成内容 URI。要指定目录,就必须使用 <paths> 元素的子元素在 XML 中指定其存储区域和路径。

我们先创建一个名为 res/xml/file_paths_public.xml 的新文件

<paths>
    <!--图片-->
    <external-path
        name="my_images"
        path="Pictures/" />

    <!--自定义根目录-->
    <root-path
        name="root_path"
        path="." />
</paths>

在 paths 节点内部支持以下几个子节点,分别为:

  • root-path:设备的根目录 new File("/")
  • files-path:context.getFileDir()
  • cache-path:context.getCacheDir()
  • external-path:Environment.getExternalStorageDirectory()
  • external-files-path:context.getExternalFilesDirs()
  • external-cache-path:getExternalCacheDirs()

代码中的常见用法:

Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // FileProvider方式必须加这个临时权限
Uri uri = FileProvider.getUriForFile(mContext, "com.hccf.fileprovider", file);
intent.setDataAndType(uri, "application/pdf");
mContext.startActivity(intent);

还有一种用法是: 使用Context 的 grantUriPermission() 方法和revokeUriPermission(); 这种比较少用。

至此,FileProvider的介绍就差不多结束了。

  • V2签名
    APK signature scheme v2:
    Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。

使用Android Studio 自带的打包工具的话,只有勾选了了v2签名的方式,app才能在目标版本24及以上的7.0系统手机安装。

还有一些其他的比较少遇到的,就不做赘述了,参考文章:
https://blog.csdn.net/qq_17766199/article/details/77404712

\color{red}{Android6.0即API 23适配}
            // 获取权限
            RxPermissions rxPermissions = new RxPermissions(getActivity());
            rxPermissions.request(Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    .subscribe(new Observer<Boolean>() {
                        @Override
                        public void onSubscribe(Disposable d) {

                        }

                        @Override
                        public void onNext(Boolean aBoolean) {
                            if (aBoolean){
                                // 权限获取成功 开始下载
                            }
                        }

                        @Override
                        public void onError(Throwable e) {
                            // 获取权限失败,跳转设置页面
                            new PermissionPageUtils(getActivity()).jumpPermissionPage();
                            ToastUtils.showLongBottom("获取权限失败,请检查是否开启所需权限");
                        }

                        @Override
                        public void onComplete() {

                        }
                    });
\color{red}{Android5.0即API 21-22适配}
  • 未完待续
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容