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. Những ứ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. 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 mọi ảnh chụp nhanh màn hình, cũng như cách ứng dụng âm thanh có thể ngăn các ứng dụng khác ghi lại nội dung đã 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 quyền truy cập một lần để ghi lại nội dung hoặc âm thanh 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 thích hợp, nếu không, ứng dụng sẽ tiếp tục ghi âm khoảng 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 lại 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
Xem ứng dụng mẫu ScreenCapture để tìm hiểu cách sử dụng Media Projection API để chụp màn hình 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 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 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ó ứng dụng cho biết cách cấm ảnh chụp màn hình.
Ghi âm phát lại
Ra mắt AudioPlaybackCapture API 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 các ứng dụng truyền trực tuyến muốn ghi lại âm thanh mà trò chơi đang chơi.
Lưu ý rằng API AudioPlaybackCapture không ảnh hưởng đến độ trễ của ứng dụng đang ghi âm.
Xây dựng ứ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 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:
- Ứng dụng phải có quyền
RECORD_AUDIO
. - Ứng dụng phải cho thấy lời nhắc do
MediaProjectionManager.createScreenCaptureIntent()
hiển thị và người dùng phải phê duyệt lời nhắc đó. - Các ứng dụng chụp và phát phải thuộc 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 đố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 cho
AudioRecord
bằng cách gọisetAudioPlaybackCaptureConfig
.
Kiểm soát việc ghi âm
Ứng dụng của bạn có thể kiểm soát loại nội dung ứng dụng có thể ghi lại và những loại ứng dụng khác có thể tự ghi lại nội dung phát.
Hạn chế việc ghi âm theo nội dung âm thanh
Ứng dụng có thể giới hạn âm thanh mà mình có thể thu thập bằng các phương thức sau:
- Truyền
AUDIO_USAGE
đến AudioPlaybackCaptureConfiguration.addMatchingUsage() để cho phép ghi lại một mức sử dụng cụ thể. Gọi phương thức này nhiều lần để chỉ định nhiều cách sử dụng. - Truyền một
AUDIO_USAGE
đến AudioPlaybackCaptureConfiguration.kháUsage() để cấm ghi lại việc sử dụng đó. Gọi phương thức này nhiều lần để chỉ định nhiều cách sử dụng. - Truyền một UID đến AudioPlaybackCaptureConfiguration.addMatchingUid() để chỉ chụp các ứng dụng có một UID cụ thể. Gọi phương thức này nhiều lần để chỉ định nhiều UID.
- Truyền một UID đến AudioPlaybackCaptureConfiguration.ExcludeUid() để cấm chụp UID đó. Gọi phương thức này nhiều lần để chỉ định nhiều UID.
Lưu ý là bạn không thể sử dụng cùng lúc 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ế 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 đó. Âm thanh từ một ứng dụng chỉ có thể được ghi lại 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 ghi hình của người chơi 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:
- Để bật tính năng chụp ảnh trên tất cả trình phát, hãy thêm
android:allowAudioPlaybackCapture="true"
vào tệpmanifest.xml
của ứng dụng. - Bạn cũng có thể bật tính năng chụp ảnh đối với tất cả người chơi bằng cách gọi
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Bạn có thể đặt chính sách này cho từng người chơi khi xây dựng chính sách này bằng cách sử dụ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 những điều kiện tiên quyết này, người chơi có thể ghi lại mọi âm thanh.
Tắt 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 các ứ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ụ đề. Vì lý do này, các ứng dụng nên cho phép hệ thống ghi lại nội dung phát. Trong trường hợp hiếm hoi khi bạn không muốn hệ thống ghi lại hoạt động phát của ứng dụng, hãy đặt chính sách ghi hình 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 ghi lại 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, â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 để 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 chụp ảnh có thể được chỉ định ở nhiều vị trí, nên điều quan trọng là
phải hiểu cách xác định chính sách có hiệu quả.
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 chứa setAllowedCapturePolicy="false"
sẽ không bao giờ cho phép các ứng dụng ngoài 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 đượ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ể tiếp cận được 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:
cho phép phát lại âm thanh | 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 |