Android 8.0中一些坑以及对应的解决方法

前言

虽然 Android 9.0 都已经面世了,本篇文章写的有点迟了。

但是迟到好过不到,因此基于此这边还是记录一下项目中遇到的 Android 8.0 的坑及对应解决方法。

每次系统升级,虽然系统功能更加强大了,各方面性能也提高了。

但是对于开发者而言,一个困扰的问题也是随之而来——兼容。

尤其对于一些已经上市的 App 而言,在新系统发布之前就要了解到底有哪些改动,以避免用户升级新系统后导致 App 没法正常运行。

好了,回归主题,说说 Android 8.0 里面的几个坑吧。

唤不起系统安装器

如果你的 App 提供了更新功能,用户点击更新,你下载完 Apk 之后会自动弹出安装界面。

这个安装界面的弹出就是依赖于系统的安装器。

假设你在 Android 8.0 以下的手机操作正常,但是在 8.0 的手机上,你会发现,下载完之后完全没反应。

这个时候

假设你以为说弹个提示让用户自己安装,我想说

用户才不会理你。用户分分钟就不更新了。

所以说我们要解决这个问题。让这个安装器在 Android 8.0 的手机也能正常唤起。

其实解决方法非常简单。

只需要在 AndroidManifest.xml 中声明以下权限即可。

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

而且还不需要你在代码动态申请,是不是 So easy。

一行代码解决这个兼容性问题。

通知问题

假设你的 App 需要在任务栏显示通知。如果你是按照 Android 8.0 之前的写法的话。那么在 8.0 的手机上面你是显示不了的。

那怎么办呢?

关于通知的基本写法这边就不再赘余,如果不清楚的小伙伴自行查阅资料。这边重点说下解决方法。

首先说下下面代码出现的几个变量:

private static NotificationManager manager;
public static final String NOTIFICATION_CHANNEL = "your app pkg name";
private static final String NOTIFICATION_CHANNEL_NAME = "App Channel";

第一个写过通知的都知道,一个管理类。

第二个是通知的一个 CHANNEL,这个也是 8.0 之后才引入的。取值 App 包名即可。

第三个自定义,只要保证唯一即可。

兼容有两步需要操作。

1. 创建Channel

private static void createChannel() {
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  NotificationChannel notifyChannel = new NotificationChannel(NOTIFICATION_CHANNEL,
   NOTIFICATION_CHANNEL_NAME,
   NotificationManager.IMPORTANCE_DEFAULT);
  notifyChannel.setLightColor(Color.GREEN);
  notifyChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
  manager.createNotificationChannel(notifyChannel);
 }
 }

2. 获取 Notification.Builder

private Notification.Builder getNotificationBuilder(Context sourceContext) {
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  return new Notification.Builder(sourceContext, NOTIFICATION_CHANNEL);
 } else {
  return new Notification.Builder(sourceContext);
 }
 }

可以看到,上面的操作都以 8.0 作为分界处理。

做完这两步,之前不能显示通知的 App 就可以显示了。

Only fullscreen opaque activities can request orientation

昨天屁颠屁颠把项目适配到8.0,本来觉得美滋滋,结果app一启动直接crash,搞得我一脸懵逼。。。不能忍啊,赶紧去看一下日志,于是就看到了如下图

有一句是这样的Only fullscreen opaque activities can request orientation,也就是说只有全屏不透明的activity才可以设置方向,既然知道问题所在就好办了。

原因

出现这样的问题,绝大多数都是因为我们为了提高用户体验,手动取消App启动白屏或者黑屏的时候,将Splash界面设为了透明,然后这个时候又设置了方向为垂直,从而导致了这个问题。

解决

重点来了,解决办法其实很简单

1.找到你设置透明的Activity,然后在他的theme中将android:windowIsTranslucent改为false
eg:<item name="android:windowIsTranslucent">false</item>

2.再加入<item name="android:windowDisablePreview">true</item>就搞定了。

更多内容可以看官方示例:https://github.com/googlesamples/android-NotificationChannels/

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

时间: 2018-09-10

详解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅

1.首先什么是JNI呢? JNI--(Java Native Interface),他是java平台的特性,不是安卓系统提供的.他定义了一些JNI函数,来让开发者可以通过调用这些函数来实现java代码调用C/C++代码. 2.如何使用JNI呢? 我们先将写好的C/C++代码编译成对应平台的动态库(windows是.dll文件,linux是.so文件). 下面我们来举个栗子:使用AndroidStudio来实现JNI 3.要实现JNI先下载NDK,那么NDK又是什么呢?(面试宝典来了,赶紧掏出小本

深踩Android Studio 缓存的坑及解决方法

本文记录的是今天在群里提到的昨天所踩的一个坑,有关 AndroidStudio 缓存的. 先说一下背景. 我负责的一个项目,对一个图表库有外部依赖.这个图表库是我在维护的,由于新功能在开发中,所以我就使用了 SNAPSHOT 版本发布到 OJO(oss.jfrog.org) 上.我在项目中刚更新了依赖,忽然想到还少几个 API,于是发布了 SNAPSHOT 版本. 故事就这样开始了. 这时候回到 AndroidStudio 再去 Sync Project with Gradle Files 肯定

适配Android 8.0版本更新安装与通知栏的一些坑

前言 Android 8.0系统更新之后,app的更新将不再像之前的系统版本一样能够直接下载安装包之后直接安装(以前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知来源的应用都可以被安装),8.0需要用户给予允许app安装未知来源应用的权限(比如你的app 名字为A,当你需要更新时,则需要使用app的用户 授权A这个app 允许安装未知来源的权限,才能完成正常的更新操作). Android8.0的变化是,未知应用安装权限的开关被除掉,取而代之的是未

Android 启动activity的4种方式及打开其他应用的activity的坑

Android启动的四种方式分别为standard,singleTop,singleTask,singleInstence. standard是最常见的activity启动方式,也是默认的启动的方式.当启动一个activity的时候他将进入返回栈的栈顶.系统不会管栈内是否有相同的activity,方式像后入先出. singleTop方式是在活动启动的时候,系统先判定栈顶是否有相同的活动,如果没有则新建活动,否则将不新建活动.而是直接使用他. singleTask方式在活动启动的时候,系统先判定栈

浅析Android Studio 3.0 升级各种坑(推荐)

点击 Check for Updates 增量更新: 下载完成,会提示更新 您将 Gradle 更新至 4.1: 这里建议您对老项目先暂时点击 Don't remind me on this project,以防有坑.当然我不入地狱谁入地狱,我点 Update,于是问题来了,一直处于下载中,不过,莫担心,我下载好了,公众号聊天界面回复「 gradle-4.1-all 」,下载 gradle-4.1-all.zip 文件,放到: 重启 Android Studio. gradle 目录: Mac系

浅谈Android为RecyclerView增加监听以及数据混乱的小坑

为 RecyclerView增加监听 1.在实现好的MyAdapter中写内部接口: public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public void setOnItemClickListener(OnItemClickListener onIt

浅谈Android Studio3.0更新之路(遇坑必入)

序言:作为这个世界上走在最前沿的生物"猿",怎么能对新事物一无所知呢,10月26日,随着Android 8.1 Oreo的预览版发布,Android Studio3.0正式版也发布了,作为Android开发的猿们我们应该早就知道谷歌在今年5月的开发者大会上就说了要支持Kotlin语言,所以这次更新一个比较大的点就在于支持Kotlin语言了,下面就跟着LZ的脚步来探索一下AS3.0吧 相信很多人很早就体验过谷歌爸爸放出来的体验版本了,虽然说正式版已经出了,但是很多人也不敢轻易贸然的更新,

详解关于Android Studio中安装和gradle的一些坑

本人从开始用Android Studio到现在已经快一年了吧,在我刚开始用的时候Android Studio还是1.2的版本.当时安装会因为国内墙的缘故,导致下载SDK步骤卡死无法安装. 最近的版本似乎都没出现这个问题,但是还是要吐槽一下最近的2.2.3的更新.这个版本安装包自带的SDK里build tools版本是25.0.2,支持的最低gradle版本是3.3,然而安装包内自带的gradle版本是3.2,所以单纯这个用安装包你并不能建立任何完整的项目,连自带的Helloworld项目都会报错

Android Studio升级到3.0后遇到的坑

这几天谷歌推出了as3.0的正式版,相信大家都进行更新了,然后对3.0的新特性也有过一些了解,最后磨刀霍霍开始宰杀,然鹅却一不小心就开始了排坑之路. 第一坑.必须升级gradle到4.0以上 相信这个大坑,一般使用as的人都会解决了,所以就不多说 第二坑.buildToolsVersion升级到26.0.0 其实这个不算坑,一般buildToolsVersion都会升级到最新的版本,直接更新就是了 第三坑.Error:Resource shrinker cannot be used for li

Android WebView使用的技巧与一些坑

随着手机性能的提高,以及iOS和Android两个平台的普及,更多的App都会选择两个平台的App都进行开发,在有些时候,为了更加快速的开发,我们会采用hybird方式开发,这个时候我们需要使用webview并且自己进行一些配置.Android的webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了chrome,因此问题很多,这里分享一些我使用过程的一些技巧和遇到的坑. ###webview配置### mWebview.getSettings().setJavaScr

Android中WebView的基本配置与填坑记录大全

前言 在应用程序开发过程中,经常会采用webview来展现某些界面,这样就可以不受发布版本控制,实时更新,遇到问题可以快速修复. 但是在Android开发中,由于Android版本分化严重,每一个版本针对webview都有部分更改,因此在开发过程中会遇到各种各样的坑,下面这篇就来给大家介绍关于Android中WebView的基本配置与填坑记录,话不多说了,来一起看看详细的介绍吧. 基本配置 // 硬件加速 getActivity().getWindow().setFlags( WindowMan

Android WebView组件用法详解

本文实例讲述了Android WebView组件用法.分享给大家供大家参考,具体如下: 如果想WebView能够访问网络,必须在AndroidManifest.xml里面添加权限 <uses-permission android:name="android.permission.INTERNET" /> main.xml很简单,就是一个WebView <?xml version="1.0" encoding="utf-8"?&g

Android开发腾讯验证码遇到的坑

我司为响应有关部门的号召,要求新注册的用户必须提供手机号验证.又为了防范有不怀好意之人故意盗刷短信,我司决定接入验证码.经前端同事调研之后,决定接入腾讯验证码.接入过程中还是踩了一些坑,为此特地写这篇文章 致腾讯令人作呕的开发文档 . 腾讯验证码开发指引 我们是Android端开发,服务器端的开发就交给后端同事吧.移动端的开发只需要从我们的后台请求一个url就可以. 移动端开发首先请阅读APP开发指引,接着阅读不同移动平台的API文档.Android开发者直接阅读Android客户端API就好了

Android WebView实现长按保存图片及长按识别二维码功能

先来简单说一下本文所要实现的功能:用户在浏览网页的时候,长按某一区域,识别如果是图片,则弹出弹框,出现保存图片的功能.同时识别图片是否是二维码,如果是则在弹框中追加识别二维码功能. 细节上:保存图片的弹框要显示在手指长按的位置:选择图片保存后,可以让用户直接去相册查看:选择识别二维码,判断是是不是网址,是的话可以让用户选择复制或访问,否则可以让用户选择复制或搜索. 然后再来看一下效果图: 保存图片 save.gif 识别包含普通文字的二维码: text.gif 识别包含网址的二维码: code.

Android webview转PDF的方法示例

1.网上找了好多没有显示出来效果不错,后来看到调用手机打印预览,看了效果还不错,就打算使用系统打印服务预览下载 2.'webView.createPrintDocumentAdapter()'得到打印的PrintDocumentAdapter有了该类就可以使用onWrite方法写入制定的文件,但是这个方法需要传入回调这个悲剧的是这个回调方法是hiden的我们没办法调用 3,字怎么解决呢,有连个方法 3.1 使用此开源库替换自己的sdk 中的android.jar文件,就可以使用了 https:/

Android WebView中图片浏览及缩放效果

本文实例为大家分享了Android WebView图片浏览及缩放效果展示的具体代码,供大家参考,具体内容如下 此工程用到了两个开源库: PhotoView支持图片的缩放 Android-Universal-Image-Loader图片的异步加载 (android studio)将两个源工程中的library文件夹导入到Demo Module所在的Project中,修改各自的build.gradle文件,让里面的版本号.所用的android包等与Demo Module相同即可.大致如图: 源代码:

Android webview加载https链接错误或无响应的解决

最近做无线WiFi的时候,在最后认证成功的时候会弹出一个广告页,于是用webview去加载了一下,结果没反应,打印url出来看了一下,发现是https格式的,在使用WebView加载https资源文件时,如果认证证书不被Android认可,那么会出现无法成功加载对应资源问题.那么,我们就要针对这一状况作出对应的处理. 于是百度了一下,这里记录一下,给大家做个参考: 1.设置WebView接受所有网站的证书 在认证证书不被Android所接受的情况下,我们可以通过设置重写WebViewClient

Android Webview的postUrl与loadUrl加载页面实例

关于Android的webview,用过的想必都不会陌生.这里我就不说webview的基本用法了,想要知道的可以去网上百多,有很多介绍webview基本用法的. 本文要介绍的主要是在项目过程中使用webview的postUrl遇到的坑. 1.使用场景如下: webview在加载H5链接时,默认是使用loadUrl进行加载,如果你设置了缓存属性(进行缓存),在显示的H5页面内点击跳转到另外一个页面后,按回退键,可以正常的返回到上一个页面,因为进行了缓存设置.但是如果使用postUrl进行加载,即使

Android WebView通过动态的修改js去拦截post请求参数实例

需求背景: 需要在用户点击提交按钮的时候拦截用户提交的数据. 遇到的问题: 1.页面不是自家前端做的,不能修改网页中的代码 2.要拦截的请求不是get请求,而是一个post请求 (难点在于:如果拦截的请求是get请求的话,我只需要拿到url,将后面拼接的参数键值对取出来就好了,但是post请求的参数键值对我们是看不到的...) 解决重点: 重写webViewClient的shouldInterceptRequest这个方法 1.这个方法是API21以后才出现的,还有一个过时的方法也要重写,不要忘