2021-02-19

谷歌公布安卓12开发者预览版,麦科技详解新行为特性

作者:好中文的样子 所属分类 - 前端美工 - 干货 - 科技资讯

谷歌于北京时间2021年2月19日公布了安卓12首个开发者预览版,带来了隐私、界面相关的众多新行为特性变更,如果要查询安卓12的所有具体获取方法、变更以及源代码,可以访问谷歌中国安卓开发者网站。安卓12主要是引入了众多隐私相关的API,并且更新了界面相关的内容,现在立即让我们抢先浏览所有关于安卓12的行为变更吧!

安卓 Android12

内容接收统一API

内容接收统一API类似Windows的WM_DROPFILES,也就是拖拽文件到应用上响应内容。而安卓12提供了OnReceiveContentListener这个API,具体使用代码如下:

// (1) 声明监听器类
 public class MyReceiver implements OnReceiveContentListener {
     public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};

     @Override
     public ContentInfo onReceiveContent(View view, ContentInfo payload) {
         Pair<ContentInfo, ContentInfo> split =
                 ContentInfoCompat.partition(payload, item -> item.getUri() != null);
         ContentInfo uriContent = split.first;
         ContentInfo remaining = split.second;
         if (uriContent != null) {
             ClipData clip = uriContent.getClip();
             for (int i = 0; i < clip.getItemCount(); i++) {
                 Uri uri = clip.getItemAt(i).getUri();
                 // ... app-specific logic to handle the URI ...
             }
         }
         return remaining;
     }
 }

 // (2) 注册监听事件
 public class MyActivity extends Activity {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         // ...

         EditText myInput = findViewById(R.id.my_input);
         myInput.setOnReceiveContentListener(MyReceiver.MIME_TYPES, new MyReceiver());
     }
安卓12 Android12 内容监听事件

注意,这个API并非安卓12(Android12)独享,以前的平台可使用Core 1.5.0-beta1 和 Appcompat 1.3.0-beta-01 库来使用这些API。

媒体转码兼容

安卓12以及以后平台可以将H.265、HDR10媒体格式自动转码为H.264,有的软件可能不支持HDR10、H.265一类的格式(这时候分享到这个软件的视频流就得转码了),可以创建如下的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
    <format android:name="HEVC" supported="false"/>
    <format android:name="HDR10" supported="false"/>
    <format android:name="HDR10Plus" supported="false"/>
</media-capabilities>

命名为media_capabilities.xml,然后在AndroidManifest.xml的application标签里面创建如下节点:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

如果我们支持H.265并且不想更改xml,就可以在代码内直接使用如下API(假设不支持HDR10、10+):

// 声明
ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder()
        .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
        .build();
// 接收到内容以后获取流。。。
Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities);
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
}

安卓12兼容AVIF格式的图片,而这个格式的文件是使用AV1来编码的,而我们的浏览器可以使用如下代码直接引入AVIF格式的图片:


<picture>
  <source type="image/avif" srcset="snow.avif">
  <img alt="Hut in the snow" src="snow.jpg">
</picture>

安卓12是直接支持此类图片格式的解码,AVIF是一种压缩率比WebP格式更高的图片格式,相信大家被QQ不支持WebP的恐惧支配过,安卓新版QQ是否会优先适配这种图片格式呢?(注意,浏览器分享AVIF图片格式的时候现在一般会先自动转换成png,例如笔者的Chrome就是这样,因此不必担心图片保存以后软件是否能读取)。

JPEG、WebP、AVIF体积对比

新的声音震动生成工具

据说有的人喜欢边玩游戏边体验游戏带来的震动?并且现在似乎很多安卓设备都使用了线性马达而不是传统的转子马达?

安卓12提供了HapticGenerator的东西,顾名思义就是触觉产生器?目前似乎预览版还没开发出来什么功能,暂且不多谈论这个东西,可能以后会有用。根据官方介绍,这个东西可能会提升来电响铃的用户体验,不同的震动(官方说是触觉,实际上说白了就是马达震动)可以辨识不同的人,例如你的情人和朋友有不同的震动体验,是不是很刺激?

WLAN感知(Wi-Fi感知)增强

Wi-Fi Aware即Wi-Fi感知在安卓12得到了功能增强,根据官方介绍,安卓12可以在已发现的服务断开的时候提供一个监听器,断开的时候回调。多数据路径(NAN Data Paths),也就是P2C功能,在安卓12得到了增强。P2P当中peer向服务器发送任何数据都可以在安卓12接收,也就是增强了多点对单点相关的功能。

其它变更

安卓12带来了类似设备属性验证等新功能,设备属性一般是从Build里面的BRANDDEVICEMANUFACTURERMODEL以及PRODUCT当中采集信息直接生成的。安卓12也带来了企业模式,支持安全增强的工作概览等。

适配安卓12目前看来也很简单,只要是适配安卓S的应用,修改所有接收器、提供者、服务以及对外启动的活动的android:exported属性,这个属性必须显式声明,否则安装报下面的错误:

Installation did not succeed.
The application could not be installed: INSTALL_FAILED_VERIFICATION_FAILURE
List of apks:
[0] '.../build/outputs/apk/debug/app-debug.apk'
Installation failed due to: 'null'

PendingIntent在适配安卓12以后必须声明FLAG_MUTABLE,否则崩溃。

PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
        REQUEST_CODE, intent,
        /* flags */ PendingIntent.FLAG_IMMUTABLE);

安卓12也更改了通知的样式部分,具体参见安卓开发者网站。

安卓12通知样式示例

安卓12的第一个预览版带来的变更大致就是这些,相信Beta版本会带来更多的变更内容,期待5月左右发布的Beta版本吧!

麦科技原创 转载请声明出处