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

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

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

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

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

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

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

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

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

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

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

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

AudioPlaybackCapture 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_SYSTEM ALLOW_CAPTURE_BY_NONE
จริง แอปใดก็ได้ ระบบเท่านั้น ไม่มีภาพ
เท็จ ระบบเท่านั้น ระบบเท่านั้น ไม่มีการจับภาพ