แอปสามารถบันทึกวิดีโอหรือเสียงที่เล่นจากแอปอื่นได้ โดยแอปดังกล่าวต้องจัดการโทเค็น MediaProjection อย่างถูกต้อง หน้านี้จะอธิบายวิธีการ นอกจากนี้ยังแสดงวิธีที่ผู้ดูแลระบบอุปกรณ์สามารถปิดใช้ความสามารถในการบันทึกภาพรวมหน้าจอ และวิธีที่แอปเสียงสามารถป้องกันไม่ให้แอปอื่นๆ บันทึกเนื้อหาที่แอปเล่น
วิธีจัดการโทเค็น MediaProjection
API MediaProjection ช่วยให้แอปได้รับโทเค็น MediaProjection ซึ่งให้สิทธิ์เข้าถึงแบบครั้งเดียวเพื่อบันทึกเนื้อหาบนหน้าจอหรือเสียง ระบบปฏิบัติการ Android จะขอสิทธิ์จากผู้ใช้ก่อนที่จะให้โทเค็นแก่แอปของคุณ
ระบบปฏิบัติการจะแสดงโทเค็น MediaProjection ที่ใช้งานอยู่ใน UI การตั้งค่าด่วนและอนุญาตให้ผู้ใช้ถอนสิทธิ์เข้าถึงโทเค็นได้ทุกเมื่อ เมื่อเกิดกรณีนี้ขึ้น จอแสดงผลเสมือนหรือสตรีมเสียงที่เชื่อมโยงกับเซสชันจะหยุดรับสตรีมสื่อ แอปของคุณต้องตอบสนองอย่างเหมาะสม มิฉะนั้นแอปจะยังคงบันทึกเสียงที่เงียบหรือสตรีมวิดีโอสีดำต่อไป
หากต้องการจัดการกับการสูญเสียโทเค็น ให้ลงทะเบียน Callback ในอินสแตนซ์ MediaProjection โดยใช้เมธอด registerCallback และหยุดบันทึกเมื่อมีการเรียกใช้เมธอด onStop
ดูข้อมูลเพิ่มเติมได้ที่การฉายสื่อ
จับภาพวิดีโอ
คุณสามารถใช้ DevicePolicyManager เพื่อป้องกันการบันทึกหน้าจอได้ สำหรับบัญชีองค์กร (Android for Work) ผู้ดูแลระบบสามารถปิดใช้การเก็บรวบรวมข้อมูลผู้ช่วยสำหรับโปรไฟล์งานได้โดยใช้วิธี setScreenCaptureDisabled
Codelab การจัดการอุปกรณ์ Android โดยไม่ต้องใช้แอปจะแสดงวิธีห้ามไม่ให้จับภาพหน้าจอ
บันทึกการเล่นเสียง
AudioPlaybackCapture API เปิดตัวใน Android 10 API นี้ช่วยให้แอปสามารถคัดลอกเสียงที่แอปอื่นๆ กำลังเล่นอยู่ได้ ฟีเจอร์นี้คล้ายกับการจับภาพหน้าจอ แต่เป็นการจับเสียง กรณีการใช้งานหลักคือแอปสตรีมมิงที่ต้องการบันทึกเสียงที่เกมเล่น
โปรดทราบว่า AudioPlaybackCapture API ไม่ส่งผลต่อเวลาในการตอบสนองของแอปที่กำลังบันทึกเสียงอยู่
การสร้างแอปจับภาพ
การจับภาพคลิปย้อนหลังมีข้อจำกัดบางประการเพื่อความปลอดภัยและความเป็นส่วนตัว แอปต้องเป็นไปตามข้อกำหนดต่อไปนี้จึงจะบันทึกเสียงได้
- แอปต้องมีสิทธิ์
RECORD_AUDIO - แอปต้องแสดงข้อความแจ้งที่แสดงโดย
MediaProjectionManager.createScreenCaptureIntent()และผู้ใช้ต้องอนุมัติข้อความแจ้งดังกล่าว - แอปที่จับภาพและแอปที่เล่นต้องอยู่ในโปรไฟล์ผู้ใช้เดียวกัน
หากต้องการบันทึกเสียงจากแอปอื่น แอปของคุณต้องสร้างออบเจ็กต์ AudioRecord และเพิ่ม AudioPlaybackCaptureConfiguration ลงในออบเจ็กต์ดังกล่าว โปรดทำตามขั้นตอนต่อไปนี้
- เรียกใช้
AudioPlaybackCaptureConfiguration.Builder.build()เพื่อสร้างAudioPlaybackCaptureConfiguration - ส่งการกำหนดค่าไปยัง
AudioRecordโดยเรียกใช้setAudioPlaybackCaptureConfig
การควบคุมการบันทึกเสียง
แอปของคุณสามารถควบคุมประเภทเนื้อหาที่บันทึกได้ และประเภทแอปอื่นๆ ที่สามารถบันทึกการเล่นของตนเองได้
การจำกัดการบันทึกตามเนื้อหาเสียง
แอปสามารถจำกัดเสียงที่บันทึกได้โดยใช้วิธีการต่อไปนี้
- ส่ง
AUDIO_USAGEไปยัง AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage() เพื่ออนุญาตให้บันทึกการใช้งานที่เฉพาะเจาะจง เรียกใช้เมธอดหลายครั้งเพื่อระบุการใช้งานมากกว่า 1 รายการ - ส่ง
AUDIO_USAGEไปยัง AudioPlaybackCaptureConfiguration.excludeUsage() เพื่อห้ามไม่ให้บันทึกการใช้งานนั้น เรียกใช้เมธอดหลายครั้งเพื่อระบุการใช้งานมากกว่า 1 รายการ - ส่ง UID ไปยัง AudioPlaybackCaptureConfiguration.addMatchingUid() เพื่อบันทึกเฉพาะแอปที่มี UID ที่เฉพาะเจาะจง เรียกใช้เมธอดหลายครั้งเพื่อระบุ UID มากกว่า 1 รายการ
- ส่ง UID ไปยัง AudioPlaybackCaptureConfiguration.excludeUid() เพื่อห้ามไม่ให้บันทึก UID นั้น เรียกใช้เมธอดหลายครั้งเพื่อระบุ UID มากกว่า 1 รายการ
โปรดทราบว่าคุณไม่สามารถใช้วิธี addMatchingUsage() และ excludeUsage() ร่วมกันได้ คุณต้องเลือกอย่างใดอย่างหนึ่ง ในทำนองเดียวกัน คุณไม่สามารถใช้ addMatchingUid() และ excludeUid() พร้อมกันได้
การจำกัดการจับภาพโดยแอปอื่นๆ
คุณสามารถกำหนดค่าแอปเพื่อป้องกันไม่ให้แอปอื่นๆ บันทึกเสียงของแอปได้ ระบบจะบันทึกเสียงที่มาจากแอปได้ก็ต่อเมื่อแอปเป็นไปตามข้อกำหนดต่อไปนี้
การใช้งาน
โปรแกรมเล่นที่สร้างเสียงต้องตั้งค่าการใช้งานเป็น USAGE_MEDIA, USAGE_GAME หรือ USAGE_UNKNOWN
นโยบายการจับภาพ
นโยบายการบันทึกของเพลเยอร์ต้องเป็น
AudioAttributes.ALLOW_CAPTURE_BY_ALL
ซึ่งอนุญาตให้แอปอื่นๆ บันทึกการเล่นได้ ซึ่งทำได้หลายวิธี ดังนี้
- หากต้องการเปิดใช้การบันทึกในโปรแกรมเล่นทั้งหมด ให้ใส่
android:allowAudioPlaybackCapture="true"ในไฟล์manifest.xmlของแอป - นอกจากนี้ คุณยังเปิดใช้การจับภาพในเพลเยอร์ทั้งหมดได้โดยเรียกใช้
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL) - คุณสามารถตั้งค่านโยบายในเพลเยอร์แต่ละรายการได้เมื่อสร้างเพลเยอร์โดยใช้
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)(หากคุณใช้AAudioให้โทรหาAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL))
หากเป็นไปตามข้อกำหนดเบื้องต้นเหล่านี้ ระบบจะบันทึกเสียงที่สร้างโดยโปรแกรมเล่นได้
กำลังปิดใช้การบันทึกของระบบ
การป้องกันที่อนุญาตให้จับภาพตามที่อธิบายไว้ข้างต้นจะมีผลกับแอปเท่านั้น คอมโพเนนต์ของระบบ Android สามารถจับภาพการเล่นได้โดยค่าเริ่มต้น
ผู้ให้บริการ Android จะปรับแต่งคอมโพเนนต์เหล่านี้หลายรายการและรองรับฟีเจอร์ต่างๆ เช่น การช่วยเหลือพิเศษและคำบรรยายแทนเสียง ด้วยเหตุนี้ เราจึงขอแนะนำให้แอปอนุญาตให้ระบบบันทึกการเล่นของแอป ในกรณีที่เกิดขึ้นไม่บ่อยนักเมื่อคุณไม่ต้องการให้ระบบบันทึกการเล่นของแอป ให้ตั้งค่านโยบายการบันทึกเป็น ALLOW_CAPTURE_BY_NONE
การตั้งค่านโยบายที่รันไทม์
คุณสามารถเรียกใช้ AudioManager.setAllowedCapturePolicy() เพื่อเปลี่ยนนโยบายการบันทึกขณะที่แอปทำงานอยู่ได้ หาก MediaPlayer หรือ AudioTrack กำลังเล่นอยู่เมื่อคุณเรียกใช้เมธอด เสียงจะไม่ได้รับผลกระทบ คุณต้องปิดและเปิดเพลเยอร์หรือแทร็กอีกครั้งเพื่อให้การเปลี่ยนแปลงนโยบายมีผล
นโยบาย = ไฟล์ Manifest + AudioManager + AudioAttributes
เนื่องจากสามารถระบุนโยบายการจับภาพได้หลายที่ คุณจึงควรทำความเข้าใจวิธีพิจารณานโยบายที่มีผลบังคับใช้
ระบบจะใช้นโยบายการบันทึกที่เข้มงวดที่สุดเสมอ ตัวอย่างเช่น แอปที่มีไฟล์ Manifest ที่มี setAllowedCapturePolicy="false" จะไม่อนุญาตให้แอปที่ไม่ใช่แอประบบบันทึกเสียง แม้ว่าจะตั้งค่า AudioManager#setAllowedCapturePolicy เป็น ALLOW_CAPTURE_BY_ALL ก็ตาม ในทำนองเดียวกัน หากตั้งค่า AudioManager#setAllowedCapturePolicy เป็น ALLOW_CAPTURE_BY_ALL และไฟล์ Manifest ตั้งค่า setAllowedCapturePolicy="true" แต่ AudioAttributes ของมีเดียเพลเยอร์สร้างขึ้นด้วย AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM) แอปที่ไม่ใช่ของระบบจะจับภาพมีเดียเพลเยอร์นี้ไม่ได้
ตารางด้านล่างสรุปผลของแอตทริบิวต์ไฟล์ Manifest และนโยบายที่มีผลบังคับใช้
| allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| true | แอปใดก็ได้ | ระบบเท่านั้น | ไม่มีการจับภาพ |
| เท็จ | ระบบเท่านั้น | ระบบเท่านั้น | ไม่มีการจับภาพ |