Android 5.0 API变化
译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html ——
By NashLegend
Sample示例在这里找:https://github.com/googlesamples/
原译文在我的github上:https://github.com/NashLegend/ProjectBabel/blob/master/Android%205.0%20APIs.md
前排渣翻译预警
,如果你能提供更好更专业的翻译或者提出修改意见就好了……
API
Level: 21
Android 5.0 (LOLLIPOP) 为用户和开发人员提供了一些新特性,这篇文章将重点介绍一些值得注意的新增API。
如果你已经发布了一款app,请查看这里 Android 5.0 系统行为变化 以适配你的app. 在Android5.0上,即使你没有使用最新API或者新功能,这些新的系统行为仍可能会影响你的app。
如果想看一些新平台的更高级的特性,请看这里
开始开发
要为Android 5.0开发app,请先使用SDK Mnager下载最新的SDK和系统镜像。
升级你的target
API
为使得你的app在Android获得更好的表现,请将你的targetSdkVersion设置成21。调用最新的Android 5.0 API的时候要注意在调用前判断系统版本号以兼容之前的系统版本。不能使用低于minSdkVersion的API。详见Android后向兼容性
欲知更多有关API级别的事儿,看这里:啥是API级别
用户界面
Material
design 支持
Android 5.0 新增了material design样式的支持. 你可以通过material design创建具有自然的动态效果和过渡风格的app. 系统支持包括以下方面:
-
系统自带Material design主题
-
组件阴影
-
RecyclerView组件以取代ListView
-
Drawable动画和样式效果。(这里应该是指Ripple Drawable之类)(Drawable animation and styling effects)
-
Material design风格的动画和activity过渡效果
-
基于组件状态的Animator。(Animators for view properties based on the state of the view)
-
可定制的UI组件和工具栏(这里指的应该是ToolBar)
-
基于XML的矢量动画和图形(Animated and non-animated drawables)
欲知更多有关Material Design的事儿,看这里。
以及我翻译的下面两篇:
在低版本Android上使用Material Design。
如何在你的App中应用Material Design设计风格。
“最近运行”界面上的多开的文档和activity(相当于MFC等的多文档)
以前的版本中,“最近运行”界面对于一个app来说只能显示用户最近交互过的一个task。现在你的应用可以打开更多task以同时打开不同的文档。这种新的多任务特性可以让用户在最近运行界面中快速在activity们和打开的文档们之间任意切换。有可能使用这种并发任务的情景示例:浏览器标签多开、看比赛多开、生产力工具(比如Word、PPT等)文档多开、多窗口与多个妹子聊天等等。你的app可以通过ActivityManager.AppTask来管理这些task。
要让系统把你的activity当成一个新的task,在startActivity()的时候使用FLAG_ACTIVITY_NEW_DOCUMENT,你也可以在manifest文件中把activity的documentLaunchMode
属性设置成"intoExisting"
或者 "always"
来实现这一点。
为了避免“最近运行”界面太多太乱,你可以设置你的app可以显示在此界面上的最大任务数量——设置manifest文件中 的属性android:maxRecents
,目前的最大数量是每个用户50个,RAM较小的手机则为25个。
最近运行界面上的task可以设置为重启时常驻(persist across reboots),可以设置android:persistableMode属性以控制常驻行为。你也可以通过setTaskDescription()方法修改activity在最近运行界面上的颜色、标签和图标等可见元素。
WebView
更新
Android 5.0的WebView升级到了Chromium M37,修复了诸多bug以及带来了安全和稳定性的加强,默认的user-agent也已经升级到了37.0.0.0。
新的WebView引入了PermissionRequest类,可以允许你的app通过类似getUserMedia()赋予WebView摄像头和麦克风的权限——当然前提是你的app也有相应的权限。
使用最新的onShowFileChooser()方法,你可以通过一个input选择设备里的图片和文件了。
此外,新的WebView还带来了对WebAudio,WebGL,WebRTC的支持。欲知更多WebView的新特性,请看这里。
屏幕捕获和分享
Android 5.0新增android.media.projection API以让你拥有捕获和屏幕分享功能。举个例子,如果你要在视频会议app中添加屏幕分享功能的话,就可以使用这个功能。
新的 createVirtualDisplay() 方法
允许你的app将主屏幕内容(the default display)捕获到一个Surface对象上,这样你的app就可以通过网络对此进行分享。这个API只允许捕获非敏感屏幕内容,不能捕获声音。要进行屏幕捕获,你的app必须要先发起一个对话框请求用户同意,此请求通过发送createScreenCaptureIntent() 方法产生的Intent实现。
你可以查看示例项目的MediaProjectionDemo
来学习如何使用新的API。
通知
锁屏通知
从Android 5.0开始可以在锁屏界面上显示通知。用户可以通过设置选择是否允许敏感通知内容显示在安全锁屏界面(secure lock screen)上。
你的应用可以控制通知内容的具体显示级别,通过调用setVisibility()方法传入下面值中的一个:
-
VISIBILITY_PRIVATE: 显示基本信息,比如说icon,但是隐藏具体内容。
-
VISIBILITY_PUBLIC: 显示通知的所有内容.
-
VISIBILITY_SECRET: 不显示任何东西,icon也不显示.
如果你设置的是VISIBILITY_PRIVATE,你可以设置显示敏感内容的替代信息,比如“收到了3条QQ消息”,但是不显示具体消息的联系人。要提供这种显示,首先用Notification.Builder创建一个替代通知。当创建private通知的时候,通过setPublicVersion() 方法将这个替代通知关联到这个隐私通知上。
Notifications
元数据
Android 5.0通过关联在你的通知上的元数据对通知进行智能排序。你可以通过Notification.Builder的下面这些方法设置这些元数据:
图形
对OpenGL
ES 3.1的支持
Android 5.0为OpenGL ES 3.1增加java接口和native支持。3.1重要的新增功能包括:
OpenGL ES 3.1 的java接口是GLES31。使用OpenGL ES 3.1的时候,请在manifest里面使用标签及android:glEsVersion
属性声明之,例如:
<manifest>
<uses-feature android:glEsVersion="0x00030001" />
...
</manifest>
欲知更多OpenGL ES的信息,包括设备对OpenGL支持的版本,请看OpenGL ES指南。
Android
扩展包
除了OpenGL ES 3.1,这个版本还提供了拥有java接口和native支持的扩展包以提供高级图形功能。这个扩展包作为一个独立的包发布
扩展包支持:
这块儿不懂
Guaranteed fragment shader support for shader storage buffers, images, and atomics (Fragment shader support is optional in OpenGL ES 3.1.) Tessellation and geometry shaders ASTC (LDR) texture compression format Per-sample interpolation and shading Different
blend modes for each color attachment in a frame buffer
The Java interface for the extension pack is provided with GLES31Ext. In your app manifest, you can declare that your app must be installed only on devices that support the extension pack. For example:
<manifest>
<uses-feature android:name=“android.hardware.opengles.aep”
android:required="true" />
...
</manifest>
媒体
高级相机功能的相机API
Android 5.0引入了新的android.hardware.camera2 API以帮助fine-grain照片捕捉和图像处理,你可以编程的方式通过调用getCameraIdList() 获取系统的可用相机设备列表并通过。你可以通过 openCamera() 方法指定其中一个相机设备。要捕捉图像,创建一个CameraCaptureSession并将捕获到的图像绘制到一个Surface对象上。
CameraCaptureSession可设置为单拍或者一次性连拍多张(take single shots or multiple images in a burst)。
需要继承CameraCaptureSession.CaptureCallback类并设置到图像捕获请求里以获得图像捕获完成事件。当系统完成图像捕获的时候,CameraCaptureSession.CaptureCallback将接到一个onCaptureCompleted()回调,返回给你一个包含图像元数据的 CaptureResult。
CameraCharacteristics类可以让你的app检查此设备的相机支持哪些特性。此对象的INFO_SUPPORTED_HARDWARE_LEVEL属性表示相机功能级别。
要查看如何使用最新的camera2 API,请查看SDK示例中的Camera2Basic
和 Camera2Video
音频回放
此版本包含AudioTrack的以下变化:
-
你的app现在可以用浮点格式(ENCODING_PCM_FLOAT)提供音频数据。可以获得更大的动态范围,more
consistent precision和greater headroom。浮点运算在中间值计算(intermediate calculation)的时候尤其有用。Playback endpoints use integer format for audio data, and with lower bit depth. (In Android 5.0, portions of the internal pipeline
are not yet floating point.)
-
你现在可以ByteBuffer方式提供音频数据,就像提供给MediaCodec的数据一样。
-
WRITE_NON_BLOCKING模式可以帮助某些app简化缓冲和多线程工作(simplify
buffering and multithreading)。
媒体播放控制
使用新的通知和媒体API以确保系统UI知道你的媒体播放情况并提取和显示专辑信息。使用新的MediaSession 和MediaController类可使得通过UI和service控制播放变得更加简单。
新的MediaSession类取代了已弃用的RemoteControlClient,它提供一套回调方法以处理各种播放行为(差不多这么翻译吧,无非是快进快退暂停以及其他控制等等) (transport
controls and media buttons)。如果你的app提供媒体播放功能并且运行在Android TV或者Wear平台上,也可以通过MediaSession类使用相同的回调方法处理播放行为(transport controls)。
现在你可以使用MediaController类创建自己的媒体控制器app。这个类提供了一个线程安全的方式以在你的UI线程上监控和控制媒体的播放行为。创建控制器的时候,指定一个MediaSession.Token对象以便与给定的MediaSession交互。
通过使用MediaController.TransportControls方法,你可以传达诸如 play(), stop(), skipToNext(),
和 setRating()命令以控制MediaSession上的媒体播放。你也可以注册一个MediaController.Callback回调对象以监听session上的元数据和状态变化(metadata
and state changes)。
此外,你还可以通过最新的Notification.MediaStyle类创建rich notification以控制mediasession播放。
媒体浏览
Android 5.0引入了新的android.media.browse API,你的app可以使用此api浏览其他app的媒体库。继承MediaBrowserService类以对外暴露你的app的媒体内容。你继承的MediaBrowserService应该提供MediaSession.Token的接入口以便其他应用可以通过它播放你提供的媒体内容。
若要与媒体浏览服务交互,请使用MediaBrowser类。创建MediaBrowser实例时,请为MediaSession指定一个组件名。通过这个MediaBrowser实例,你的app可以连接到关联的service并获得一个暴露出来的MediaSession.Token对象。
存储
目录选择
Android 5.0扩展了存储框架(Storage Access Framework),用户可以借此将一个文件夹(包括其子文件和文件夹)的读写权限赋予一个app。
要选择一个文件夹,请发出一条OPEN_DOCUMENT_TREE intent 即可。系统会列出所有支持文件夹选择的DocumentsProvider来让用户浏览并选择一个文件夹,返回值是选中的文件夹的URI。然后你就可以使用buildChildDocumentsUriUsingTree() 、 buildDocumentUriUsingTree() 和 query() 浏览此文件夹的子目录了。
新的 createDocument() 方法使得你可以在上面选择的文件夹及其子文件夹下面创建新文档或者文件夹。要操作已经存在的文件,请使用 renameDocument() 和 deleteDocument().
调用这此方法之前先检查 COLUMN_FLAGS 以确定provider对这些方法是否。分别是:FLAG_SUPPORTS_WRITE,FLAG_SUPPORTS_DELETE,FLAG_SUPPORTS_THUMBNAIL,FLAG_DIR_PREFERS_GRID,FLAG_DIR_PREFERS_LAST_MODIFIED)。
如果你实现了一个DocumentsProvider并且想要支持子目录选择,请实现isChildDocument()方法并将FLAG_SUPPORTS_IS_CHILD放到COLUMN_FLAGS里。
Android 5.0同时也引入了新的共享存储区上的package-specific目录,你可以在为里存储媒体文件,这些媒体文件可以被包含进MediaStore里,新的 getExternalMediaDirs()方法返回你的app在所有共享存储设备上的媒体存储目录。像getExternalFilesDir()一样不需要特殊权限。系统会定时扫描这些文件夹中的媒体内容,当然你也可以使用MediaScannerConnection自行扫描新内容。(大哥们不要把缓存的图片放这儿啊,好想把那些将缓存图片直接放到sd卡某个目录下的人拉出来打一顿)
无线连接
多网络连接(Multiple
network connections)