Android 8.1 更新内容(开发必读)

2020-05-21  本文已影响0人  icechao

Android 8.1 功能和 API

Android 8.1(API 级别 27)为用户和开发者引入了各种新功能。本文重点介绍面向开发者的新功能。

Android Oreo(Go 版本)

Android Go 是一项旨在为全球数十亿网络用户优化 Android 体验的计划。从 Android 8.1 开始,我们就在将 Android 打造成入门级设备的理想平台。Android Oreo(Go 版本)配置中的功能包括:

我们更新了“为数十亿用户打造产品”指南,加入了有关如何针对搭载 Android Oreo(Go 版本)的设备优化应用的指导。对于大多数开发者来说,优化现有的 APK,或使用 Google Play 的多 APK 功能将某个 APK 版本定位到低内存设备,是针对搭载 Android Oreo(Go 版本)的设备做好准备的最佳方式。请注意,无论您的受众使用何种设备,将应用打造得更加纤巧高效都对他们有益。

Neural Networks API

Neural Networks API 为设备上的机器学习框架提供加速计算和推断功能,这些机器学习框架包括 TensorFlow Lite(Google 面向移动设备推出的跨平台机器学习内容库)以及 Caffe2,等等。要获取下载内容和文档,请访问 TensorFlow Lite 开源代码库。TensorFlow Lite 可与 Neural Networks API 配合使用,在您的移动设备上高效地运行 MobileNetsInception v3智能回复等模型。

自动填充框架更新

Android 8.1(API 级别 27)对自动填充框架进行了多项改进,您可以将这些改进整合到您的应用中。

[BaseAdapter](https://developer.android.com/reference/android/widget/BaseAdapter.html) 类现在包括 [setAutofillOptions()](https://developer.android.com/reference/android/widget/BaseAdapter.html#setAutofillOptions(java.lang.CharSequence...)) 方法,通过该方法,您可以在适配器中提供字符串形式的值。这对于在其适配器中动态生成值的旋转图标控件非常有用。例如,您可以使用 setAutofillOptions() 方法提供字符串形式的年份列表,供用户选择信用卡失效日期时使用。自动填充服务能够使用字符串表示法恰当填充需要数据的视图。

此外,[AutofillManager](https://developer.android.com/reference/android/view/autofill/AutofillManager.html) 类还包括 [notifyViewVisibilityChanged(View, int, boolean)](https://developer.android.com/reference/android/view/autofill/AutofillManager.html#notifyViewVisibilityChanged(android.view.View,%20%20%20%20int,%20boolean)) 方法,当采用虚拟结构的视图的可见性发生改变时,您可以调用该方法来通知框架。对于非虚拟结构,也需要对该方法进行重载。不过,对于非虚拟结构,由于 [View](https://developer.android.com/reference/android/view/View.html) 类已调用该方法,因此通常无需明确通知框架。

Android 8.1 还可以在 [SaveInfo](https://developer.android.com/reference/android/service/autofill/SaveInfo.html) 内添加对 [CustomDescription and](https://developer.android.com/reference/android/service/autofill/CustomDescription.html) [Validator](https://developer.android.com/reference/android/service/autofill/Validator.html) 的支持,从而使自动填充服务能够更自如地自定义保存界面的可用性。

自定义说明可帮助自动填充服务说明正在保存的内容。例如,当界面包含信用卡时,它可以显示信用卡发卡行的徽标、信用卡号码的最后四位数以及信用卡的失效日期。要了解详情,请参阅 [CustomDescription](https://developer.android.com/reference/android/service/autofill/CustomDescription.html) 类。

[Validator](https://developer.android.com/reference/android/service/autofill/Validator.html) 对象用于避免在不符合验证程序条件时显示自动填充保存界面。要了解详情,请参阅 Validator 类及其子类 LuhnChecksumValidatorRegexValidator

通知

Android 8.1 针对通知做了以下更改:

EditText 更新

从 API 级别 27 开始,[EditText.getText()](https://developer.android.com/reference/android/widget/EditText#getText()) 方法会返回 [Editable](https://developer.android.com/reference/android/text/Editable);以前,它会返回 [CharSequence](https://developer.android.com/reference/java/lang/CharSequence)。此项更改可向后兼容,因为 [Editable](https://developer.android.com/reference/android/text/Editable) 会实现 [CharSequence](https://developer.android.com/reference/java/lang/CharSequence)

[Editable](https://developer.android.com/reference/android/text/Editable) 接口提供重要的附加功能。例如,由于 [Editable](https://developer.android.com/reference/android/text/Editable) 还会实现 [Spannable](https://developer.android.com/reference/android/text/Spannable) 接口,因此您可以对 [EditText](https://developer.android.com/reference/android/widget/EditText) 实例中的内容应用标记。

程序化安全浏览操作

通过使用 Safe Browsing API 的 WebView 实现,您的应用可以在 [WebView](https://developer.android.com/reference/android/webkit/WebView) 实例尝试转到 Google 已归类为已知威胁的网址时检测到该行为。WebView 默认会显示一个插页,以警告用户存在已知威胁。通过该界面,用户可以选择仍然加载网址或返回到上一个安全的页面。

在 Android 8.1 中,您可以通过编程的方式定义应用如何响应已知的威胁:

注意:为了防范已知的威胁,最好等到安全浏览功能完成初始化之后再调用 [WebView](https://developer.android.com/reference/android/webkit/WebView) 对象的 [loadUrl()](https://developer.android.com/reference/android/webkit/WebView#loadUrl(java.lang.String)) 方法。

以下代码段演示了如何指示应用的 [WebView](https://developer.android.com/reference/android/webkit/WebView) 实例在遇到已知威胁后始终返回安全页面:

AndroidManifest.xml

<manifest>
        <application>
            ...
            <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                       android:value="true" />
        </application>
    </manifest>

MyWebActivity.java

private WebView superSafeWebView;
   private boolean safeBrowsingIsInitialized;

   // ...

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       superSafeWebView = new WebView(this);
       superSafeWebView.setWebViewClient(new MyWebViewClient());
       safeBrowsingIsInitialized = false;

       superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() {
           @Override
           public void onReceiveValue(Boolean success) {
               safeBrowsingIsInitialized = true;
               if (!success) {
                   Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!");
               }
           }
       });
   }
   

MyWebViewClient.java

public class MyWebViewClient extends WebViewClient {
       // Automatically go "back to safety" when attempting to load a website that
       // Safe Browsing has identified as a known threat. An instance of WebView
       // calls this method only after Safe Browsing is initialized, so there's no
       // conditional logic needed here.
       @Override
       public void onSafeBrowsingHit(WebView view, WebResourceRequest request,
               int threatType, SafeBrowsingResponse callback) {
           // The "true" argument indicates that your app reports incidents like
           // this one to Safe Browsing.
           callback.backToSafety(true);
           Toast.makeText(view.getContext(), "Unsafe web page blocked.",
                   Toast.LENGTH_LONG).show();
       }
   }

视频缩略图提取器

[MediaMetadataRetriever](https://developer.android.com/reference/android/media/MediaMetadataRetriever) 类拥有一个新方法 getScaledFrameAtTime(),它能够在给定时间值附近找到一个帧,并返回一个与源帧具有相同宽高比的位图,但会对该位图进行缩放,使其能够嵌入具有特定宽高度的矩形。这对于从视频生成缩略图非常有用。

我们建议使用此方法而不是 [getFrameAtTime()](https://developer.android.com/reference/android/media/MediaMetadataRetriever#getFrameAtTime()),因为后者会返回与源视频具有相同分辨率的位图,导致内存被浪费。例如,4K 视频的一帧是 16MB 的位图,远远大于您所需的缩略图大小。

Shared memory API

Android 8.1(API 级别 27)引入了新的 SharedMemory API。通过该类,您可以创建、映射和管理匿名 SharedMemory 实例。您在 SharedMemory 对象上针对读取和/或写入设置内存保护,由于 SharedMemory 对象是可打包的,因此您可以通过 AIDL 轻松将其传递给其他进程。

SharedMemory API 可以与 NDK 中的 ASharedMemory 工具进行互操作。ASharedMemory 提供对文件描述符的访问权限,然后即可映射文件描述符,以进行读取和写入。这是在多个应用之间或者一个应用的多个进程之间共享大量数据的理想方式。

WallpaperColors API

Android 8.1(API 级别 27)支持动态壁纸向系统界面提供颜色信息。为此,您可以从位图、可绘制对象或使用三种手动选择的颜色创建 [WallpaperColors](https://developer.android.com/reference/android/app/WallpaperColors.html) 对象。您还可以检索该颜色信息。

要创建 [WallpaperColors](https://developer.android.com/reference/android/app/WallpaperColors.html) 对象,请执行以下任一操作:

要从壁纸中检索主要颜色、次要颜色和三级颜色详细信息,请调用以下方法:

要在动态壁纸的任何突出颜色发生变化时通知系统,请调用 [notifyColorsChanged()](https://developer.android.com/reference/android/service/wallpaper/WallpaperService.Engine.html#notifyColorsChanged()) 方法。此方法会触发 [onComputeColors()](https://developer.android.com/reference/android/service/wallpaper/WallpaperService.Engine.html#onComputeColors()) 生命周期事件,您可以通过该事件提供新的 [WallpaperColors](https://developer.android.com/reference/android/app/WallpaperColors.html) 对象。

要添加监听颜色变化的监听器,您可以调用 [addOnColorsChangedListener()](https://developer.android.com/reference/android/app/WallpaperManager.html#addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener,%20%20%20%20android.os.Handler)) 方法。此外,您还可以调用 [getWallpaperColors()](https://developer.android.com/reference/android/app/WallpaperManager.html#getWallpaperColors(int)) 方法来检索壁纸的主要颜色。

指纹更新

[FingerprintManager](https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager) 类引入了以下错误代码:

加密更新

Android 8.1 在加密方面进行了多次更改。

上一篇 下一篇

猜你喜欢

热点阅读