做者:贺国睿、朱忠凯 腾讯移动客户端开发 高级工程师
商业转载请联系腾讯WeTest得到受权,非商业转载请注明出处。
原文连接:http://wetest.qq.com/lab/view/376.htmlhtml
2018年3月8日,Google推出了Android P Preview版本,并提供官方镜像下载。android
为了让广大开发者可以及时了解Android P的新功能特性,提早为您的app进行良好适配,WeTest决定限时免费开放Android P Preview版本的远程调试及标准兼容功能,供开发者进行体验。算法
即日起,针对WeTest平台的Android P、Android Oreo专区,我的认证用户可免费得到30分钟/天远程调试、3次/天标准兼容测试额度;企业帐户可得到60分钟/天远程调试、6次/天标准兼容测试额度。canvas
此外,WeTest的技术专家就本次Android P的新特性,进行了一些简单的开发体验,供你们参考:api
新功能特性抢先看
Android P的新功能特性集中在了UI、通知体验、室内定位、图像存储几个方面,解决了以前一直存在的痛点。例如WiFi RTT必定程度上弥补了蜂窝网络在室内环境下的定位问题,HEIC图像格式则重点解决了存储容量问题。同时,Android P也在通知丰富度及操做便捷性等功能方面有所加强和提高。安全
WiFi RTT功能是Android P新引入的一个功能,从原理上来讲与蜂窝网络的定位原理一致,但这个功能极大的弥补了蜂窝网络在室内定位的短板,WiFi RTT将可以在室内提供高精度的定位,这是蜂窝网络很难作到的。网络
WiFi RTT是全新的功能,在android.net.wifi包下增长了rtt包,用于存放WiFi RTT相关类和接口。app
WiFi RTT的API以WifiRttManager为核心,借助AP热点或WiFi,利用RTT原理完成测距,经过三个以上的测距点就可以准确地定位到设备所在位置。框架
WiFiRTTManager提供了测距接口,是一个异步测距操做,根据 官方文档 说明,其测距接口以下:异步
void startRanging(RangingRequest request, RangingResultCallback callback, Handler handler);
注: SDK Platforms Android P Preview Revision 1的相关接口定义与此不一样,但实际的官方镜像中接口与此一致,开发者须要更新最新的Android P Preview Revision 2,此版本中Google已经修正该接口。
接口中,RangingRequest经过RangingRequest.Builder构建,RangingRequest.Builder构建出RangingRequest所须要的参数能够经过WiFiManager等系统服务获取到相关的内容,如 List<ScanResult> scanResults = wifiManager.getScanResults();
如下提供一个简单的测试Demo,以供参考:
private WifiRttManager wifiRttManager; private WifiManager wifiManager; @Override protected void onCreate(Bundle savedInstanceState) { // ... ... if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)) { Object service = this.getApplicationContext().getSystemService(Context.WIFI_RTT_RANGING_SERVICE); if(service instanceof WifiRttManager) { wifiRttManager= (WifiRttManager) service; Log.i(TAG, "Get WifiRttManager Succ."); } wifiManager = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE); IntentFilter wifiFileter = new IntentFilter(); wifiFileter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); wifiFileter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); wifiFileter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); registerReceiver(new WifiChangeReceiver(), wifiFileter); } // ... ... } private void startScanAPs() { wifiManager.setWifiEnabled(true); wifiManager.startScan(); } class WifiChangeReceiver extends BroadcastReceiver { @RequiresApi(api = 28) @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { List<ScanResult> scanResults = wifiManager.getScanResults(); Log.i(TAG, "Wifi Scan size:" + scanResults.size()); for(ScanResult scanResult: scanResults) { Log.i(TAG, scanResult.toString()); RangingRequest.Builder builder = new RangingRequest.Builder(); builder.addAccessPoint(scanResult); wifiRttManager.startRanging(builder.build(), new RangingResultCallback() { @SuppressLint("Override") @Override public void onRangingFailure(int i) { // TODO } @SuppressLint("Override") @Override public void onRangingResults(List<RangingResult> list) { // TODO get result from list for(RangingResult result : list) { Log.i(TAG, result.toString()); } } }, new Handler()); } } } }
使用WiFi RTT时,须要在AndroidManifest.xml中增长以下声明:
<uses-feature android:name="android.hardware.wifi.rtt" />
经过上面的简单代码,就可以实现WiFi RTT的功能。
WiFi RTT功能适用于复杂地形的大型室内外场所,如商场、娱乐场所、大型休闲、游乐场等等,提供场所内的局部区域精确化导航等功能。相信在很快的时间内,就可以在各大地图应用内体验到这项便利功能,对于路痴、地图盲的伙伴们将是极大的福音。
随着iPhone X的推出,“刘海屏”达到了空前的高潮。Android P里提供了对异形屏幕的UI适配兼容方案,经过DisplayCutout类提供的相关接口,可以获取到屏幕中Cutout区域的信息。
借助DisplayCutout,能够获取到以下信息:
DisplayCutout displayCutout = view.getRootWindowInsets().getDisplayCutout(); if(displayCutout != null) { Region bounds = displayCutout.getBounds(); Log.d(TAG, String.format("Bounds:%s", bounds.toString())); int top = displayCutout.getSafeInsetTop(); int bottom = displayCutout.getSafeInsetBottom(); int left = displayCutout.getSafeInsetLeft(); int right = displayCutout.getSafeInsetRight(); Log.d(TAG, String.format("Cutout edge:[left:%d, top:%d,right:%d, bottom:%d]", left, top, right, bottom)); }
public Region getBounds()可以获取到Cutout区域的全部信息,Region就是Cutout区域。
public int getSafeInsetTop() public int getSafeInsetBottom() public int getSafeInsetLeft() public int getSafeInsetRight()
以上四个接口,能够获取到去除Cutout区域后的安全区域边界值。
经过上述数据,开发者可以精准的控制UI的绘制,避免将UI内容绘制到Cutout区域形成UI显示异常。
Android机器里,刘海屏目前仍是极为罕见的Google为了方便开发者调试,在Android P Preview镜像中,特别提供了Cutout的支持,具体打开方式能够参考Google提供的特性说明文档cutout小节内容。
如图所示,笔者使用手头的Pixel 2 XL体验了Android P的Cutout设置。
Android P在通知内容的丰富度和操做上作了优化。
最近的版本中,Android系统的通知管理方面一直优化升级,Android O提供了更细粒度的Channel功能,通知栏推送时须要指定NotificationChannel,用户能够对通知的Channel选择,只容许感兴趣的Channel推送的通知显示。经过通道设置、免打扰优化等方式,极大加强了消息体验。
加强消息体验
Android P继续改进和加强消息通知[v1] 。早在Android 7.0时,就提供了在通知中直接应答和输入,Android P对这一功能作了更多的加强。
Android P的通知中支持图像内容,能够经过setData()方法,给出消息的图像内容,在通知上展现給用户。
Android P一样简化了通知的配置形式。Android P中增长了Notification.Person类,用于区分同一个对话的参与者信息,如参与者的头像、URI等。根据官方说明,Android P中,通知消息的其余一些API,也使用Person替代以前的CharSequence。
简单的体验下新的API的开发:
NotificationChannel channel = new NotificationChannel("WtTestChannel", "WtTestChannel", NotificationManager.IMPORTANCE_DEFAULT); channel.enableLights(true); // luncher icon right corner's point channel.setLightColor(Color.RED); // read point channel.setShowBadge(true); // whether show this channel notification on long press icon Notification.Builder builder = new Notification.Builder(MainActivity.this, "WtTestChannel"); Notification.Person p = new Notification.Person(); p.setName("WeTest"); p.setUri("http://cdn.wetest.qq.com/" + "ui/1.2.0/pc/static/image/newLogo-16042.png"); Notification.MessagingStyle messageStyle = new Notification.MessagingStyle(p); Notification.MessagingStyle.Message message = new Notification.MessagingStyle.Message("WeTestMessage", 2000, p); //show image Uri image = Uri.parse( "http://cdn.wetest.qq.com/ui/1.2.0/pc/static/image/newLogo-16042.png"); message.setData("image/png", image); messageStyle.addMessage(message); builder.setStyle(messageStyle); builder.setSmallIcon(R.mipmap.ic_launcher); Notification notification = builder.build(); NotificationManager notifyManager = (NotificationManager) getSystemService( MainActivity.this.getApplicationContext().NOTIFICATION_SERVICE); notifyManager.createNotificationChannel(channel); notifyManager.notify("WeTest", 1, notification);
通道设置、广播和免打扰优化
Android P中,重点作了内容丰富上的工做,同时也对Channel的设置方面作了一些简化处理。
Android O版本里,首次推出了NotificationChannel,开发者须要配置相应的Channel,才可以推送通知給用户。用户可以更加细粒度[v1] 的针对App的Channel选择,而不是禁止App的全部通知内容。
而在Android P中,对通知的管理作了进一步的优化,包括能够屏蔽通道组、提供新的广播类型和新的免打扰优先级。
屏蔽通道组: 用户能够在通知设置中屏蔽App的整个通道组。开发者能够经过isBlocked()来判断某个通道组是否被屏蔽了,并根据结果,不向已经被屏蔽的通道组发送任何通知。另外,开发者能够在App中使用新接口getNotificationChannelGroup()来查询当前的通道组设置。
新的广播类型:新广播类型是针对通道和通道组的功能增长的“通道(组)屏蔽状态变化”广播。开发者App中能够对所拥有的通道(组)接收广播,并根据具体广播内容做出动做。开发者能够经过NotificationManager,查看广播相关的具体信息。针对广播的动做能够经过Broadcasts查看具体的方法和信息。
免打扰优先级: NotificationManager.Policy增长了两个新的优先级常量,PRIORITY_CATEGORY_ALARMS(警告优先),PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER (媒体、系统和游戏声音优先)。
近一段时间,双摄、多摄等机型纷纷面世。双摄及多摄提供了单摄像头所没法完成的能力,如无缝缩放、散景和立体视觉。Android P在这方面也提供了系统级的API支持。
Android P提供了系统API,支持从两个或者多个物理摄像头同步获取数据流。此前OEM厂商提供的双摄设备可能是厂商自行定制系统实现,此时Android P推出了API,从系统层面上制定了API规范。
新的API提供了在不一样相机之间切换逻辑数据流或混合数据流的调用能力。在捕捉延迟方面,提供新的会话参数,下降初始捕捉延迟。同时,提供相机共享能力,以解决在多种使用相机的场景下重复中止、开启相机流。闪光灯方面,Android P增长基于显示的闪光灯支持。光学防抖方面,Android P向开发者提供OIS时间戳,用于图像稳定性优化以及其余特效使用。
此外,Android P还支持外部USB/UVC相机,可使用更强大的外置摄像头模组。
Android P引入了新的ImageDecoder,该类除了支持对各类图片格式的解码、缩放、裁剪以外,其强大之处在于支持对解码后的图像作后期处理(post-process),使用该功能能够添加复杂的自定义特效,好比圆角,或是将图片放在圆形像框中。编写后期处理回调函数,你能够添加任何绘图指令实现须要的效果。
此外,Android P原生支持GIF和WebP格式的动图,新增了AnimatedVectorDrawable类,并被新增的解码器类ImageDecoder直接支持,用法跟矢量动画类AnimatedVectorDrawable相似,实现方式也相似,经过新增渲染线程和工做线程,不须要在UI线程处理动图更新,能够说是无痛使用,很是省心。
下面经过编写代码,显示一张gif图,并利用后期处理机制,在图像中间绘制一个绿色的实心圆。
final ImageView image = (ImageView) findViewById(R.id.image); File gifFile = new File("/data/local/tmp/test.gif"); if (!gifFile.exists()) { Log.d(TAG, "gifFile is not exsited!"); return; } ImageDecoder.Source source = ImageDecoder.createSource(gifFile); try { d = ImageDecoder.decodeDrawable(source, new ImageDecoder.OnHeaderDecodedListener() { @Override public void onHeaderDecoded(ImageDecoder imageDecoder, final ImageDecoder.ImageInfo imageInfo, ImageDecoder.Source source) { imageDecoder.setPostProcessor(new PostProcessor() { @Override public int onPostProcess(Canvas canvas) { int w = imageInfo.getSize().getWidth(); int h = imageInfo.getSize().getHeight(); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.GREEN); canvas.drawCircle(w/2, h/2, h/4, new Paint(paint)); return 0; } }); } }); image.setVisibility(View.VISIBLE); image.setImageDrawable(d); } catch (IOException e){ Log.d(TAG, e.toString()); } Button button = (Button) findViewById(R.id.buttonText); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (d != null && d instanceof AnimatedImageDrawable) { AnimatedImageDrawable ad = (AnimatedImageDrawable) d; if (ad.isRunning()) { Log.d(TAG, "stop running"); ad.stop(); } else { Log.d(TAG, "start running"); ad.start(); } } } });
Android P内置了对HDR VP9和HEIF(heic)图像编码的支持。HEIF是苹果在iOS11推出的一种高效压缩格式,目前在IphoneX、Iphone 八、IPhone 8P上已经支持。该格式的压缩率更高,可是编码该格式须要硬件的支持,解码并不须要。最新的支持库中的HeifWriter支持从YUV字节缓冲区、Surface或是Bitmap类转换为HEIF格式的静态图像。
Android P新引入了MediaPlayer2,支持DataSourceDesc建立的播放列表。
功能优化提高一览
1、神经网络API 1.1
在前不久发布的Android 8.1 (API level 27)上,Google首次在Android平台上推出了神经网络API,这意味着咱们的Android机器智能化水平又提升了一大步。而本次Android P,进一步丰富了神经网络的支持,不只对以前的相关API进行了优化,而且提供了9个新的操做,为具体的数据操做方面提供了更深刻的支持。
2、改进表单自动填充
Android 8.0(API等级26)中引入了自动填充框架,这使得在应用中填写表单变得更加容易。 Android P引入了自动填充服务并实现了多项改进,得以在填写表单时进一步加强用户体验。
3、安全加强
Android P引入了许多新的安全功能,包括统一的指纹验证对话框和敏感交易的高确信度的用户确认。应用程序内的指纹认证UI也将会更加一致。
统一的指纹验证对话框
若是第三方APP想要使用指纹,Android系统框架为应用提供了指纹认证对话框,该功能能够提供统一的外观和使用体验,用户使用起来更放心。若是您的程序还在使用FingerprintManager,如今改用FingerprintDialog替代吧,系统来提供对话框显示。对了,在使用FingerprintDialog以前,别忘了调用hasSystemFeature()方法检查手机设备是否支持指纹。
敏感交易的高确信度的用户确认
Android P系统提供了受保护的确认API,借助这组全新的API,应用可使用ConfirmationDialog对话框向用户提示,请求用户批准一条简短的声明, 该声明容许应用提醒用户,即将完成一笔敏感交易,例如支付。
若是用户接受声明,应用将会收到一条key-hash的消息认证码(HMAC),该签名由TEE产生,以保护用于输入和认证对话框的显示。该签名表示用于已经看到了声明并赞成了。
硬件安全模块
Android P还提供了StrongBox Keymaster(强力沙盒秘钥大师),一个存储在硬件安全模块的具体实现。在这个硬件安全模块中有本身的CPU、安全存储空间,真随机数生成器,以及额外的机制抵御应用被篡改或是未受权应用的恶意加载。当检查存储在StrongBox Keymaster中的密钥时,系统经过可信执行环境(TEE)确认密钥的完整性。为了下降能耗,StrongBox支持了一组算法和不一样长度的秘钥:
● RSA 2048
● AES 128 and 256
● ECDSA P-256
● HMAC-SHA256 (支持8字节到64字节任意秘钥长度)
● Triple DES 168
须要说明的是,这个机制须要硬件支持。
安全秘钥导入KeyStore
使用新的ASN.1编码的秘钥格式添加导入秘钥到Keystore,Android P提供了额外的密码解密安全能力。以后KeyMaster就能够解密KeyStore存储的秘钥,这种工做方式使得秘钥明文永远不会出如今设备内存中。这项特性要求设备支持Keymaster 4。
4、支持客户端侧Android备份加密
Android P支持使用客户端密钥对Android备份进行加密。 这项隐私措施,须要设备的PIN、图案密码或标准密码才能从用户设备备份的数据中恢复数据。
5、Accessibility优化
为了使App使用更便捷,Android在多个方面为开发者提供了易用性的优化。
Navigation semantics
Android P在App的场景切换和操做上为开发者提供了不少的优化点。
Accessibility pane titles
Android P中对Section提供了新的机制,被称为accessibility pane titles, Accessibility services可以接收这些标题的变化,使得可以对一些变化提供更加细粒度的信息。
指定Section的标题,能够经过android:accessibilityPaneTitle新属性来设置,一样运行时能够经过setAccessibilityPaneTitle()来设置标题。
顶部栏导航
Android P提供了新的顶部栏导航机制,经过设置View实例的android:accessibilityHeading属性为true,来显示逻辑标题。经过这些标题,用户就能够从一个标题导航到下一个标题,
群组导航和输出
针对屏幕阅读器,Android P对View提供了新的属性android:screenReaderFocusable代替原有的android:focusable来作标记,来解决在一些场景下为了使屏幕阅读器工做而设置View为可获取焦点的操做。这时,屏幕阅读器须要同时关注android:screenReaderFocusable和android:focusable设置为ture的View。
便捷操做
tooltips交互
Android P中,可使用getTooltipText()去读取tooltips的文本内容。使用新的ACTION_SHOW_TOOLTIP和ACTION_HIDE_TOOLTIP控制View显示或者隐藏tooltips。
新全局交互
Android P在AccessibilityService类中提供了两个全新的操做。开发者的Service能够经过GLOBAL_ACTION_LOCK_SCREEN帮助用户锁屏,经过GLOBAL_ACTION_TAKE_SCREENSHOT帮助用户完成屏幕截图。
窗体改变的一些细节
Android P优化了在App多窗体同步发生变化时的更新内容获取。当出现TYPE_WINDOWS_CHANGED时,开发者能够经过getWindowChanges()API获取窗体变化状况。
当多窗体发生改变时,每一个窗体都会发出本身的事件,开发者能够经过getSource()获取到事件窗体的根View。
若是你的App为View定义了accessibility pane titles,UI更新时你的Service就可以识别到相应的改动。当出现TYPE_WINDOW_STATE_CHANGED事件时,使用新方法 getContentChangeTypes()返回的类型,就可以获取到当前窗体的变化状况。例如,如今就可以经过上述的机制,检测到一个[v1] 窗格是否有了新标题,或者一个窗格的消失。
旋转屏幕,是一些游戏、视频等场景必要的操做,但有一些场景,用户旋转屏幕并非为了让应用显示从竖屏变成横屏或反过来。为了不这种误操做,Android P提供了新的机制,开发者能够指定屏幕不随重力感应旋转,而是用户经过一个单独的按钮自行控制屏幕显示转向。
参考文档:
https://developer.android.goo...
点击连接:http://wetest.qq.com/cloud/help/AndroidP 便可限时免费体验Android P Preview版本的远程调试及标准兼容功能。
若有任何问题,或对系统的建议,请联系WeTest小助手(QQ:800024531)。
咱们会将与谷歌技术专家共同为您解答。