Một ứng dụng có thể ghi lại video hoặc âm thanh đang được phát từ một ứng dụng khác. Những ứ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
khả năng ghi lại mọi ảnh chụp nhanh màn hình, cũng như 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 mà ứng dụng đó phát.
Cách xử lý mã thông báo MediaProjection
API MediaProjection cho phép các ứng dụng lấy mã thông báo MediaProjection để cấp cho chúng quyền truy cập một lần nhằm chụp nội dung màn hình hoặc âm thanh. Hệ điều hành Android sẽ hỏi ý kiến người dùng trước khi cấp mã thông báo cho ứng dụng của bạn.
Hệ điều hành sẽ 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 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 lại â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ý một 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 nghe nhìn.
Quay video
Bạn có thể dùng DevicePolicyManager để ngăn việc ghi màn hình. Đối với 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 chụp ảnh màn hình.
Ghi âm thanh phát
API AudioPlaybackCapture được ra mắt trong Android 10. API này cho phép ứng dụng sao chép âm thanh đang được phát bởi các ứng dụng khác. Tính năng này tương tự như tính năng chụp màn hình, nhưng dành cho âm thanh. Trường hợp sử dụng chính là 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.
Lưu ý rằng AudioPlaybackCapture API không ảnh hưởng đến độ trễ của ứng dụng có âm thanh đang được ghi lại.
Tạo ứng dụng chụp ảnh
Để đảm bảo tính bảo mật và quyền riêng tư, tính năng ghi lại 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:
- Ứng dụng phải có quyền
RECORD_AUDIO. - Ứng dụng phải đưa ra 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 ghi và ứng dụng phát 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 AudioPlaybackCaptureConfiguration vào đối tượng đó. Hãy làm theo các bước sau:
- Gọi
AudioPlaybackCaptureConfiguration.Builder.build()để tạoAudioPlaybackCaptureConfiguration. - Truyền cấu hình đến
AudioRecordbằng cách gọisetAudioPlaybackCaptureConfig.
Điều khiển việc thu âm thanh
Ứ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ế việc ghi lại theo nội dung âm thanh
Ứng dụng có thể giới hạn âm thanh mà ứng dụng có thể thu bằng cách sử dụng các phương thức sau:
- Truyền
AUDIO_USAGEđến AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage() để cho phép ghi lại một trường hợp sử dụng cụ thể. Gọi phương thức này nhiều lần để chỉ định nhiều mục đích sử dụng. - Truyền
AUDIO_USAGEđến AudioPlaybackCaptureConfiguration.excludeUsage() để cấm ghi lại mức sử dụng đó. Gọi phương thức này nhiều lần để chỉ định nhiều mục đích sử dụng. - Truyền UID đến AudioPlaybackCaptureConfiguration.addMatchingUid() để chỉ ghi lại các ứng dụng có UID cụ thể. Gọi phương thức này nhiều lần để chỉ định nhiều UID.
- Truyền UID đến AudioPlaybackCaptureConfiguration.excludeUid() để cấm ghi lại UID đó. Gọi phương thức này nhiều lần để chỉ định nhiều UID.
Lưu ý rằng bạn không thể sử dụng đồng thời các phương thức addMatchingUsage() và excludeUsage(). Bạn phải chọn một trong hai. Tương tự, bạn không thể sử dụng addMatchingUid() và excludeUid() cùng một lúc.
Hạn chế việc ghi lại 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 lại âm thanh phát ra 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 mức sử dụng thành USAGE_MEDIA, USAGE_GAME hoặc USAGE_UNKNOWN.
Chính sách chụp ảnh
Chính sách ghi lại 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. Bạn có thể thực hiện việc này theo một số cách:
- Để bật tính năng chụp trên tất cả trình phát, hãy thêm
android:allowAudioPlaybackCapture="true"vào tệpmanifest.xmlcủa ứng dụng. - Bạn cũng có thể bật tính năng chụp trên tất cả trình phát bằng cách gọi
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - Bạn có thể đặt chính sách cho từng trình phát khi tạo trình phát bằng
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (Nếu bạn đang sử dụngAAudio, hãy gọiAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL).)
Nếu đáp ứng các điều kiện tiên quyết này, thì mọi âm thanh do trình phát tạo ra đều có thể được ghi lại.
Đang tắt tính năng ghi lại hệ thống
Các biện pháp bảo vệ cho phép chụp ảnh màn hình đượ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 nội dung phát.
Nhiều thành phần trong số này được 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ụ đề. Do đó, các ứng dụng nên cho phép hệ thống ghi lại quá trình phát của chúng. 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 ghi thành ALLOW_CAPTURE_BY_NONE.
Thiết lập chính sách trong thời gian chạy
Bạn có thể gọi AudioManager.setAllowedCapturePolicy() để thay đổi chính sách ghi âm 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 này, 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 về chính sách có hiệu lực.
Chính sách = tệp kê khai + AudioManager + AudioAttributes
Vì chính sách ghi lại có thể được chỉ định ở một số nơi, nên bạn cần hiểu rõ cách xác định chính sách có hiệu lực.
Chính sách chụp ảnh nghiêm ngặt nhất luôn được áp dụng. Ví dụ: một ứng dụng có tệp kê khai chứa 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 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ì các ứng dụng không thuộc hệ thống sẽ không thể ghi lại trình phát nội dung nghe nhìn này.
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 | 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 |