代号Pie!Android 9.0那些开发者必须知道的事

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chen_lian_/article/details/81516654

北京时间2018年8月7日,Google官方发布了Android 9.0版本,代号为Pie。没有发布会,也没有其他仪式,尽管Google之前已经对Pie 做了不少预热工作(比如在中国国内四五月份就有一些Google官方主办的Android P线下交流会)这对国内广大Android开发者可能是个喜忧参半的消息:Android 8.0还没适配好呢就给我来个9.0。

当然,Android 9.0 带给了我们许多可以称得上惊喜的新特性,比如自适应电池(AI的应用)、全新的MD等等,这些网上的许多文章已经相信的介绍过了。本篇文章对此不做赘述,只专注于那些跟安卓开发者有关的新特性与API。看完可能会让某些不喜欢吃Pie 的开发者感觉:真香!

本文所有内容都可以从Android开发者官网 找到(只是目前是纯英文)

使用RTT API 进行更精准的室内定位

Android 9新增了对IEEE 802.11mc Wi-Fi 协议(也就是RTT)的平台支持,这可以让开发者更精确地进行室内定位,对于一些使用LBS服务的的应用来说,这是个利好消息。

在运行Android 9且硬件支持的设备上,开发者可以使用RTT API来计算设备到附近的RTT协议的无线访问节点的距离,所谓“硬件支持是指:设备支持位置服务,且打开了WIFI扫描,且App拥有定位权限。出于隐私考虑,这个设备并不会连接到这个无线节点,只有设备可以确认自己到节点的距离,而无线节点并不能获取这个数据。

假如设备能获取到3个或以上的的节点的距离,就可以使用算法计算到设备的准确位置(从数学的角度来看,知道一个点到另外三个点的距离可以确定这个点的位置),结果的精度可以控制在1到2米内。

基于此,可以开发室内导航服务等。

跟RTT定位有关的API主要在 android.net.wifi.rtt包内,使用RTT定位,首先需要获取WifiRttManager

Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE)

一些API需要获取ACCESS_WIFI_STATE,CHANGE_WIFI_STATE,ACCESS_FINE_LOCATION等权限

当然,使用这个API也需要设备支持WIFI定位。

Tips:不是所有设备都支持RTT定位。假如你的应用只支持WIFI RTT定位才能运行,那么发布在Google Play上时只能由支持此类功能的设备才能下载。且需要如下声明:

<manifest ...>
    <uses-feature android:name="android.hardware.wifi.rtt" />
    ...
</manifest>

若不使用RTT也能正常运行,可以在代码中这样监测是否能使用RTT定位:

getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

使用RTT定位相关的方法,主要在RangingRequest,RangingRequest.Builder,RangingRequestCallback,WIfiRttManager这些类中,有兴趣的可以自行查阅。

屏幕适配(全面屏,刘海屏)

Android提供了最最新的全面屏的支持,包括刘海屏。

DisplayCutout这个类使得开发者可以找到那些无功能区域的位置和形状,在这些区域上无须展示内容。使用getDisplayCutout可以帮助我们确定这些区域是否存在以及位置。

一个新的布局属性, layoutInDisplayCutoutMode,可以允许开发者将应用内容平铺在刘海的周围,这个属性有下面三个值:

当然,在没有刘海屏的手机上我们也可以通过以下步骤进行刘海适配:

1.打开开发者选项

2.下拉到Drawing选项,并选择Simulate a display with a cutout(暂时不知道Android 9上这两处翻译是什么,后续更新)

3.选择刘海尺寸

适配刘海屏

通知

Android 9引进了一些对通知的提升,只支持API 28 及以上。

提升短信体验

从Android 7.0(API 24)开始,我们可以添加一个Action来回复短信,或者直接在通知栏中输入文字。Android 9提升了这方面的体验:

短信的提升:Person这个类可以用来分辨参与短信会话的人,包括他们的头像和URL。还有一些其他API,比如 addMessage() ,可以直接作用于 Person类而不仅仅是一段字符串(CharSequence)。Person类支持构建者模式(Builder)。

短信通知支持图片:开发者可以使用在Message中使用SetData()来展示图片,以下代码展示上文相关功能:

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);

保存回复作为草稿:当用户不经意间关闭通知时, app 可以接收到系统发送的 EXTRA_REMOTE_INPUT_DRAFT ,使用这个EXTRA 参数保存的字段,我们可以存储下用户要发送的回复短信的草稿。

确认是否群组会话:开发者可以使用 setGroupConservation() 来确认一个会话是群组会话或者非群组会话

为Intent的设置有语义的action:通过  setSemanticAction() 这个方法,我们可以为action赋予语义,比如:“mark as read," "delete," "reply,"

智能回复:Android 9会使用跟用户的短信app一样的便捷回复,使用 RemoteInput.setChoices() 来展示包含标准回复的数组给用户。

通知频道(channel)设置,广播,和勿扰模式

Android 8.0引进了通知频道(NotificationChannel) ,可以让开发者为每个想要展示的通知创建用户自定义的频道,Android 9简化了通知频道的设置:

阻塞通知群组:用户可以在应用的通知设置中设置阻止整个通知群组。开发者可以使用NotificationChannelGroup.isBlocked()来识别群组被阻止的时间,从而不会发送该组频道中的任何通知。

另外,开发者可以通过 getNotificationChannelGroup() 来获取当前频道群组设置。

新的广播(Broadcast) intent 类型:当通知频道和频道组的阻塞状态发生变化时,Android系统现在会发送广播意图(intent),拥有被阻止的频道或组的应用程序可以监听这些意图并做出相应的反应。有关这些意图操作和附加内容的更多信息,可以参阅NotificationManager  中更新的常量列表。有关对广播意图作出反应的信息,可以参阅 Broadcasts

NotificationManager.Policy 拥有三种新的 勿打扰模式 优先级类别:

NotificationManager.Policy还有七个新的Do-Not-Disturb(勿打扰)常量可用于抑制视觉中断:

由于篇幅所限,本文章目前仅介绍跟开发者密切相关的更新,后续还有双摄支持,相机更新,针对Bitmap和Drawable的新的图像解码方式(ImageDecoder),GIF和WEB动画的绘制(AnimatedImageDrawable)等,如果有希望了解更多的同学可以留言关注,考虑再更新一篇文章阐述其他新特性。如果文章有什么谬误的地方,也欢迎留言探讨。

展开阅读全文

没有更多推荐了,返回首页