问答:Android P更新了哪些功能?
一、WiFi RTT功能——复杂地形下精准导航
WiFi RTT功能是Android P推出的新功能,原则上与蜂窝网的定位原理一致,但该功能极大地弥补了蜂窝网室内定位的不足,WiFi RTT将能够提供室内高精度定位,这是蜂窝网难以做到的。
WiFi rtt是一个全新的功能。android.net.wifi包下增加RTT包,存储WiFi RTT相关类和接口。
WiFi RTT的API以WifiRttManager为核心,借助AP热点或WiFi,利用RTT原理,通过三个以上的测距点就可以精确定位设备的位置。
WiFiRTTManager提供了一个测距接口,这是一个异步测距操作。根据官方文档(/reference/Android/net/wifi/RTT/wifirtmanager . html),其测距界面如下:
void start ranging(ranging request请求,RangingResultCallback回调,Handler处理程序);
注意:?SDK平台Android P预览版1的界面定义不同,但实际官方图中的界面与此一致。开发者需要更新最新的Android P预览版2,谷歌在该版本中已经修正了这个界面。
在界面中,RangingRequest是由RangingRequest构建的。生成器,以及将由RangingRequest生成的RangingRequest所需的参数。Builder可以通过WiFiManager等系统服务获取相关内容,比如?列表& ltScanResult & gtscan results = wifi manager . getscanresults();
下面提供一个简单的测试演示供您参考:
私有WifiRttManager wifiRttManager
私人WifiManager wifiManager
@覆盖
受保护的void onCreate(Bundle saved instancestate){
// ......
if(getPackageManager()。hasSystemFeature(package manager。FEATURE_WIFI_RTT)) {
object service = this . getapplicationcontext()。getSystemService(上下文。WIFI _ RTT _测距_服务);
WifiRttManager的服务实例){
wifiRttManager= (WifiRttManager)服务;
Log.i(标签,“获取WifiRttManager成功。”);
}
wifi manager =(wifi manager)this . getapplicationcontext()。getSystemService(上下文。WIFI _服务);
intent filter wifi filter = new intent filter();
wifi leter . addaction(wifi manager。网络_状态_已更改_操作);
wifi leter . addaction(wifi manager。WIFI _状态_已更改_动作);
wifi leter . addaction(wifi manager。扫描_结果_可用_动作);
registerReceiver(新的WifiChangeReceiver()、wifi leter);
}
// ......
}
私有void startScanAPs() {
wifi manager . setwifienabled(true);
wifi manager . starts can();
}
WifiChangeReceiver类扩展BroadcastReceiver {
@RequiresApi(api = 28)
@覆盖
公共void onReceive(上下文语境,意图意图){
if (intent.getAction()。等于(WifiManager。扫描结果可用操作){
列表& ltScanResult & gtscan results = wifi manager . getscanresults();
Log.i(标签," Wifi扫描大小:"+Scan results . size());
for(ScanResult扫描结果:?扫描结果){
Log.i(标记,scan result . tostring());
RangingRequest。builder builder = new ranging request。builder();
builder . addaccess point(scan result);
wifirttmanager . start ranging(builder . build(),new RangingResultCallback() {
@SuppressLint("Override ")
@覆盖
RangingFailure上的public void(int I){
// TODO
}
@SuppressLint("Override ")
@覆盖
public void on ranging results(List & lt;RangingResult & gt列表){
// TODO从列表中获取结果
for(RangingResult结果:列表){
Log.i(标记,结果. tostring());
}
}
},new Handler());
}
}
}
}
使用WiFi RTT时,需要在AndroidManifest.xml中添加以下语句:
& ltuses-feature Android:name = " Android . hardware . wifi . RTT "/& gt;
通过上面简单的代码,就可以实现WiFi RTT的功能。
WiFi RTT功能适用于大型室内外地形复杂的场所,如商场、娱乐场所、大型休闲、游乐场等。,并提供在地点中精确导航本地区域等功能。相信在很短的时间内,你就能在各大地图应用中体验到这个便捷的功能,对于路痴和地图盲的伙伴来说,这将是一大福音。
第二,显示剪辑-支持刘海平
随着iPhone X的推出,“刘海平”达到了前所未有的高潮。Android P提供了异形屏幕的UI适配和兼容方案。通过DisplayCutout类提供的相关接口,可以获得屏幕中剪切区域的信息。
借助DisplayCutout,您可以获得以下信息:
display cutout display cutout = view . getrootwindowinsets()。getDisplayCutout();
if(displayCutout!= null) {
region bounds = display cutout . get bounds();
Log.d(TAG,String.format("Bounds:%s ",Bounds . tostring()));
int top = display cutout . getsafeinsettop();
int bottom = display cutout . getsafeinsetbottom();
int left = display cutout . getsafeinsteleft();
int right = display cutout . getsafeinsetright();
Log.d(TAG,string . format(" Cutout edge:[左:%d,上:%d,右:%d,下:%d]",left,top,right,bottom));
}
公共区域getBounds()可以获取剪切区域的所有信息,区域就是剪切区域。
public int getSafeInsetTop()
public int getSafeInsetBottom()
public int getSafeInsetLeft()
public int getSafeInsetRight()
以上四个接口可以得到切除区域后安全区域的边界值。
通过以上数据,开发者可以准确控制UI的绘制,避免将UI内容绘制到剪切区域导致的UI显示异常。
在安卓机中,刘海平目前还极为少见。为了方便开发者调试,Google在Android P预览图中特别提供了剪切支持。具体的打开方式,请参考Google提供的功能描述文档的剪切部分。
剪切部分:/preview/features.html#cutout
如图,笔者用手头的Pixel 2 XL体验了一下Android P的抠图设置。
第三,通知优化——更多样的操作,更丰富的内容
Android P对通知内容的丰富性和操作性进行了优化。
在最新版本中,Android系统的通知管理进行了优化升级。Android O提供了更细粒度的通道功能。当推通知栏时,需要指定NotificationChannel。用户可以选择通知渠道,只允许显示感兴趣的渠道推送的通知。通过频道设置和无干扰优化,极大地增强了消息体验。
增强消息体验
Android P继续改进增强消息通知[v1]?。早在Android 7.0就在通知中提供了直接响应和输入,Android P对该功能做了更多的增强。
Android P的通知支持图片内容,可以通过setData()方法给出消息的图片内容,并在通知中显示给用户。
Android P还简化了通知的配置。班级通知。Android P中加入了Person来区分同一个对话中的参与者的信息,比如他们的头像和URIs。根据官方的解释,在Android P中,其他一些通知消息的API也是使用Person,而不是之前的CharSequence。
简单体验下新API的开发;
notification channel channel = new notification channel(" WtTestChannel ",
“WtTestChannel”,NotificationManager。重要性_默认);
channel . enable lights(true);//午餐者图标右上角的点
channel.setLightColor(颜色。红色);//读取点
channel . setshowbadge(true);//是否在长按图标上显示该频道通知
通知。生成器生成器=
新通知。构建器(MainActivity.this,
“WtTestChannel”);
通知。人员p =新通知。person();
p . set name(" we test ");
p.setUri("/" +
" ui/1 . 2 . 0/PC/static/image/new logo-16042 . png ");
通知。MessagingStyle messageStyle =新通知。messaging style(p);
通知。消息样式。消息消息=
新通知。messaging style . Message(“wetest Message”,2000年,p);
//显示图像
Uri image = Uri.parse(
"/ui/1 . 2 . 0/PC/static/image/new logo-16042 . png ");
message.setData("image/png ",图像);
messageStyle.addMessage(消息);
builder . set style(message style);
builder . setsmallicon(r . MIP map . IC _ launcher);
通知notification = builder . build();
NotificationManager通知管理器=
(notification manager)getSystemService(
main activity . this . getapplicationcontext()。通知_服务);
notify manager . createnotificationchannel(通道);
notifyManager.notify("WeTest ",1,notification);
频道设置、广播和无干扰优化
在Android P中,我们侧重于丰富内容,同时简化了频道的设置。
在Android O版本中,首次引入了NotificationChannel,开发者需要配置相应的通道,才能向用户推送通知。用户可以更粒度吗[v1]?为应用选择频道,而不是禁止应用的所有通知内容。
在Android P中,对通知的管理进一步优化,包括阻塞频道组,提供新的广播类型和新的免打扰优先级。
屏蔽通道组:?用户可以在通知设置中筛选App的整个频道组。开发者可以通过isBlocked()判断一个通道组是否被阻塞,根据结果,不会向被阻塞的通道组发送任何通知。此外,开发人员可以使用应用程序中的新接口getNotificationChannelGroup()来查询当前的通道组设置。
新的广播类型:新的广播类型是“频道(组)屏蔽状态改变”广播,增加了频道和频道组的功能。在开发者应用中,您可以接收您拥有的频道(组)的广播,并根据具体的广播内容进行操作。开发人员可以通过NotificationManager查看与广播相关的特定信息。对于广播这个动作,可以通过广播查看具体的方法和信息。
勿扰优先级:?通知管理器。策略增加了两个新的优先级常量,PRIORITY_CATEGORY_ALARMS和PRIORITY _ CATEGORY _ media _ system _ other?(媒体、系统、游戏声音优先)。
第四,支持多摄像头和摄像机* * *
最近双摄和多摄机型陆续出现。双摄像头和多摄像头提供了单个摄像头无法实现的功能,如无缝变焦、全景视图和立体视觉。Android P在这方面也提供了系统级的API支持。
Android P提供了一个系统API,支持两台或多台物理相机同时采集数据流。之前OEM厂商提供的双摄像头设备,大部分都是厂商自己定制的。这时候Android P推出了API,从系统层面制定了API规范。
新的API提供了在不同摄像机之间切换逻辑数据流或混合数据流的调用能力。在捕获延迟方面,提供了新的会话参数来减少初始捕获延迟。同时,它为相机提供了在使用相机的各种场景中重复停止和启动相机流的能力。flash方面,Android P增加了基于显示的flash支持。在光学防抖方面,Android P向开发者提供了OIS时间戳,用于图像稳定性优化和其他特效。
此外,Android P还支持外置USB/UVC摄像头,可以使用更强大的外置摄像头模块。
第五,支持图像媒体的后期处理
Android P推出了全新的ImageDecoder,不仅支持各种图像格式的解码、缩放和裁剪,还支持解码后图像的后期处理。使用此功能,您可以添加复杂的自定义效果,如圆角,或将图片放在圆形框架中。写一个后处理回调函数,可以添加任意画图指令,达到想要的效果。
此外,Android P原生支持GIF和WebP格式的动画,并添加了AnimatedImageDrawable类,该类由新添加的解码器类ImageDecoder直接支持。用法和矢量动画类AnimatedVectorDrawable类似,实现也类似。通过添加渲染线程和工作线程,不需要在UI线程中处理动画更新,可以说使用起来不痛不痒,非常省心。
下面通过编写代码展示了一个gif图像,利用后处理机制在图像中间画了一个绿色的实心圆。
final ImageView image =(ImageView)findViewById(r . id . image);
File gif File = new File("/data/local/tmp/test . gif ");
如果(!gifFile.exists()) {
Log.d(标签,“gifFile不存在!”);
返回;
}
图像解码器。source source = image decoder . createsource(gif file);
尝试{
d = ImageDecoder.decodeDrawable(来源,新ImageDecoder。onheaderdecodelistener(){
@覆盖
public void on header decoded(image decoder image decoder,final ImageDecoder。ImageInfo imageInfo,ImageDecoder。Source source) {
imageDecoder.setPostProcessor(新的后处理器(){
@覆盖
public int onPostProcess(Canvas Canvas){
int w = imageInfo.getSize()。getWidth();
int h = imageInfo.getSize()。getHeight();
油漆油漆=新油漆();
paint . setantialias(true);
paint.setColor(颜色。绿色);
canvas.drawCircle(w/2,h/2,h/4,new Paint(画图));
返回0;
}
});
}
});
image.setVisibility(视图。可见);
image . setimagedrawable(d);
} catch (IOException e){
Log.d(TAG,e . tostring());
}
Button Button =(Button)findViewById(r . id . Button text);
button.setOnClickListener(新视图。OnClickListener() {
@覆盖
公共void onClick(视图视图){
如果(d!= null & amp& ampAnimatedImageDrawable的d实例){
AnimatedImageDrawable ad =(AnimatedImageDrawable)d;
if (ad.isRunning()) {
Log.d(标签,“停止运行”);
ad . stop();
}否则{
Log.d(标签,“开始运行”);
ad . start();
}
}
}
});
第六,支持HDR VP9和HEIF。
Android P内置了对HDR VP9和HEIF(heic)图像编码的支持。HEIF是苹果在iOS11中推出的一种高效压缩格式,已经在IphoneX、Iphone 8、IPhone 8P上得到支持。这种格式的压缩率更高,但是这种格式的编码需要硬件的支持,解码不需要。最新支持库中的HEIFWriter支持从YUV字节缓冲区、表面或位图类转换为Heif格式的静态图像。
Android P新推出了MediaPlayer2,支持DataSourceDesc创建的播放列表。
功能优化和升级概述
一、神经网络API 1.1
在最近发布的Android 8.1(API 27级)上,Google首次在Android平台上推出了神经网络API,这意味着我们Android机的智能化水平有了很大的提升。这一次,Android P进一步丰富了对神经网络的支持,不仅优化了之前的相关API,还提供了9种新的操作,为具体的数据操作提供了更深入的支持。
第二,改进表格的自动填写
Android 8.0(API 26级)引入了自动填充框架,使得在应用中填写表单变得更加容易。Android P推出了自动填写服务,并实现了很多改进,可以进一步提升用户填写表单时的体验。
第三,加强安全
Android P引入了许多新的安全功能,包括统一的指纹验证对话框和敏感交易的高可信度用户确认。应用中的指纹认证UI也会更加一致。
统一指纹验证对话框
如果第三方APP要使用指纹,Android系统框架为应用提供了指纹认证对话框,可以提供统一的外观和体验,用户使用起来更放心。如果您的程序仍在使用FingerprintManager,请改用FingerprintDialog,系统将提供对话框显示。对了,在使用FingerprintDialog之前,别忘了调用hasSystemFeature()方法来检查手机设备是否支持指纹。
用户对敏感交易的高可信度确认
Android P系统提供了一个受保护的确认API。有了这组新的API,应用程序可以使用ConfirmationDialog对话框来提示用户,并要求用户批准一个简短的语句,这允许应用程序提醒用户一个敏感的交易(如支付)即将完成。
如果用户接受该语句,应用程序将收到一个由TEE生成的密钥哈希消息验证码(key-hash message authentic ation code,HMAC ),以保护用于输入和验证的对话框的显示。此签名表示您已经看过声明并同意。
硬件安全模块
Android P还提供了一个StrongBox Keymaster,存储在硬件安全模块中的具体实现。该硬件安全模块具有其自己的CPU、安全存储空间、真随机数发生器和额外的机制来抵抗应用程序篡改或未授权应用程序的恶意加载。当检查存储在StrongBox Keymaster中的密钥时,系统通过可信执行环境(TEE)确认密钥的完整性。为了降低能耗,StrongBox支持一组不同长度的算法和密钥:
●?RSA 2048
●?AES 128和256
●?ECDSA P-256
●?HMAC-SHA256(支持从8字节到64字节的任何密钥长度)
●?三重DES 168
需要注意的是,这种机制需要硬件支持。
将安全密钥导入密钥库
使用新的ASN.1编码密钥格式将导入密钥添加到密钥库中,Android P提供了额外的密码解密安全功能。之后,KeyMaster可以解密存储在KeyStore中的密钥,这使得密钥明文永远不会出现在设备内存中。此功能要求设备支持Keymaster 4。
第四,支持客户端安卓备份加密
Android P支持用客户端密钥加密Android备份。这种隐私措施需要设备的PIN、模式密码或标准密码来从用户设备备份的数据中恢复数据。
动词 (verb的缩写)可及性优化
为了让App使用起来更加方便,Android在很多方面为开发者提供了可用性优化。
1、导航语义
Android P在App的场景切换和操作上为开发者提供了很多优化点。
2、辅助功能窗格标题
Android P为Section提供了一个新的机制,叫做可访问性窗格标题。可访问性服务可以接收这些标题的更改,以便它可以为某些更改提供更细粒度的信息。
指定节的标题,可以通过android的新属性:accessibilityPaneTitle设置,也可以在运行时通过setAccessibilityPaneTitle()设置。
3.顶部栏中的导航
Android P为顶栏提供了新的导航机制,通过将视图实例的android:accessibilityHeading属性设置为true来显示逻辑标题。使用这些标题,用户可以从一个标题导航到下一个标题。
4.群组导航和输出
对于屏幕阅读器,Android P提供了一个新的属性Android:screenReaderFocusable to View而不是原来的android:focusable来标记它,解决了为了让屏幕阅读器在某些场景下工作而将视图设置为焦点的操作。此时,屏幕阅读器需要注意同时将android:screenReaderFocusable和android:focusable设置为true的视图。
5、操作方便
工具提示交互
在Android P中,可以使用getTooltipText()读取工具提示的文本内容。使用新的ACTION_SHOW_TOOLTIP和ACTION_HIDE_TOOLTIP来控制视图显示或隐藏工具提示。
新的全球互动
Android P在AccessibilityService类中提供了两个新的操作。开发者的服务可以通过GLOBAL_ACTION_LOCK_SCREEN帮助用户锁屏,通过GLOBAL _ ACTION _ TAKE _ SCREEN帮助用户完成截图。
形态变化的一些细节
Android P在App多种形式的同步发生变化时,优化了更新内容的获取。当TYPE_WINDOWS_CHANGED出现时,开发者可以通过getWindowChanges()API获取表单的变化。
当多个表单发生变化时,每个表单都会发出自己的事件,开发者可以通过getSource()获得事件表单的根视图。
如果您的应用程序为视图定义了辅助功能窗格标题,则您的服务可以在UI更新时识别相应的更改。当TYPE_WINDOW_STATE_CHANGED事件发生时,您可以通过使用新方法getContentChangeTypes()返回的类型来获取当前表单的更改。比如a [v1]现在可以通过上面的机制检测出来?窗格是否有新标题,或者窗格是否消失。
不及物动词新轮换方案
旋转屏幕在一些游戏、视频等场景中是必要的操作,但在一些场景中,用户并没有旋转屏幕来使应用显示从竖屏变为横屏或反之。为了避免这种误操作,Android P提供了新的机制。开发者可以指定屏幕不随着重力感应旋转,但用户可以通过单独的按钮控制屏幕显示转向。