บันทึกการเล่นวิดีโอและเสียง

แอปสามารถบันทึกวิดีโอหรือเสียงที่เล่นจากแอปอื่น เช่น ต้องจัดการกับ โทเค็น MediaProjection อย่างถูกต้อง หน้านี้จะอธิบายถึงวิธีการ รวมถึงแสดงวิธีปิดใช้ที่ผู้ดูแลระบบอุปกรณ์ได้ ความสามารถในการบันทึกภาพหน้าจอ และวิธีที่แอปเสียงจะป้องกัน กับแอปอื่นๆ ไม่ให้บันทึกเนื้อหาที่เล่น

วิธีจัดการโทเค็น MediaProjection

MediaProjection API อนุญาตให้แอปรับโทเค็น MediaProjection ที่ให้สิทธิ์เข้าถึงแบบครั้งเดียว เพื่อบันทึกเนื้อหาบนหน้าจอหรือเสียง ระบบปฏิบัติการ Android จะถามผู้ใช้เกี่ยวกับ ก่อนให้สิทธิ์โทเค็นกับแอปของคุณ

ระบบปฏิบัติการจะแสดงโทเค็น MediaProjection ที่ใช้งานอยู่ใน UI การตั้งค่าด่วน และ ทำให้ผู้ใช้ถอนสิทธิ์การเข้าถึงโทเค็นได้ทุกเมื่อ เมื่อเกิดกรณีนี้ขึ้น จอแสดงผลเสมือนหรือสตรีมเสียงที่เชื่อมโยงกับเซสชันจะหยุดรับ สตรีมสื่อ แอปของคุณต้องตอบสนองอย่างเหมาะสม ไม่เช่นนั้นจะดําเนินการต่อ เพื่อบันทึกการปิดเสียง หรือสตรีมวิดีโอสีดำ

ลงทะเบียนการติดต่อกลับใน MediaProjection เพื่อจัดการกับการสูญเสียโทเค็น โดยใช้เมธอด registerCallback และหยุดบันทึกเมื่อ onStop เมธอด

สำหรับข้อมูลเพิ่มเติม โปรดดูการฉายภาพสื่อ

จับภาพวิดีโอ

โปรดดู แอปตัวอย่างจับภาพหน้าจอ เพื่อเรียนรู้วิธีใช้ Media Projection API เพื่อจับภาพ หน้าจอแบบเรียลไทม์และแสดงบน SurfaceView

คุณสามารถใช้DevicePolicyManager เพื่อป้องกันการบันทึกหน้าจอ สำหรับบัญชีองค์กร (Android for Work) ผู้ดูแลระบบสามารถปิดใช้การรวบรวมข้อมูล Assistant สำหรับโปรไฟล์งาน โดยใช้เมธอด setScreenCaptureDisabled

Codelab การจัดการอุปกรณ์ Android โดยไม่ใช้แอป แสดงวิธีห้ามไม่ให้จับภาพหน้าจอ

บันทึกการเล่นเสียง

AudioPlayCapture API เปิดตัวใน Android 10 API นี้ ทำให้แอปสามารถคัดลอกเสียงที่แอปอื่นเล่นอยู่ได้ ช่วงเวลานี้ ฟีเจอร์นี้คล้ายกับการจับภาพหน้าจอ แต่สำหรับเสียง กรณีการใช้งานหลักคือ สำหรับแอปสตรีมมิงที่ต้องการบันทึกเสียงที่เกมเล่น

โปรดทราบว่า AudioPlaybackCapture API ไม่ส่งผลต่อเวลาในการตอบสนองของแอปที่มีเสียง และถูกจับภาพไว้

การสร้างแอปจับภาพ

การบันทึกการเล่นกำหนดข้อจำกัดบางประการเพื่อความปลอดภัยและความเป็นส่วนตัว แอปต้องเป็นไปตามข้อกำหนดต่อไปนี้จึงจะบันทึกเสียงได้

  • แอปต้องมีส่วนเสริม RECORD_AUDIO สิทธิ์
  • แอปพลิเคชันต้องเปิดข้อความแจ้งที่แสดงโดย MediaProjectionManager.createScreenCaptureIntent() และผู้ใช้ต้องอนุมัติ
  • แอปจับภาพและการเล่นต้องอยู่ในโปรไฟล์ผู้ใช้เดียวกัน

หากต้องการบันทึกเสียงจากแอปอื่น แอปของคุณต้องสร้าง ออบเจ็กต์ AudioRecord รายการ และเพิ่ม AudioPlaybackCaptureConfiguration กับโมเดลนั้น โปรดทำตามขั้นตอนต่อไปนี้

  1. โทร AudioPlaybackCaptureConfiguration.Builder.build() เพื่อสร้าง AudioPlaybackCaptureConfiguration
  2. ส่งการกำหนดค่าไปยัง AudioRecord โดยการเรียกใช้ setAudioPlaybackCaptureConfig

การควบคุมการบันทึกเสียง

แอปของคุณควบคุมประเภทเนื้อหาที่บันทึกได้ รวมถึงเนื้อหาอื่นๆ แอปประเภทใดบ้างที่บันทึกการเล่นของตัวเองได้

การจำกัดการบันทึกตามเนื้อหาเสียง

แอปสามารถจำกัดเสียงที่บันทึกได้โดยใช้ วิธีการ:

  • ผ่านAUDIO_USAGEไปที่ AudioPlaybackCaptureConfiguration.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 คอมโพเนนต์ต่างๆ ของระบบสามารถบันทึกการเล่นได้โดยค่าเริ่มต้น คอมโพเนนต์จำนวนมากเหล่านี้ได้รับการปรับแต่งโดยผู้ให้บริการ 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 และ นโยบายที่มีผลบังคับใช้:

อนุญาตให้เล่นเสียงบันทึก ALLOW_CAPTURE_BY_ทั้งหมด ALLOW_CAPTURE_BY_ระบบ ALLOW_CAPTURE_BY_NONE
จริง แอปใดก็ได้ ระบบเท่านั้น ไม่มีการจับภาพ
เท็จ ระบบเท่านั้น ระบบเท่านั้น ไม่มีการจับภาพ