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 trên 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 đúng cách. Trang này giải thích cách thực hiện. Báo cáo này cũng cho thấy cách quản trị viên thiết bị có thể tắt khả năng ghi lại mọi ảnh chụp nhanh màn hình và cách một ứng dụng âm thanh có thể ngăn các ứng dụng khác ghi lại nội dung được phát.

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

API MediaProjection cho phép các ứng dụng nhận được mã thông báo MediaProjection, cấp cho ứng dụng quyền truy cập một lần để ghi lại âm thanh hoặc nội dung trên màn hình. 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 thu hồi quyền truy cập vào 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 được 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 đúng cách, nếu không ứng dụng sẽ tiếp tục ghi lại âm thanh im lặng hoặc luồng video đen.

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

Để biết thêm thông tin, hãy xem bài viết Chiếu nội dung nghe nhì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 ảnh màn hình của thiết bị theo thời gian thực và hiển thị trên SurfaceView.

Bạn có thể dùng DevicePolicyManager để ngăn ghi màn hình. Đối với các tài khoản doanh nghiệp (Android for Work), quản trị viên có thể tắt tính năng thu thập dữ liệu của 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 ảnh chụp màn hình.

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

Chúng tôi đã ra mắt API AudioPlaybackCapture trong Android 10. API này cho phép các ứng dụng sao chép âm thanh mà các ứng dụng khác đang phát. 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 việc truyền trực tuyến những ứng dụng muốn ghi lại âm thanh mà trò chơi đang phát.

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

Tạo ứng dụng chụp

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

Để ghi âm từ một ứng dụng khác, ứng dụng của bạn phải tạo đối tượng AudioRecord và thêm 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 vào 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 những loại nội dung có thể ghi hình và những loại ứng dụng khác có thể ghi lại nội dung phát riêng.

Hạn chế ghi lại theo nội dung âm thanh

Một ứng dụng có thể giới hạn loại âm thanh mà ứng dụng đó có thể ghi bằng cách dùng các phương thức sau:

Xin lưu ý rằng bạn không thể sử dụng kết hợp 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 lúc.

Hạn chế chụp bởi 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 đó. Ứng dụng chỉ có thể ghi lại âm thanh của ứ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 mức sử dụng thành USAGE_MEDIA, USAGE_GAME hoặc USAGE_UNKNOWN.

Chính sách chụp

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

Nếu đáp ứng những điều kiện tiên quyết này, thì người chơi 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 ảnh của hệ thống

Các biện pháp bảo vệ cho phép ghi lại như 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 nội dung phát. Nhiều thành phần trong số này đượ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 gặp, 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 chụp 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 khi một ứ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 theo dõi để sự thay đổi về chính sách có hiệu lực.

Chính sách = manifest + AudioManager + AudioAttributes

Vì chính sách thu thập có thể được chỉ định ở nhiều nơi, nên điều quan trọng là bạn phải hiểu cách xác định chính sách có hiệu lực. Chính sách chụp ảnh hạn chế nhất 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 thuộc hệ thống ghi lại âm thanh, ngay cả khi AudioManager#setAllowedCapturePolicy được đặt thành ALLOW_CAPTURE_BY_ALL. Tương tự, nếu bạn đặt AudioManager#setAllowedCapturePolicy 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 đa phương tiện này được tạo bằng AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), thì các ứng dụng không phải hệ thống sẽ không thể kiểm soát trình phát nội dung đa phương tiện này.

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

allowAudioPlaybackCapture CHO PHÉP_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM CHO PHÉP_CAPTURE_BY_NONE
true bất kỳ ứng dụng nào chỉ hệ thống không chụp
false chỉ hệ thống chỉ hệ thống không chụp