Ghi video và phát âm thanh

Một ứng dụng có thể ghi lại video hoặc âm thanh đang phát từ một ứng dụng khác. Các ứng dụng như vậy phải xử lý mã thông báo MediaProjection một cách chính xác. Trang này giải thích cách thực hiện. Tài liệu này cũng cho biết cách quản trị viên thiết bị có thể tắt tính năng ghi lại ảnh chụp nhanh màn hình và cách ứng dụng âm thanh có thể ngăn các ứng dụng khác ghi lại nội dung mà ứng dụng đó phát.

Cách xử lý mã thông báo MediaProjection

API MediaProjection cho phép ứng dụng thu thập mã thông báo MediaProjection để cấp cho ứng dụng quyền truy cập một lần để chụp nội dung màn hình hoặc âm thanh. Hệ điều hành Android sẽ yêu cầu người dùng cấp quyền trước khi cấp mã thông báo cho ứng dụng của bạn.

Hệ điều hành hiển thị các mã thông báo MediaProjection đang hoạt động trong giao diện người dùng Cài đặt nhanh và cho phép người dùng rút quyền truy cập vào một mã thông báo bất cứ lúc nào. Khi điều này xảy ra, màn hình ảo hoặc luồng âm thanh liên kết với phiên sẽ ngừng nhận luồng nội dung nghe nhìn. Ứng dụng của bạn phải phản hồi một cách thích hợp, nếu không, ứng dụng sẽ tiếp tục ghi âm thanh im lặng hoặc luồng video màu đen.

Để xử lý việc mất mã thông báo, hãy đăng ký lệnh gọi lại trên thực thể MediaProjection bằng phương thức registerCallback và dừng ghi khi phương thức onStop được gọi.

Để biết thêm thông tin, hãy xem phần Chiếu nội dung đa phương tiện.

Quay video

Hãy xem ứng dụng mẫu ScreenCapture để tìm hiểu cách sử dụng Media Projection API nhằm chụp màn hình của thiết bị theo thời gian thực và hiển thị màn hình đó trên SurfaceView.

Bạn có thể dùng DevicePolicyManager để ngăn chặn tính năng quay màn hình. Đối với tài khoản doanh nghiệp (Android cho công việc), quản trị viên có thể tắt tính năng thu thập dữ liệu trợ lý cho hồ sơ công việc bằng cách sử dụng phương thức setScreenCaptureDisabled.

Lớp học lập trình Quản lý thiết bị Android mà không cần ứng dụng cho biết cách cấm chụp ảnh màn hình.

Ghi lại quá trình phát âm thanh

AudioPlaybackCapture API được giới thiệu trong Android 10. API này cho phép các ứng dụng sao chép âm thanh đang phát của các ứng dụng khác. Tính năng này tương tự như tính năng chụp ảnh màn hình, nhưng dành cho âm thanh. Trường hợp sử dụng chính là dành cho các ứng dụng phát trực tuyến muốn ghi lại âm thanh đang phát trong trò chơi.

Xin lưu ý rằng API AudioPlaybackCapture không ảnh hưởng đến độ trễ của ứng dụng đang được ghi âm.

Xây dựng ứng dụng chụp

Để đảm bảo tính bảo mật và quyền riêng tư, tính năng quay lại quá trình phát có một số giới hạn. Để có thể ghi âm, ứng dụng phải đáp ứng các yêu cầu sau:

  • Ứng dụng phải có quyền RECORD_AUDIO.
  • Ứng dụng phải hiển thị lời nhắc do MediaProjectionManager.createScreenCaptureIntent() hiển thị và người dùng phải phê duyệt lời nhắc đó.
  • Ứng dụng quay video và phát video phải nằm trong cùng một hồ sơ người dùng.

Để ghi âm từ một ứng dụng khác, ứng dụng của bạn phải tạo một đối tượng AudioRecord và thêm một AudioPlaybackCaptureConfiguration vào đối tượng đó. Hãy làm theo các bước sau:

  1. Gọi AudioPlaybackCaptureConfiguration.Builder.build() để tạo AudioPlaybackCaptureConfiguration.
  2. Truyền cấu hình đến AudioRecord bằng cách gọi setAudioPlaybackCaptureConfig.

Điều khiển tính năng ghi âm

Ứng dụng của bạn có thể kiểm soát loại nội dung mà ứng dụng có thể ghi lại và loại ứng dụng nào khác có thể ghi lại nội dung phát của chính ứng dụng đó.

Hạn chế tính năng quay video theo nội dung âm thanh

Ứng dụng có thể giới hạn âm thanh mà ứng dụng có thể ghi lại bằng cách sử dụng các phương thức sau:

Xin lưu ý rằng bạn không thể sử dụng cùng lúc các phương thức addMatchingUsage()excludeUsage(). Bạn phải chọn một trong hai. Tương tự, bạn không thể sử dụng addMatchingUid()excludeUid() cùng một lúc.

Hạn chế việc chụp ảnh của các ứng dụng khác

Bạn có thể định cấu hình một ứng dụng để ngăn các ứng dụng khác ghi lại âm thanh của ứng dụng đó. Bạn chỉ có thể ghi âm âm thanh từ một ứng dụng nếu ứng dụng đó đáp ứng các yêu cầu sau:

Cách sử dụng

Trình phát tạo âm thanh phải đặt chế độ sử dụng thành USAGE_MEDIA, USAGE_GAME hoặc USAGE_UNKNOWN.

Chính sách về việc chụp

Chính sách quay video của trình phát phải là AudioAttributes.ALLOW_CAPTURE_BY_ALL để cho phép các ứng dụng khác quay video phát. Bạn có thể thực hiện việc này theo một số cách:

Nếu đáp ứng các điều kiện tiên quyết này, bạn có thể ghi lại mọi âm thanh do trình phát tạo ra.

Tắt tính năng chụp hệ thống

Các biện pháp bảo vệ cho phép chụp được mô tả ở trên chỉ áp dụng cho ứng dụng. Theo mặc định, các thành phần hệ thống Android có thể ghi lại quá trình phát. Nhiều thành phần trong số này do các nhà cung cấp Android tuỳ chỉnh và hỗ trợ các tính năng như hỗ trợ tiếp cận và phụ đề. Vì lý do này, các ứng dụng nên cho phép hệ thống ghi lại quá trình phát. Trong trường hợp hiếm hoi khi bạn không muốn hệ thống ghi lại quá trình phát của ứng dụng, hãy đặt chính sách ghi lại thành ALLOW_CAPTURE_BY_NONE.

Đặt chính sách trong thời gian chạy

Bạn có thể gọi AudioManager.setAllowedCapturePolicy() để thay đổi chính sách chụp trong khi ứng dụng đang chạy. Nếu MediaPlayer hoặc AudioTrack đang phát khi bạn gọi phương thức, thì âm thanh sẽ không bị ảnh hưởng. Bạn phải đóng rồi mở lại trình phát hoặc bản nhạc để thay đổi chính sách có hiệu lực.

Chính sách = tệp kê khai + AudioManager + AudioAttributes

Vì chính sách chụp có thể được chỉ định ở một số vị trí, nên bạn cần hiểu cách xác định chính sách hiệu quả. Chính sách hạn chế nhất về việc quay video sẽ luôn được áp dụng. Ví dụ: một ứng dụng có tệp kê khai bao gồm setAllowedCapturePolicy="false" sẽ không bao giờ cho phép các ứng dụng không phải hệ thống ghi lại âm thanh của ứng dụng đó, ngay cả khi AudioManager#setAllowedCapturePolicy được đặt thành ALLOW_CAPTURE_BY_ALL. Tương tự, nếu AudioManager#setAllowedCapturePolicy được đặt thành ALLOW_CAPTURE_BY_ALL và tệp kê khai đặt setAllowedCapturePolicy="true", nhưng AudioAttributes của trình phát nội dung nghe nhìn được tạo bằng AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), thì trình phát nội dung nghe nhìn này sẽ không được các ứng dụng không phải hệ thống ghi lại.

Bảng dưới đây tóm tắt hiệu quả của thuộc tính tệp kê khai và chính sách có hiệu lực:

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true ứng dụng bất kỳ chỉ hệ thống không chụp
false chỉ hệ thống chỉ hệ thống không chụp