Android7.0适配方案
1安装时解析错误
我们的App通常会有检查更新的功能。用户在收到提示更新并且下载完后,会自动打开安装页面让用户来去安装。这时就会出现安装错误的问题,这类的问题的可能性比较多。比如较低版本的App想要覆盖已有的较高版本App会提示安装未完成,或是签名不一致导致的。
不过7.0上常见的有以下两种情况。
1.应用间共享文件
在targetSdkVersion大于等于的24的App中,但是我们没有去适配7.0。那么在调用安装页面,或修改用户头像操作时,就会失败。那么就需要你去适配7.0或是将targetSdkVersion改为24以下(不推荐)。
适配的方法这里就不细讲,大家可以看看 Android 7.0 行为变更 通过FileProvider在应用间共享文件吧 这篇文章。
2.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 和传统签名方案来签署您的应用。详细看安卓官方说明(https://developer.android.google.cn/about/versions/nougat/android-7.0.html#apk_signature_v2)。
简单地说就是任何方式的篡改APK 文件,在利用了V2签名的apk上会失效。
我所用的Android Studio目前是2.3.3 在 Gradle 2.2.3时。
打包页面是这样
可以看到默认是V1 和V2选中的。
1)只勾选v1签名就是传统方案签署,但是在7.0上不会使用V2安全的验证方式。
2)只勾选V2签名7.0以下会显示未安装,7.0上则会使用了V2安全的验证方式。
3)同时勾选V1和V2则所有版本都没问题。
这里问题就来了,默认全部勾选,按道理所有版本是没有问题的。
那么我们为什么还是安装错误?
其实是因为我们项目采用了美团早期的快速生成渠道包(https://tech.meituan.com/mt-apk-packaging.html)方案。这种方案不适用于V2的签名方案。(因为实现思路就是给已有的apk文件中添加空的渠道文件)
解决办法:
1.如果你的渠道较少,可以用gradle方式的多渠道打包。渠道多的话就不适用了。
2.毕竟V2不是强制的,那么我们要用传统方案签署,可以打开模块级build.gradle 文件,然后将行v2SigningEnabled false添加到您的版本签名配置中:
android {...defaultConfig { ... }signingConfigs {release {storeFile file("myreleasekey.keystore")storePassword "password"keyAlias "MyReleaseKey"keyPassword "password"v2SigningEnabled false //<--这里}}}
或者将Gradle 升级为2.3以上。那么打包页面是这样
我们可以不勾选V2选项。
3.前两种方法是比较快速的可以解决问题,但是一旦这种安全措施被强制(毕竟我们可以感受到安卓在安全方面的努力,比如权限控制、应用间共享文件),我们怎么办。
其实美团早早发现了这个问题,具体看这篇 新一代开源Android渠道包生成工具Walle(https://tech.meituan.com/android-apk-v2-signature-scheme.html)。里面有深度的原理讲解,满满的干货。
2PopupWindow位置不正确
7.0系统的手机上,PopupWindow弹出位置不正确。
有两种可能:
1.我们使用了update方法,同时设置了Gravity(Gravity.NO_GRAVITY没事)。因为在update方法中有调用computeGravity方法去获取Gravity。(7.0以下没有获取Gravity进行更新判断)
public void update() {// 省略部分代码final int newGravity = computeGravity();if (newGravity != p.gravity) {p.gravity = newGravity;update = true;}if (update) {setLayoutDirectionFromAnchor();mWindowManager.updateViewLayout(mDecorView, p);}}
Android 7.0 computeGravity方法源码
private int computeGravity() {int gravity = Gravity.START | Gravity.TOP;if (mClipToScreen || mClippingEnabled) {gravity |= Gravity.DISPLAY_CLIP_VERTICAL;}return gravity;
}
Android 7.1 computeGravity方法
private int computeGravity() {int gravity = mGravity == Gravity.NO_GRAVITY ? Gravity.START | Gravity.TOP : mGravity;if (mIsDropdown && (mClipToScreen || mClippingEnabled)) {gravity |= Gravity.DISPLAY_CLIP_VERTICAL;}return gravity;
}
很显然在7.0上我们设置的Gravity被覆盖了。解决就很简单了,不使用update方法。如果你真的要使用可以参考这篇文章的方法。
PopupWindow 在 Android N(7.0) 的兼容性问题
http://www.jianshu.com/p/0df10893bf5b
2.PopupWindow高度为MATCH_PARENT,在显示的时候调用showAsLocation方法时,PopupWindow并没有在指定控件的下方显示。如果使用showAsDropDown,会全屏显示。
解决方法:
1.最简单的解决方法就是指定 PopupWindow 的高度为 WRAP_CONTENT, 调用 showAsDropDown方法。
2.或者弹出时做一下判断处理(代码来自PopupWindowCompat https://github.com/tianma8023/PopupWindowCompat)
if (Build.VERSION.SDK_INT >= 24) { // Android 7.x中,PopupWindow高度为match_parent时,会出现兼容性问题,需要处理兼容性int[] location = new int[2]; // 记录anchor在屏幕中的位置anchor.getLocationOnScreen(location);int offsetY = location[1] + anchor.getHeight();if (Build.VERSION.SDK_INT >= 25) { // Android 7.1 ,8.0中,PopupWindow高度为 match_parent 时,会占据整个屏幕// 故而需要在 Android 7.1上再做特殊处理int screenHeight = ScreenUtils.getScreenHeight(context); // 获取屏幕高度popupWindow.setHeight(screenHeight - offsetY); // 重新设置 PopupWindow 的高度}popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, offsetY);
} else {popupWindow.showAsDropDown(anchor);
}
3后台优化
小伙伴们都知道在Android中有一些隐式广播,使用这些隐式广播可以做一些特定的功能,如,当手机网络变成WiFi时自动下载更新包等。
但,这些隐式广播会在后台频繁启动已注册侦听这些广播的应用,从而带来很大的电量消耗,为缓解这一问题来提升设备性能和用户体验,在Android 7.0中删除了三项隐式广播,以帮助优化内存使用和电量消耗。
Android 7.0 应用了以下优化措施:
在 Android 7.0上 应用不会收到 CONNECTIVITY_ACTION 广播,即使你在manifest清单文件中设置了请求接受这些事件的通知。 但,在前台运行的应用如果使用BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。
在 Android 7.0上应用无法发送或接收 ACTION_NEW_PICTURE 或ACTION_NEW_VIDEO 类型的广播。
应对策略:Android 框架提供多个解决方案来缓解对这些隐式广播的需求。 例如,JobScheduler API
https://developer.android.google.cn/reference/android/app/job/JobScheduler.html
提供了一个稳健可靠的机制来安排满足指定条件(例如连入无线流量网络)时所执行的网络操作。您甚至可以使用 JobScheduler API 来适应内容提供程序变化。
另外,大家如果想了解更多关于后台的优化可查阅后台优化。
https://developer.android.google.cn/preview/features/background-optimization.html
移动设备会经历频繁的连接变更,例如在 Wi-Fi 和移动数据之间切换时。 目前,可以通过在应用清单中注册一个接收器来侦听隐式 CONNECTIVITY_ACTION 广播,
让应用能够监控这些变更。
由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。
以上内容来自这里
https://github.com/crazycodeboy/crazycodeboy.github.io/blob/master/_posts/2016-9-28-Android7.0适配心得.md
4其他
多语言特性
首先是官方的API指南:语言和语言区域
http://blog.csdn.net/qq_17766199/article/details/n/guide/topics/resources/multilingual-support.html
变化对比: Android 7.0多语言支持开发浅析
http://blog.csdn.net/cekiasoo/article/details/53012646
实现功能: Android 实现应用内置语言切换
http://blog.csdn.net/cekiasoo/article/details/54933135
通知栏适配
这里有一篇非常详细的通知栏介绍与适配,分享给大家:Android通知栏介绍与适配总结
http://iluhcm.com/2017/03/12/experience-of-adapting-to-android-notifications/
WebView问题
Android 7.0 WebView 部分机型打不开
http://blog.csdn.net/u012347067/article/details/70829013
Android 7.0 WebView 二级跳转后界面空白
http://www.jianshu.com/p/07b781795b78
最后觉得不错,点个赞吧!
原文链接:https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650823906&idx=1&sn=7a0351cad466a4c6cde4fafe9378efc9&chksm=80b7887cb7c0016a69cfd98c2187b76813b161b9dc329df7889d4b78a4f61582fe7328d981a2&scene=21#wechat_redirect
Android7.0适配方案相关推荐
- android 7.0原生动态,Android7.0适配教程,心得
Android7.0发布已经有一个多月了,Android7.0在给用户带来一些新的特性的同时,也给开发者带来了新的挑战,这几天我将应用适配到Android7.0,其中也遇到了不少问题也踩了一些坑,在这 ...
- android 适配7.0,Android7.0适配心得(一)_拍照兼容
1.在Android7.0上调用系统相机拍照,裁切照片的适配 在Android7.0以前,若是你想调用系统相机拍照能够经过如下代码来进行:java File file = new File(Envir ...
- Android7.0适配
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请注明出处:http://blog.csdn.net/chay_chan/article/details/57083383 关于 ...
- Android8.0适配方案
准备工作 将我们项目中的targetSdkVersion改为 26(8.0) 或者 27(8.1) 1运行时权限 首先引用官方的原文. https://developer.android.google ...
- [转]快速使用FileProvider解决Android7.0文件权限问题
升级到Android7.0之后,启动系统相机或者截图,传入URI的时候可能会导致程序闪退崩溃.这是因为7.0的新的文件权限导致的.下面是解决这个问题的快速解决方案. 问题代码 在7.0可能会出问题的代 ...
- 下载安装APK(兼容Android7.0)
我们使用手机的时候经常会看到应用程序提示升级,大部分应用内部都需要实现升级提醒和应用程序文件(APK文件)下载. 一般写法都差不多,比如在启动app的时候,通过api接口获得服务器最新的版本号,然后和 ...
- Android7.0以上多系统语言的国际化适配
前言 近期偶然发现一个问题,我们的应用在7.0以上的个别机型上,会遇到国际化不对的问题,现象是:手机明明设置了中文,应用却可能显示成英文. 问题分析 问题机型:三星s8 plus 系统版本:Andro ...
- Android 从6.0,7.0,8.0,9.0,10.0的特性整理和适配方案(不好含全部新特性,总结了一些可能应用中会遇到的)
总所周知从Android6.0之后的每一次系统迭代,系统特性都有比较大的改变.平时做开发的时候都是有在注意这些方面的适配,但是一直没有时间去整个一下,今天正好来总结一下吧.如果觉的太长,可以等下一篇文 ...
- Android8.0未知来源应用安装权限最好的适配方案
Android8.0未知来源应用安装权限最好的适配方案 你弄啥嘞 24 天前 Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限 以前安装未知来源应用的时候一般会弹出一个弹窗让用 ...
最新文章
- jQuery中的事件机制深入浅出
- 【团队】 冲刺一(10/10)
- 文件重定向(hook IRP_MJ_CREATE)
- HANA数据库为何如此之快
- xay loves count 枚举-复杂度-顺序无关-选择
- GDCM:gdcm::EnumeratedValues的测试程序
- java nio教程_Java NIO教程
- 解决安卓TextView高度和textSize大小不一致问题
- [转载] opengl能做什么_python能做什么
- 表达式求值详解(C++)
- 不简单的工厂:实际体验 .NET Core 2.1 新生物 HttpClientFactory
- SpringCloud教程合集
- 基于python数据可视化论文-基于Python的数据脱敏与可视化分析
- 平衡二叉树的调整整理
- 国产单路AHDRX芯片XS9950,替代TP9950
- 台式计算机识别不了u盘启动,台式机进入不到U盘启动怎么办
- python如何获取网页内容_python如何获取网页内容
- Vmware 和宿主机之间的网络互通
- 芯片加密与解密技术方法
- android操作蓝牙打印机(上)
热门文章
- python 库整理: collections.namedtuple
- 文巾解题 5. 最长回文子串
- 深度学习核心技术精讲100篇(七十七)-主流推荐引擎技术及优缺点分析
- 远程计算机未能及时反应,Win10无法打开软件提示“服务器没有及时响应或控制请求”怎么办...
- Python入门100题 | 第078题
- MongoDB导出csv格式数据
- Python编程基础:第二十七节 format输出Format
- 【算法数据结构Java实现】Java实现单链表
- ConcurrentHashMap实现原理--转载
- JDK动态代理实现原理--转载