Tổng quan về các tính năng và API

Android 11 mang đến cho nhà phát triển các tính năng và API mới tuyệt vời. Các phần dưới đây giúp bạn tìm hiểu các tính năng cho ứng dụng cũng như làm quen với các API liên quan.

Để biết danh sách chi tiết về các API mới, đã được sửa đổi, cũng như đã bị xoá, hãy đọc báo cáo điểm khác biệt về API. Để biết thông tin chi tiết về các API mới, vui lòng truy cập tài liệu tham khảo về API cho Android (các API mới được trình bày nổi bật). Ngoài ra, để tìm hiểu những thay đổi của nền tảng có thể ảnh hưởng đến ứng dụng của bạn, hãy nhớ tham khảo các thay đổi về hành vi của Android 11 đối với ứng dụng nhắm đến Android Rtất cả ứng dụng, cũng như các thay đổi về quyền riêng tư.

Trải nghiệm mới

Điều khiển thiết bị

Android 11 có một API ControlsProviderService mới mà bạn có thể dùng để hiện các chế độ điều khiển cho các thiết bị bên ngoài đã kết nối. Các chế độ điều khiển này xuất hiện trong mục Device controls (Điều khiển thiết bị) trên trình đơn nguồn của Android. Để biết thêm thông tin, hãy xem phần Điều khiển các thiết bị bên ngoài.

Điều khiển nội dung nghe nhìn

Android 11 cập nhật cách hiển thị các nút điều khiển nội dung nghe nhìn. Các nút điều khiển nội dung nghe nhìn sẽ xuất hiện gần phần cài đặt nhanh. Các phiên phát trên nhiều ứng dụng được sắp xếp trong một băng chuyền có thể vuốt, bao gồm các luồng phát trên điện thoại, các luồng từ xa (chẳng hạn như các phiên phát được phát hiện trên thiết bị bên ngoài hoặc phiên truyền) và các phiên trước đó, có thể tiếp tục theo thứ tự phát gần đây nhất.

Người dùng có thể bắt đầu lại các phiên trước đó từ băng chuyền mà không cần phải khởi động ứng dụng. Khi quá trình phát bắt đầu, người dùng sẽ tương tác với các chế độ điều khiển nội dung nghe nhìn theo cách thông thường.

Để biết thêm thông tin, hãy xem phần các chế độ điều khiển nội dung nghe nhìn.

Màn hình

Hỗ trợ tốt hơn cho màn hình thác nước

Android 11 cung cấp một số API để hỗ trợ màn hình thác nước, cho thấy những màn hình bao quanh cạnh thiết bị. Những màn hình này được coi là một biến thể của màn hình có vết cắt trên màn hình. Các phương thức DisplayCutout.getSafeInset…() hiện có sẽ trả về phần lồng ghép an toàn để tránh các khu vực thác nước cũng như vết cắt. Để hiển thị nội dung ứng dụng trong vùng thác nước, hãy làm như sau:

  • Gọi DisplayCutout.getWaterfallInsets() để nhận kích thước chính xác của phần lồng ghép thác nước.

  • Đặt thuộc tính bố cục cửa sổ layoutInDisplayCutoutMode thành LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS để cho phép cửa sổ mở rộng vào các khu vực cắt và thác nước trên tất cả các cạnh của màn hình. Bạn phải đảm bảo không có nội dung thiết yếu nào nằm trong vùng cắt hoặc thác nước.

Cảm biến góc bản lề và thiết bị có thể gập lại

Android 11 giúp các ứng dụng chạy trên các thiết bị có cấu hình màn hình dựa trên bản lề có thể xác định góc của bản lề bằng cách cung cấp một cảm biến mới với TYPE_HINGE_ANGLE và một SensorEvent mới có thể theo dõi góc bản lề và cung cấp phép đo theo độ giữa hai phần tích hợp của thiết bị. Bạn có thể sử dụng các phép đo thô này để thực hiện các ảnh động chi tiết khi người dùng điều khiển thiết bị.

Xem mục Thiết bị có thể gập lại.

Cuộc trò chuyện

Cải thiện tính năng trò chuyện

Android 11 cải tiến một số điểm trong cách xử lý cuộc trò chuyện. Các cuộc trò chuyện là các hoạt động giao tiếp hai chiều theo thời gian thực giữa hai hoặc nhiều người. Những cuộc trò chuyện này được làm nổi bật đặc biệt và người dùng có nhiều lựa chọn mới về cách tương tác với các cuộc trò chuyện đó.

Để biết thêm thông tin về cuộc trò chuyện cũng như cách ứng dụng của bạn có thể hỗ trợ các cuộc trò chuyện đó, hãy xem phần Mọi người và cuộc trò chuyện.

Bong bóng trò chuyện

Bong bóng trò chuyện (Bubbles) hiện được cung cấp cho nhà phát triển để giúp hiển thị các cuộc trò chuyện trên hệ thống. Bong bóng trò chuyện là một tính năng thử nghiệm trong Android 10, được bật thông qua tuỳ chọn dành cho nhà phát triển. Trong Android 11, tính năng này không còn cần thiết nữa.

Nếu một ứng dụng nhắm đến Android 11 (API cấp 30) trở lên, thì thông báo của ứng dụng đó sẽ không xuất hiện dưới dạng bong bóng trò chuyện, trừ phi ứng dụng đó đáp ứng các yêu cầu mới về cuộc trò chuyện. Cụ thể, thông báo phải được liên kết với một lối tắt.

Trước Android 11, nếu muốn thông báo được tạo bong bóng trò chuyện, bạn cần chỉ định rõ ràng rằng thông báo được thiết lập để luôn chạy ở chế độ giao diện người dùng tài liệu. Kể từ Android 11, bạn không cần đặt chế độ cài đặt đó một cách rõ ràng nữa; nếu thông báo được tạo bong bóng trò chuyện, nền tảng sẽ tự động đặt thông báo để luôn chạy ở chế độ giao diện người dùng tài liệu.

Có một số điểm cải tiến đối với hiệu suất của bong bóng trò chuyện và người dùng có thể linh hoạt hơn trong việc bật và tắt bong bóng trò chuyện trên từng ứng dụng. Đối với các nhà phát triển đã triển khai tính năng hỗ trợ thử nghiệm, có một vài thay đổi đối với API trong Android 11:

Chỉ báo bằng hình ảnh về mạng 5G

Để biết thông tin về cách hiển thị chỉ báo 5G trên thiết bị của người dùng, hãy xem phần Thông báo cho người dùng khi họ đang sử dụng 5G.

Quyền riêng tư

Android 11 đưa ra một số lượng lớn các thay đổi và hạn chế để nâng cao quyền riêng tư của người dùng. Để tìm hiểu thêm, hãy xem trang Quyền riêng tư.

Bảo mật

Tin cập nhật về tính năng xác thực bằng sinh trắc học

Để giúp bạn kiểm soát mức độ bảo mật cho dữ liệu của ứng dụng, Android 11 cung cấp một số điểm cải tiến đối với tính năng xác thực bằng sinh trắc học. Những thay đổi này cũng xuất hiện trong thư viện Jetpack sinh trắc học.

Loại xác thực

Android 11 giới thiệu giao diện BiometricManager.Authenticators mà bạn có thể dùng để khai báo các loại xác thực mà ứng dụng của bạn hỗ trợ.

Xác định loại xác thực được sử dụng

Sau khi người dùng xác thực, bạn có thể kiểm tra xem người dùng được xác thực bằng thông tin đăng nhập thiết bị hay thông tin xác thực sinh trắc học bằng cách gọi getAuthenticationType().

Hỗ trợ bổ sung cho khoá xác thực cho mỗi lần sử dụng

Android 11 hỗ trợ thêm tính năng xác thực bằng khoá xác thực cho mỗi lần sử dụng.

Các phương thức ngừng hoạt động

Android 11 sẽ ngừng sử dụng các phương thức sau:

  • Phương thức setDeviceCredentialAllowed().
  • Phương thức setUserAuthenticationValidityDurationSeconds().
  • Phiên bản nạp chồng của canAuthenticate() không nhận đối số.

Chia sẻ an toàn các tập dữ liệu lớn

Trong một số trường hợp, chẳng hạn như những trường hợp liên quan đến công nghệ học máy hoặc phát nội dung nghe nhìn, ứng dụng của bạn có thể muốn sử dụng cùng một tập dữ liệu lớn như một ứng dụng khác. Trong các phiên bản Android trước, cả ứng dụng của bạn và một ứng dụng khác đều cần tải xuống một bản sao riêng của cùng một tập dữ liệu.

Để giúp giảm tình trạng dư thừa dữ liệu, cả qua mạng và trên ổ đĩa, Android 11 cho phép các tập dữ liệu lớn này được lưu vào bộ nhớ đệm trên thiết bị bằng cách sử dụng blob dữ liệu dùng chung. Để tìm hiểu thêm về cách chia sẻ tập dữ liệu, hãy xem hướng dẫn chi tiết về cách chia sẻ tập dữ liệu lớn.

Thực hiện mã hoá dựa trên tệp sau khi khởi động lại OTA mà không cần thông tin đăng nhập của người dùng

Sau khi thiết bị hoàn tất quá trình cập nhật qua mạng không dây và khởi động lại, các khoá đã mã hoá thông tin xác thực (CE) đặt trong bộ nhớ được bảo vệ bằng thông tin xác thực sẽ xuất hiện ngay lập tức cho các thao tác Mã hoá dựa trên tệp (FBE). Điều này có nghĩa là sau khi cập nhật qua mạng không dây, ứng dụng của bạn có thể tiếp tục các hoạt động yêu cầu khoá CE trước khi người dùng nhập mã PIN, hình mở khoá hoặc mật khẩu.

Hiệu suất và chất lượng

Gỡ lỗi qua Wi-Fi

Android 11 hỗ trợ tính năng triển khai và gỡ lỗi ứng dụng không dây từ máy trạm thông qua Cầu gỡ lỗi Android (adb). Ví dụ: bạn có thể triển khai ứng dụng có thể gỡ lỗi cho nhiều thiết bị từ xa mà không cần kết nối vật lý với thiết bị qua USB hay gặp phải các vấn đề phổ biến khi kết nối USB (chẳng hạn như lỗi cài đặt trình điều khiển). Hãy xem phần Chạy ứng dụng trên thiết bị phần cứng để biết thêm thông tin.

Cài đặt APK gia tăng ADB

Việc cài đặt các tệp APK có kích thước lớn (2 GB trở lên) trên thiết bị có thể mất nhiều thời gian, ngay cả khi chỉ có một thay đổi nhỏ đối với ứng dụng. Việc cài đặt tệp APK tăng dần (ADB (Cầu gỡ lỗi Android)) giúp tăng tốc quá trình này bằng cách cài đặt đủ tệp APK để chạy ứng dụng trong khi truyền trực tuyến dữ liệu còn lại ở chế độ nền. adb install sẽ tự động sử dụng tính năng này nếu được thiết bị hỗ trợ và bạn đã cài đặt Công cụ nền tảng SDK mới nhất. Nếu phương thức này không được hỗ trợ, thì phương thức cài đặt mặc định sẽ được tự động sử dụng.

Hãy dùng lệnh adb sau để dùng tính năng này. Nếu thiết bị không hỗ trợ cài đặt gia tăng, lệnh này sẽ không thành công và xuất nội dung giải thích chi tiết.

adb install --incremental

Trước khi chạy cài đặt APK gia tăng ADB, bạn phải ký APK và tạo tệp Lược đồ chữ ký APK v4. Tệp chữ ký v4 phải được đặt bên cạnh APK để tính năng này hoạt động.

Phát hiện lỗi bằng trình phân bổ bộ nhớ gốc

GWP-ASan là tính năng trình phân bổ bộ nhớ gốc giúp tìm các lỗi use-after-free và heap-buffer-overflow được. Bạn có thể bật tính năng này trên toàn cầu hoặc cho các quy trình con cụ thể của ứng dụng. Để tìm hiểu thêm, hãy xem hướng dẫn về GWP-Asan.

Neural Networks API 1.3

Android 11 mở rộng và cải thiện Neural Networks API (NNAPI).

Toán tử mới

NNAPI 1.3 giới thiệu một loại toán hạng mới là TENSOR_QUANT8_ASYMM_SIGNED, để hỗ trợ lược đồ lượng tử hoá mới của TensorFlow Lite.

Ngoài ra, NNAPI 1.3 còn giới thiệu các toán tử mới sau:

  • QUANTIZED_LSTM
  • IF
  • WHILE
  • ELU
  • HARD_SWISH
  • FILL
  • RANK

Các chế độ kiểm soát mới cho công nghệ học máy

NNAPI 1.3 giới thiệu các chế độ kiểm soát mới giúp công nghệ học máy hoạt động trơn tru:

API Nhiệt NDK

Khi trở nên quá nóng, thiết bị có thể điều tiết CPU và/hoặc GPU, gây ảnh hưởng không mong muốn đến ứng dụng. Các ứng dụng hoặc trò chơi tích hợp đồ hoạ phức tạp, tác vụ tính toán nặng hoặc hoạt động mạng được duy trì liên tục có nhiều khả năng gặp phải vấn đề hơn.

Sử dụng NDK Thermal API (API Nhiệt NDK) trong Android 11 để theo dõi sự thay đổi nhiệt độ trên thiết bị, sau đó hành động để duy trì mức sử dụng điện năng thấp hơn và nhiệt độ thiết bị mát hơn. API này tương tự như API Nhiệt Java; bạn có thể sử dụng API này để nhận thông báo về mọi thay đổi về trạng thái nhiệt hoặc để thăm dò trực tiếp trạng thái hiện tại.

Văn bản và phương thức nhập

Cải thiện hiệu ứng chuyển đổi IME

Android 11 giới thiệu các API mới để cải thiện hiệu ứng chuyển đổi cho trình chỉnh sửa phương thức nhập (IME), chẳng hạn như bàn phím ảo. Các API này giúp bạn dễ dàng điều chỉnh nội dung ứng dụng đồng bộ với giao diện và sự biến mất của IME cũng như với các phần tử khác như thanh trạng thái và thanh điều hướng.

Để hiển thị một IME khi một EditText bất kỳ có tâm điểm, hãy gọi view.getInsetsController().show(Type.ime()). (Bạn có thể gọi phương thức này trên bất kỳ khung hiển thị nào trong cùng hệ phân cấp với EditText được lấy làm tâm điểm, bạn không phải gọi phương thức này trên EditText cụ thể.) Để ẩn IME, hãy gọi view.getInsetsController().hide(Type.ime()). Bạn có thể kiểm tra xem một IME hiện có xuất hiện hay không bằng cách gọi view.getRootWindowInsets().isVisible(Type.ime()).

Để đồng bộ hoá các khung hiển thị của ứng dụng với sự xuất hiện và biến mất của IME, hãy đặt trình nghe trên một khung hiển thị bằng cách cung cấp WindowInsetsAnimation.Callback cho View.setWindowInsetsAnimationCallback(). (Bạn có thể đặt trình nghe này trên bất kỳ khung hiển thị nào, không nhất thiết phải là EditText.) IME gọi phương thức onPrepare() của trình nghe, sau đó gọi onStart() khi bắt đầu chuyển đổi. Sau đó, phương thức này sẽ gọi onProgress() tại mỗi tiến trình trong quá trình chuyển đổi. Khi quá trình chuyển đổi kết thúc, IME sẽ gọi onEnd(). Tại bất kỳ thời điểm nào trong quá trình chuyển đổi, bạn cũng có thể biết được tiến trình của quá trình chuyển đổi bằng cách gọi WindowInsetsAnimation.getFraction().

Để biết ví dụ về cách sử dụng các API này, hãy xem mã mẫu WindowInsetsAnimation mới.

Kiểm soát ảnh động IME

Bạn cũng có thể kiểm soát ảnh động IME hoặc ảnh động của một thanh hệ thống khác, chẳng hạn như thanh điều hướng. Để thực hiện việc này, trước tiên hãy gọi setOnApplyWindowInsetsListener() để thiết lập trình nghe mới cho các thay đổi đối với phần lồng ghép cửa sổ:

Kotlin

rootView.setOnApplyWindowInsetsListener { rootView, windowInsets ->
    val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime())
    rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, 
                          barsIme.bottom)

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
    WindowInsets.CONSUMED
}

Java

mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
   @Override
   public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {

       Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime());
       mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right,
                             barsIme.bottom);

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
       return WindowInsets.CONSUMED;
   }
});

Để di chuyển IME hoặc thanh hệ thống khác, hãy gọi phương thức controlWindowInsetsAnimation() của bộ điều khiển:

Kotlin

view.windowInsetsController.controlWindowInsetsAnimation(
       Type.ime(),
       1000,
       LinearInterpolator(),
       cancellationSignal,
       object : WindowInsetsAnimationControlListener() {
           fun onReady(controller: WindowInsetsAnimationController,
                         types: Int) {
               // update IME inset
             controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */)
           }
       }
);

Java

mRoot.getWindowInsetsController().controlWindowInsetsAnimation(
       Type.ime(), 1000, new LinearInterpolator(), cancellationSignal,
       new WindowInsetsAnimationControlListener() {
           @Override
           public void onReady(
                   @NonNull WindowInsetsAnimationController controller,
                   int types
                   ) {
                   // update IME inset
                   controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */);
           }

           @Override
           public void onCancelled() {}
       });

Cập nhật thư viện ICU

Android 11 cập nhật gói android.icu để sử dụng phiên bản 66 của thư viện ICU, so với phiên bản 63 trong Android 10. Phiên bản thư viện mới bao gồm dữ liệu ngôn ngữ CLDR được cập nhật và một số tính năng nâng cao để hỗ trợ quốc tế hoá trong Android.

Những thay đổi đáng chú ý trong các phiên bản thư viện mới bao gồm:

  • Nhiều API định dạng hiện hỗ trợ kiểu đối tượng trả về mới mở rộng FormattedValue.
  • API LocaleMatcher được nâng cao bằng lớp trình tạo, hỗ trợ loại java.util.Locale và lớp kết quả chứa dữ liệu bổ sung về kết quả trùng khớp.
  • Unicode 13 hiện đã được hỗ trợ.

Nội dung nghe nhìn

Phân bổ vùng đệm MediaCodec

Android 11 cung cấp một API MediaCodec mới giúp ứng dụng có nhiều quyền kiểm soát hơn khi phân bổ các vùng đệm đầu vào và đầu ra. Việc này cho phép ứng dụng quản lý bộ nhớ hiệu quả hơn.

Lớp mới:
Các phương thức mới:

Ngoài ra, hành vi của 2 phương thức trong MediaCodec.Callback() đã thay đổi:

onInputBufferAvailable()
Thay vì gọi MediaCodec.getInputBuffer()MediaCodec.queueInputBuffer() bằng chỉ mục, nếu được định cấu hình để sử dụng Block Model API, các ứng dụng nên dùng MediaCodec.getQueueRequest cùng với chỉ mục đó, đính kèm LinearBlock/HardwareBuffer vào khe cắm.
onOutputBufferAvailable()
Thay vì gọi MediaCodec.getOutputBuffer() bằng chỉ mục, ứng dụng có thể sử dụng MediaCodec.getOutputFrame() với chỉ mục đó để tải đối tượng OutputFrame có thêm thông tin và vùng đệm LinearBlock/HardwareBuffer.

Giải mã độ trễ thấp trong MediaCodec

Android 11 cải tiến MediaCodec để hỗ trợ giải mã độ trễ thấp cho các trò chơi và ứng dụng theo thời gian thực khác. Bạn có thể kiểm tra xem một bộ mã hoá và giải mã có hỗ trợ giải mã độ trễ thấp hay không bằng cách truyền FEATURE_LowLatency vào MediaCodecInfo.CodecCapabilities.isFeatureSupported().

Để bật hoặc tắt tính năng giải mã độ trễ thấp, hãy làm theo một trong những cách sau:

Hàm AAudio mới AAudioStream_release()

Hàm AAudioStream_close() phát hành và đóng luồng âm thanh cùng lúc. Điều này có thể nguy hiểm. Nếu một quy trình khác cố gắng truy cập vào luồng sau khi bị đóng, thì quy trình đó sẽ gặp sự cố.

Hàm mới AAudioStream_release() sẽ giải phóng luồng nhưng không đóng luồng. Việc này sẽ giải phóng tài nguyên và rời khỏi luồng ở trạng thái đã biết. Đối tượng này sẽ vẫn tồn tại cho đến khi bạn gọi AAudioStream_close().

API MediaParer

MediaParer là một API mới cấp thấp để trích xuất nội dung nghe nhìn. Bộ công cụ này linh hoạt hơn MediaExtractor và cung cấp thêm quyền kiểm soát đối với chức năng trích xuất nội dung nghe nhìn.

Ghi âm từ thiết bị USB

Khi một ứng dụng không có quyền RECORD_AUDIO dùng UsbManager để yêu cầu quyền truy cập trực tiếp vào thiết bị âm thanh USB có chức năng ghi âm (chẳng hạn như tai nghe USB), một thông báo cảnh báo mới sẽ xuất hiện yêu cầu người dùng xác nhận quyền sử dụng thiết bị. Hệ thống sẽ bỏ qua mọi tuỳ chọn "luôn sử dụng", do đó, người dùng phải xác nhận cảnh báo và cấp quyền mỗi khi ứng dụng yêu cầu quyền truy cập.

Để tránh hành vi này, ứng dụng nên yêu cầu quyền RECORD_AUDIO.

Quyền truy cập micrô đồng thời

Android 11 thêm các phương thức mới vào API AudioRecord, MediaRecorderAAudioStream. Các phương thức này cho phép và tắt khả năng thu thập đồng thời bất kể trường hợp sử dụng đã chọn. Hãy xem phần Chia sẻ đầu vào âm thanh.

Nút chuyển đầu ra

Android 11 triển khai hành vi mới cho các ứng dụng dùng API truyền và API mediarouter.

Ngoài việc truy cập vào các tuỳ chọn truyền từ trong một ứng dụng, các tuỳ chọn chuyển đổi cũng xuất hiện trong trình phát nội dung nghe nhìn của hệ thống. Điều này giúp người dùng có một hành trình liền mạch khi di chuyển giữa các thiết bị khi họ thay đổi bối cảnh xem và nghe, chẳng hạn như xem video trong nhà bếp so với trên điện thoại, hoặc nghe âm thanh trong nhà hoặc trên ô tô. Hãy xem nút chuyển đầu ra.

Khả năng kết nối

Các tính năng nâng cao của Wi-Fi Passpoint

Để biết thông tin về các chức năng của Passpoint được thêm vào Android 11, hãy xem bài viết Passpoint.

API đề xuất Wi-Fi đã được mở rộng

Android 11 mở rộng API đề xuất Wi-Fi để tăng khả năng quản lý mạng của ứng dụng, bao gồm:

  • Các ứng dụng quản lý kết nối có thể quản lý mạng của riêng mình bằng cách cho phép các yêu cầu ngắt kết nối.
  • Mạng Passpoint được tích hợp vào API Đề xuất và có thể được đề xuất cho người dùng.
  • Các API của Analytics cho phép bạn nhận thông tin về chất lượng của mạng của mình.

Thông tin cập nhật về CallScreeningService

Kể từ Android 11, CallScreeningService có thể yêu cầu thông tin về trạng thái xác minh STIR/SHAKEN (xác minh) cho các lệnh gọi đến. Thông tin này được cung cấp trong chi tiết cuộc gọi cho các cuộc gọi đến.

Nếu CallScreeningService có quyền READ_CONTACTS, thì ứng dụng sẽ nhận được thông báo khi có cuộc gọi đến hoặc cuộc gọi đi đến một số điện thoại trong danh bạ của người dùng.

Để biết thêm thông tin, hãy xem phần Ngăn chặn giả mạo tên nhận dạng người gọi.

Mở nội dung cập nhật API dành cho thiết bị di động

Để biết thông tin về tính năng hỗ trợ OMAPI trên Android 11 trở lên, hãy xem bài viết Mở tính năng hỗ trợ trình đọc API dành cho thiết bị di động.

VPN hiệu suất cao

Các ứng dụng nhắm đến API cấp 30 trở lên hoặc đang chạy trên các thiết bị khởi chạy trên API cấp 29 trở lên có thể áp dụng IKEv2/IP cho VPN (mạng riêng ảo) đối với cả VPN do người dùng định cấu hình và VPN dựa trên ứng dụng.

VPN chạy trên hệ điều hành gốc, giúp đơn giản hoá mã cần thiết để thiết lập các kết nối VPN IKEv2/IP trong ứng dụng.

Kiểm soát quyền truy cập mạng theo từng quy trình

Để biết thông tin về cách bật quyền truy cập mạng theo từng quy trình, hãy xem phần Quản lý mức sử dụng mạng.

Cho phép nhiều cấu hình Passpoint đã cài đặt có cùng FQDN

Kể từ Android 11, bạn có thể sử dụng PasspointConfiguration.getUniqueId() để lấy giá trị nhận dạng duy nhất cho đối tượng PasspointConfiguration. Điều này cho phép người dùng ứng dụng cài đặt nhiều hồ sơ với cùng một tên miền đủ điều kiện (FQDN).

Chức năng này rất hữu ích khi nhà mạng triển khai nhiều tổ hợp Mã quốc gia di động (MCC) và Mã mạng di động (MNC) trên mạng của họ, nhưng chỉ có một FQDN duy nhất. Trên Android 11 trở lên, bạn có thể cài đặt nhiều hồ sơ với cùng một FQDN sẽ khớp với mạng với nhà cung cấp Home khi người dùng cài đặt SIM có MCC hoặc MNC.

Hỗ trợ ăng-ten GNSS

Android 11 giới thiệu lớp GnssAntennaInfo, giúp ứng dụng của bạn có thể tận dụng thêm tính năng định vị có độ chính xác từng centimet mà Hệ thống vệ tinh điều hướng toàn cầu (GNSS) có thể cung cấp.

Tìm hiểu thêm trong hướng dẫn về thông tin về việc hiệu chỉnh anten.

Đồ hoạ

Bộ giải mã hình ảnh NDK

API ImageDecoder của NDK cung cấp API tiêu chuẩn cho các ứng dụng Android C/C++ để giải mã hình ảnh trực tiếp. Nhà phát triển ứng dụng không cần sử dụng API khung (thông qua JNI) hoặc gói các thư viện giải mã hình ảnh của bên thứ ba nữa. Để biết thêm thông tin, hãy xem Hướng dẫn cho nhà phát triển về bộ giải mã hình ảnh.

API tốc độ khung hình

Android 11 cung cấp một API cho phép các ứng dụng thông báo cho hệ thống về tốc độ khung hình dự kiến, để giảm độ giật trên các thiết bị hỗ trợ nhiều tốc độ làm mới. Để biết thông tin về cách sử dụng API này, hãy xem Hướng dẫn về tốc độ khung hình.

Yêu cầu và kiểm tra hỗ trợ độ trễ thấp

Một số màn hình có thể thực hiện xử lý hậu kỳ đồ hoạ, chẳng hạn như một số màn hình ngoài và TV. Quá trình xử lý hậu kỳ này cải thiện được đồ hoạ nhưng có thể làm tăng độ trễ. Các màn hình mới hơn hỗ trợ HDMI 2.1 sẽ có chế độ độ trễ thấp tự động (ALLM, còn gọi là chế độ trò chơi), giúp giảm thiểu độ trễ bằng cách tắt chế độ xử lý hậu kỳ này. Để biết thêm thông tin chi tiết về ALLM, hãy tham khảo thông số kỹ thuật của HDMI 2.1.

Một cửa sổ có thể yêu cầu sử dụng chế độ tự động độ trễ thấp (nếu có). ALLM đặc biệt hữu ích cho các ứng dụng như trò chơi và hội nghị truyền hình, trong đó độ trễ thấp quan trọng hơn việc có đồ hoạ tốt nhất có thể.

Để bật/tắt chế độ xử lý hậu kỳ tối thiểu, hãy gọi Window.setPreferMinimalPostProcessing() hoặc đặt thuộc tính preferMinimalPostProcessing của cửa sổ thành true. Không phải màn hình nào cũng hỗ trợ quá trình xử lý hậu kỳ tối thiểu; để tìm hiểu xem màn hình cụ thể có hỗ trợ tính năng này hay không, hãy gọi phương thức mới Display.isMinimalPostProcessingSupported().

Chèn lớp gỡ lỗi đồ hoạ có hiệu suất cao

Giờ đây, các ứng dụng có thể tải các lớp đồ hoạ bên ngoài (GLES, Vulkan) vào mã ứng dụng gốc để thể hiện chức năng giống như một ứng dụng có thể gỡ lỗi, nhưng không làm phát sinh chi phí hiệu suất. Tính năng này đặc biệt quan trọng khi phân tích tài nguyên cho ứng dụng của bạn bằng các công cụ như GAPID. Để phân tích tài nguyên cho ứng dụng, hãy đưa phần tử siêu dữ liệu sau đây vào tệp kê khai ứng dụng thay vì giúp ứng dụng có thể gỡ lỗi:

<application ... >
    <meta-data android:name="com.android.graphics.injectLayers.enable"
                  android:value="true" />
</application>

Hình ảnh và camera

Tắt tiếng thông báo và rung trong khi chụp đang hoạt động

Kể từ Android 11, khi chủ động sử dụng máy ảnh, ứng dụng của bạn chỉ có thể tắt tiếng chế độ rung, cả âm thanh và chế độ rung hoặc không thể sử dụng setCameraAudioRestriction().

Hỗ trợ máy ảnh mở rộng trong Trình mô phỏng Android

Để biết thông tin về tính năng hỗ trợ mở rộng cho máy ảnh trong trình mô phỏng kể từ Android 11, hãy xem bài viết Hỗ trợ máy ảnh.

Hỗ trợ sử dụng đồng thời nhiều máy ảnh

Android 11 thêm các API để truy vấn khả năng hỗ trợ sử dụng nhiều máy ảnh cùng lúc, bao gồm cả máy ảnh mặt trước và mặt sau.

Để kiểm tra khả năng hỗ trợ trên thiết bị mà ứng dụng của bạn đang chạy, hãy sử dụng các phương thức sau:

  • getConcurrentCameraIds() trả về một Set tổ hợp mã máy ảnh có thể truyền trực tuyến đồng thời với các tổ hợp luồng được đảm bảo khi được định cấu hình bằng cùng một quy trình xử lý ứng dụng.
  • isConcurrentSessionConfigurationSupported() truy vấn xem các thiết bị máy ảnh có thể đồng thời hỗ trợ các cấu hình phiên tương ứng hay không.

Hỗ trợ tốt hơn cho hình ảnh HEIF có nhiều khung hình

Kể từ Android 11, nếu bạn gọi hàm ImageDecoder.decodeDrawable() và truyền hình ảnh HEIF chứa một chuỗi khung hình (chẳng hạn như ảnh động hoặc ảnh hàng loạt), thì phương thức này sẽ trả về một AnimatedImageDrawable chứa toàn bộ chuỗi hình ảnh. Trên các phiên bản Android cũ, phương thức này chỉ trả về một BitmapDrawable của một khung hình duy nhất.

Nếu đồ hoạ HEIF chứa nhiều khung hình không theo trình tự, thì bạn có thể truy xuất từng khung hình riêng lẻ bằng cách gọi MediaMetadataRetriever.getImageAtIndex().

Hỗ trợ tiếp cận

Thông tin cập nhật dành cho nhà phát triển dịch vụ hỗ trợ tiếp cận

Nếu tạo một dịch vụ hỗ trợ tiếp cận tuỳ chỉnh, bạn có thể sử dụng các tính năng sau trong Android 11:

  • Phần giải thích dành cho người dùng về một dịch vụ hỗ trợ tiếp cận hiện cho phép HTML và hình ảnh ngoài văn bản thuần tuý. Tính linh hoạt này giúp người dùng cuối dễ dàng giải thích về chức năng của dịch vụ và cách dịch vụ có thể giúp họ.
  • Để nội dung mô tả trạng thái của một thành phần trên giao diện người dùng có ý nghĩa hơn về mặt ngữ nghĩa so với contentDescription, hãy gọi phương thức getStateDescription().
  • Để yêu cầu các sự kiện chạm bỏ qua trình khám phá thao tác chạm của hệ thống, hãy gọi setTouchExplorationPassthroughRegion(). Tương tự, để yêu cầu các cử chỉ bỏ qua trình phát hiện cử chỉ của hệ thống, hãy gọi setGestureDetectionPassthroughRegion().
  • Bạn có thể yêu cầu các thao tác IME, chẳng hạn như "enter" và "next", cũng như ảnh chụp màn hình của các cửa sổ không bật cờ FLAG_SECURE.

Các tính năng khác

Lý do thoát quy trình ứng dụng

Android 11 giới thiệu phương thức ActivityManager.getHistoricalProcessExitReasons(), phương thức này báo cáo lý do chấm dứt quy trình gần đây. Các ứng dụng có thể sử dụng phương thức này để thu thập thông tin chẩn đoán sự cố, chẳng hạn như việc chấm dứt quá trình có phải là do lỗi ANR, vấn đề về bộ nhớ hoặc những lý do khác hay không. Ngoài ra, bạn có thể sử dụng phương thức setProcessStateSummary() mới để lưu trữ thông tin trạng thái tuỳ chỉnh cho mục đích phân tích sau này.

Phương thức getHistoricalProcessExitReasons() trả về các thực thể của lớp ApplicationExitInfo, chứa thông tin liên quan đến trường hợp một quy trình bị buộc tắt. Bằng cách gọi getReason() trên một thực thể của lớp này, bạn có thể xác định lý do khiến quy trình của ứng dụng bị dừng. Ví dụ: giá trị trả về là REASON_CRASH cho biết rằng ứng dụng của bạn có một ngoại lệ chưa được xử lý. Nếu cần đảm bảo tính duy nhất cho các sự kiện thoát, thì ứng dụng có thể duy trì một giá trị nhận dạng dành riêng cho ứng dụng, chẳng hạn như giá trị băm dựa trên dấu thời gian của phương thức getTimestamp().

Tài nguyên khác

Để biết thêm thông tin, hãy đọc bài viết về các công cụ mới của Android 11 giúp ứng dụng trở nên riêng tư và ổn định hơn trên Medium.

Trình tải tài nguyên

Android 11 giới thiệu một API mới cho phép các ứng dụng linh hoạt mở rộng cách tìm kiếm và tải tài nguyên. Các lớp API mới ResourcesLoaderResourcesProvider chịu trách nhiệm chính trong việc cung cấp chức năng mới. Cùng với nhau, các thành phần này cho phép cung cấp thêm tài nguyên và tài sản hoặc sửa đổi giá trị của tài nguyên và tài sản hiện có.

Đối tượng ResourcesLoader là những vùng chứa cung cấp đối tượng ResourcesProvider cho thực thể Resources của ứng dụng. Đổi lại, đối tượng ResourcesProvider cung cấp các phương thức để tải dữ liệu tài nguyên từ tệp APK và bảng tài nguyên.

Một trường hợp sử dụng chính của API này là tải thành phần tuỳ chỉnh. Bạn có thể sử dụng loadFromDirectory() để tạo ResourcesProvider giúp chuyển hướng độ phân giải của các tài nguyên và thành phần dựa trên tệp, nhờ đó, ứng dụng sẽ tìm kiếm một thư mục cụ thể thay vì tệp APK của ứng dụng. Bạn có thể truy cập vào những tài sản này thông qua nhóm phương thức open() từ lớp API AssetManager, giống như các tài sản đi kèm trong tệp APK.

Lược đồ chữ ký APK phiên bản 4

Android 11 bổ sung tính năng hỗ trợ cho Lược đồ chữ ký APK v4. Giao thức này tạo ra một loại chữ ký mới trong một tệp riêng biệt (apk-name.apk.idsig) nhưng tương tự như phiên bản 2 và v3. Không có thay đổi nào đối với tệp APK. Lược đồ này hỗ trợ cài đặt APK gia tăng ADB, giúp tăng tốc độ cài đặt APK.

Bộ lọc ý định động

Để nhận được ý định, ứng dụng phải khai báo loại dữ liệu có thể nhận tại thời điểm biên dịch bằng cách xác định bộ lọc ý định trong tệp kê khai ứng dụng. Trong Android 10 trở xuống, các ứng dụng không có cách nào để thay đổi bộ lọc ý định trong thời gian chạy. Đây là một vấn đề đối với các ứng dụng ảo hoá (chẳng hạn như máy ảo và máy tính từ xa) vì họ không có cách nào để biết chính xác người dùng sẽ cài đặt phần mềm nào bên trong.

Android 11 giới thiệu các nhóm MIME, một phần tử tệp kê khai mới cho phép ứng dụng khai báo tập hợp các loại MIME động trong bộ lọc ý định và sửa đổi tập hợp đó theo phương thức lập trình trong thời gian chạy. Để sử dụng nhóm MIME, hãy đưa một phần tử dữ liệu vào tệp kê khai ứng dụng với thuộc tính android:mimeGroup mới:

<intent-filter>
  <action android:name="android.intent.action.SEND"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeGroup="myMimeGroup"/>
</intent-filter>

Giá trị của thuộc tính android:mimeGroup là một mã nhận dạng chuỗi tuỳ ý giúp nhận dạng nhóm MIME trong thời gian chạy. Bạn có thể truy cập và cập nhật nội dung của nhóm MIME bằng cách chuyển mã của nhóm đó đến các phương thức mới sau đây trong lớp API PackageManager:

Khi bạn thêm một loại MIME vào nhóm MIME theo phương thức lập trình, loại MIME đó sẽ hoạt động giống hệt như loại MIME tĩnh được khai báo rõ ràng trong tệp kê khai.

Tính năng tự động điền nâng cao

Android 11 cải tiến dịch vụ tự động điền.

Giá trị nhận dạng gợi ý trong AssistStructure.ViewNode

Các dịch vụ tự động điền thường hữu ích trong việc tính toán hàm băm chữ ký cho một khung hiển thị dựa trên các thuộc tính của khung hiển thị đó. View hint (Gợi ý khung hiển thị) là một thuộc tính đặc biệt hiệu quả nên đưa vào khi tính toán hàm băm chữ ký, nhưng chuỗi gợi ý có thể thay đổi theo ngôn ngữ của điện thoại. Để giải quyết vấn đề này, Android 11 mở rộng AssistStructure.ViewNode bằng phương thức getHintIdEntry() mới. Phương thức này trả về giá trị nhận dạng tài nguyên cho văn bản gợi ý của khung hiển thị. Phương thức này cung cấp một giá trị không phụ thuộc vào ngôn ngữ mà bạn có thể sử dụng để tính toán các hàm băm chữ ký.

Tập dữ liệu hiển thị sự kiện

Để giúp các dịch vụ tự động điền cải thiện nội dung đề xuất, Android 11 đưa ra cách xác định trường hợp dịch vụ tự động điền đưa ra tập dữ liệu nhưng người dùng không chọn bất kỳ tập dữ liệu nào trong số đó. Trong Android 11, FillEventHistory sẽ báo cáo một loại sự kiện TYPE_DATASETS_SHOWN mới. FillEventHistory ghi lại một sự kiện thuộc loại này bất cứ khi nào dịch vụ tự động điền hiển thị một hoặc nhiều tập dữ liệu cho người dùng. Dịch vụ tự động điền có thể sử dụng các sự kiện này cùng với sự kiện TYPE_DATASET_SELECTED hiện có để xác định xem người dùng có chọn bất kỳ tuỳ chọn tự động điền nào được cung cấp hay không.

Tích hợp IME

Giờ đây, bàn phím và các IME khác có thể hiển thị các đề xuất tự động điền cùng dòng, trong dải đề xuất hoặc giao diện tương tự, thay vì trong trình đơn thả xuống. Để bảo vệ thông tin nhạy cảm như mật khẩu và số thẻ tín dụng, các đề xuất sẽ hiển thị cho người dùng nhưng IME sẽ không biết cho đến khi người dùng chọn một đề xuất. Để biết thông tin về cách IME và trình quản lý mật khẩu có thể hỗ trợ tính năng này, hãy xem nội dung Tích hợp tính năng tự động điền với bàn phím.

Chia sẻ dữ liệu với dịch vụ ghi lại nội dung

Kể từ Android 11, ứng dụng của bạn có thể chia sẻ dữ liệu với dịch vụ ghi nội dung của thiết bị. Tính năng này giúp thiết bị dễ dàng truyền đạt thông tin theo ngữ cảnh, chẳng hạn như hiển thị tên của một bài hát đang phát trong môi trường của người dùng.

Để cung cấp dữ liệu từ ứng dụng của bạn cho dịch vụ ghi lại nội dung, hãy gọi phương thức shareData() trên một thực thể của ContentCaptureManager. Nếu hệ thống chấp nhận yêu cầu chia sẻ dữ liệu, ứng dụng của bạn sẽ nhận được chỉ số mô tả tệp chỉ ghi để chia sẻ với dịch vụ ghi lại nội dung.