Funkcje i interfejsy API Androida 8.1

Android 8.1 (poziom API 27) wprowadza różne nowe funkcje i możliwości dla użytkowników oraz deweloperów. W tym dokumencie opisujemy nowości dla deweloperów.

Android Oreo (wersja Go)

Android Go to nasza inicjatywa, która ma na celu optymalizację wygody korzystania z Androida miliardy ludzi na całym świecie korzystają z internetu. Począwszy od Androida 8.1, zmieniamy Androida w świetną platformę dla podstawowych urządzeń. Funkcje Androida Oreo Konfiguracja (wersja Go) obejmuje:

  • Optymalizacje pamięci. Zwiększyliśmy wykorzystanie pamięci na całej platformie, aby zapewnić że aplikacje mogą działać sprawnie na urządzeniach z maksymalnie 1 GB pamięci RAM.
  • Elastyczne opcje kierowania. Nowość funkcja sprzętowa , które pozwalają kierować aplikacje na normalne lub mało pamięci RAM Google Play.
  • Google Play. Wszystkie aplikacje będą dostępne na urządzeniach z Androidem Oreo. (wersja Go), Google Play będzie wyświetlać widoczność aplikacji zoptymalizowanych przez deweloperów. i dostarczają miliardom ludzi doskonałych wrażeń wytycznych.

Zaktualizowaliśmy budynek dla miliardów użytkowników z dodatkowymi wskazówkami, zoptymalizować aplikację pod kątem urządzeń działających na urządzeniach Android Oreo (wersja Go). Większość deweloperów woli optymalizować istniejące pliki APK lub korzystać z funkcji Google Play dotyczącej wielu plików APK, aby kierować wersję pliku APK na urządzenia z małą ilością pamięci RAM. Jest to najlepszy sposób na przygotowanie aplikacji na urządzenia z Androidem Oreo (wersja Go). Pamiętaj, że przygotowanie aplikacja lżejsze i wydajniejsze, są korzystne dla wszystkich odbiorców, niezależnie od urządzenia.

Neural Networks API

Interfejs Neural Networks API zapewnia szybsze obliczenia i wnioskowanie w przypadku maszyn na urządzeniu platformy edukacyjne, takie jak TensorFlow Lite – wieloplatformowa biblioteka ML Google do aplikacji mobilnych: Caffe2 i inne. Odwiedź TensorFlow Lite oprogramowanie open source w repozytorium z pobranymi plikami i dokumentami. TensorFlow Lite współpracuje z interfejsem Neural Networks API, aby uruchamiać modele takie jak MobileNets, Inception v3, i Inteligentna odpowiedź na urządzeniu mobilnym.

Aktualizacje platformy autouzupełniania

Android 8.1 (poziom interfejsu API 27) oferuje kilka ulepszeń autouzupełniania Struktura, którą możesz zastosować w swoich aplikacjach.

Klasa BaseAdapter zawiera teraz metodę setAutofillOptions(), która umożliwia podawanie ciągów znaków z wartościami w adapterze. Jest to przydatne w przypadku elementu spinner które dynamicznie generują wartości w swoich adapterach. Przykład: możesz użyć metody setAutofillOptions(), aby podać ciąg znaków reprezentująca listę lat, którą użytkownicy mogą wybrać w ramach datę ważności karty kredytowej. Usługi autouzupełniania mogą używać reprezentacji ciągu znaków do prawidłowego wypełniania widoków, które wymagają tych danych.

Dodatkowo AutofillManager klasa zawiera metodę notifyViewVisibilityChanged(View, int, boolean). który można wywołać, aby powiadomić organizację o zmianach w widoczności w wirtualnej strukturze. Przeciążenie tej metody wymaga też za pomocą wirtualnych struktur. Jednak w przypadku struktur niewirtualnych nie musisz wyraźnie informować frameworku, ponieważ metoda jest już wywoływana przez klasę View.

Android 8.1 daje też usługom autouzupełniania więcej możliwości dostosowywania interfejsu zapisywania, ponieważ umożliwia dodanie obsługi CustomDescription and Validator w ramach SaveInfo.

Opisy niestandardowe pomagają usłudze autouzupełniania wyjaśnić, co jest zapisywane. Jeśli na przykład ekran zawiera kartę kredytową, może wyświetlać logo banku, 4 ostatnie cyfry numeru karty i datę jej ważności. Więcej informacji znajdziesz na zajęciach CustomDescription.

Validator są używane, aby uniknąć wyświetlania UI zapisywania autouzupełniania, gdy Walidator nie jest spełniony. Więcej informacji znajdziesz w klasie Validator oraz jej podklasach LuhnChecksumValidatorRegexValidator.

Powiadomienia

Android 8.1 wprowadza następujące zmiany w powiadomieniach:

  • Aplikacje mogą teraz odtwarzać dźwięk powiadomienia tylko raz na sekundę. Dźwięki alertów, które przekraczają tę wartość, nie są umieszczane w kole i są tracone. Ta zmiana nie ma wpływu na inne aspekty powiadomień zachowanie i powiadomienia będą nadal publikowane zgodnie z oczekiwaniami.
  • NotificationListenerService i Urządzenia ConditionProviderService nie są obsługiwane w przypadku małej ilości pamięci RAM Urządzenia z Androidem, które zwracają wartość true, gdy: Funkcja ActivityManager.isLowRamDevice() jest wywoływana.

Aktualizacja EditText

Począwszy od poziomu interfejsu API 27 metoda EditText.getText() zwraca Editable; wcześniej zwracała CharSequence. Ta zmiana jest zgodna wstecznie, zgodnie z implementacją Editable CharSequence

Interfejs Editable zapewnia cenne dodatkowe funkcje. Ponieważ Editable implementuje też interfejs Spannable, możesz zastosować znaczniki do treści w instancji EditText.

Automatyczne działania Bezpiecznego przeglądania

Dzięki użyciu WebView implementacji interfejsu Safe Browsing API aplikacja może wykryć, kiedy instancja WebView próbuje przejść do adresu URL, który Google zaklasyfikował jako znane zagrożenie. Domyślnie aplikacja WebView wyświetla reklamę pełnoekranową, która ostrzega użytkowników o znanym zagrożeniu. Użytkownicy mogą na nim załadować URL mimo to lub wrócić do jest bezpieczna.

W Androidzie 8.1 możesz za pomocą programowania określić, jak Twoja aplikacja ma reagować na znane zagrożenie:

  • Możesz określić, czy aplikacja będzie zgłaszać znane zagrożenia bezpieczeństwa Przeglądanie.
  • Możesz skonfigurować aplikację tak, aby automatycznie wykonywała określone działanie (np. wracała do bezpiecznego stanu) za każdym razem, gdy napotka adres URL, który Bezpieczne przeglądanie zaklasyfikuje jako znane zagrożenie.

Uwaga: aby zapewnić optymalną ochronę przed znanymi zagrożeniami, przed wywołaniem metody loadUrl() obiektu WebView odczekaj, aż inicjalizacja Bezpiecznego przeglądania się zakończy.

Poniższe fragmenty kodu pokazują, jak możesz polecić instancjom WebView w aplikacji, aby zawsze wracały do bezpiecznego stanu po napotkaniu znanego zagrożenia:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:valu>e=&qu<ot;true">;< /
    /a>pplication
/manifest

MyWebActivity.java

Kotlin

private var superSafeWebView: WebView? = null
private var safeBrowsingIsInitialized: Boolean = false

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    superSafeWebView = WebView(this).apply {
        webViewClient = MyWebViewClient()
        safeBrowsingIsInitialized = false
        startSafeBrowsing(this@SafeBrowsingActivity, { success ->
            safeBrowsingIsInitialized = true
            if (!success) {
                Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!")
            }
        })
    }
}

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

Kotlin

class MyWebViewClient : 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 fun onSafeBrowsingHit(
            view: WebView,
            request: WebResourceRequest,
            threatType: Int,
            callback: SafeBrowsingResponse
    ) {
        // The "true" argument indicates that your app reports incidents like
        // this one to Safe Browsing.
        callback.backToSafety(true)
        Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show()
    }
}

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();
    }
}

Wyodrębniacz miniatur filmów

Klasa MediaMetadataRetriever ma nową metodę getScaledFrameAtTime(), która znajduje kadr w pobliżu danej pozycji czasowej i zwraca bitmapę o tym samym współczynniku proporcji co kadr źródłowy, ale przeskalowaną tak, aby zmieściła się w prostokącie o danej szerokości i wysokości. Jest to przydatne przy generowaniu miniatur z filmów.

Zalecamy użycie tej metody zamiast getFrameAtTime(), która może zużywać pamięć, ponieważ zwraca bitmapę o tej samej rozdzielczości co wideo źródłowe. Na przykład kadr z filmu 4K to bitmapa o rozmiarze 16 MB, czyli znacznie większym niż potrzebujesz na miniaturę.

Interfejs API pamięci współdzielonej

Android 8.1 (poziom interfejsu API 27) wprowadza nowy interfejs API SharedMemory. Ta klasa umożliwia tworzenie, mapowanie i zarządzanie anonimową instancją SharedMemory. Ty ustawiasz ochronę pamięci w SharedMemory obiektu do odczytu lub zapisu, a SharedMemory jest obiektem Parcelable, można go łatwo przekazać do innego procesu za pomocą AIDL.

Interfejs API SharedMemory współdziała z biblioteką ASharedMemory w NDK. ASharedMemory zapewnia dostęp do deskryptora pliku, który można następnie mapować na odczyt i zapis. To świetnie sposób na udostępnianie dużych ilości danych między aplikacjami lub między wieloma procesami w jednej aplikacji.

WallpaperColors API

Android 8.1 (poziom interfejsu API 27) umożliwia dostosowywanie kolorów animowanej tapety do interfejsu systemowego. Aby to zrobić, utwórz WallpaperColors z bitmapy, obiektu rysowalnego lub za pomocą trzech ręcznie wybranych kolorów. Możesz także pobrać informacje o tym kolorze.

Aby utworzyć: WallpaperColors wykonaj jedną z tych czynności:

  • Aby utworzyć obiekt WallpaperColors za pomocą 3 kolorów, utwórz instancję klasy WallpaperColors, przekazując kolor podstawowy, dodatkowy i trzeciorzędowy. Główny kolor nie może być pusty.
  • Aby utworzyć obiekt WallpaperColors z bitmapy, wywołaj metodę fromBitmap(), podając jako parametr źródło bitmapy.
  • Aby utworzyć obiekt WallpaperColors z elementu rysowanego, wywołaj metodę fromDrawable(), podając jako parametr źródło elementu rysowanego.

Aby pobrać szczegóły koloru podstawowego, dodatkowego lub dodatkowego z tapety, wywołaj te metody:

Aby powiadomić system o istotnych zmianach kolorów w żywym tapecie, wywołaj metodę notifyColorsChanged(). Ta metoda aktywuje cykl życia onComputeColors() wydarzenie, w ramach którego możesz podać nowe WallpaperColors obiektu.

Aby dodać odbiornik zmian kolorów, możesz wywołać metodę addOnColorsChangedListener(). Możesz też wywołać metodę getWallpaperColors(), aby pobrać kolory podstawowe tapety.

Aktualizacje odcisku palca

Klasa FingerprintManager wprowadziła te kody błędów:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT – użytkownik zbyt wiele razy próbował odblokować urządzenie za pomocą czytnika linii papilarnych.
  • FINGERPRINT_ERROR_VENDOR – wystąpił błąd czytnika odcisków palców specyficzny dla dostawcy.

Nowości związane z kryptografią

W Androidzie 8.1 wprowadzono szereg zmian związanych z szyfrowaniem:

  • W Conscrypt zostały zaimplementowane nowe algorytmy. Implementacja Conscrypt jest preferowana w stosunku do dotychczasowej implementacji Bouncy Castle. Nowe algorytmy:
    • AlgorithmParameters:GCM
    • KeyGenerator:AES
    • KeyGenerator:DESEDE
    • KeyGenerator:HMACMD5
    • KeyGenerator:HMACSHA1
    • KeyGenerator:HMACSHA224
    • KeyGenerator:HMACSHA256
    • KeyGenerator:HMACSHA384
    • KeyGenerator:HMACSHA512
    • SecretKeyFactory:DESEDE
    • Signature:NONEWITHECDSA
  • Cipher.getParameters().getParameterSpec(IvParameterSpec.class) nie działa w algorytmach korzystających z GCM. Zamiast tego użyj elementu getParameterSpec(GCMParameterSpec.class).
  • Wiele wewnętrznych klas Conscrypt powiązanych z TLS zostało refaktoryzowanych. Ponieważ deweloperzy czasami korzystają z tych funkcji bez zastanowienia, pozostawiliśmy je w miejscu, aby umożliwić obsługę poprzedniego użycia, ale niektóre szczegóły uległy zmianie. Na przykład gniazda były wcześniej typu OpenSSLSocketImpl, ale teraz są typu ConscryptFileDescriptorSocket lub ConscryptEngineSocket, które rozszerzają typ OpenSSLSocketImpl.
  • SSLSession metod używanych do rzucania Po przekazaniu pustego odwołania IllegalArgumentException staje się ono rzut NullPointerException.
  • RSA KeyFactory nie umożliwia już generowania kluczy z tablic bajtów, które są większe niż zakodowany klucz. Wywołania do generatePrivate() i generatePublic(), które podają KeySpec, gdzie struktura klucza nie wypełnia całego bufora, spowodują błąd InvalidKeySpecException.
  • Gdy odczyt gniazda został przerwany przez zamknięcie gniazda, Conscrypt zwracał -1. Funkcja odczytu teraz powoduje błąd SocketException.
  • Zmieniono zestaw głównych certyfikatów urzędów certyfikacji, usuwając głównie dużą liczbę przestarzałych certyfikatów, ale także certyfikaty główne WoSign i StartCom. Więcej informacji o tej decyzji znajdziesz w poście na blogu Google o bezpieczeństwie Ostateczne wycofanie zaufania do certyfikatów WoSign i StartCom.