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

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

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

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

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

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

ดูข้อมูลเพิ่มเติมได้ที่การฉายภาพสื่อ

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

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

Codelab การจัดการอุปกรณ์ 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.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 สามารถบันทึกการเล่นได้โดยค่าเริ่มต้น ผู้ให้บริการ Android ปรับแต่งคอมโพเนนต์เหล่านี้หลายอย่างและรองรับฟีเจอร์ต่างๆ เช่น การช่วยเหลือพิเศษและคำบรรยายแทนเสียง ด้วยเหตุนี้ เราจึงขอแนะนำให้แอป อนุญาตให้ระบบบันทึกการเล่น ในกรณีที่พบได้ยากซึ่งคุณไม่ต้องการให้ระบบบันทึกการเล่นของแอป ให้ตั้งค่านโยบายการบันทึกเป็น ALLOW_CAPTURE_BY_NONE

การตั้งค่านโยบายที่รันไทม์

คุณเรียกใช้ AudioManager.setAllowedCapturePolicy() เพื่อเปลี่ยนนโยบาย การจับภาพขณะที่แอปกำลังทำงานได้ หาก MediaPlayer หรือ AudioTrack กำลังเล่นอยู่ เมื่อคุณเรียกใช้เมธอด เสียงจะไม่ได้รับผลกระทบ คุณต้องปิดและเปิด เพลเยอร์หรือแทร็กอีกครั้งเพื่อให้การเปลี่ยนแปลงนโยบายมีผล

นโยบาย = ไฟล์ Manifest + AudioManager + AudioAttributes

เนื่องจากสามารถระบุนโยบายการจับภาพได้หลายที่ คุณจึงควรทำความเข้าใจวิธีพิจารณานโยบายที่มีผลบังคับใช้ ระบบจะใช้นโยบายการจับภาพที่มีข้อจำกัดมากที่สุดเสมอ เช่น แอปที่มี setAllowedCapturePolicy="false" ใน Manifest จะไม่อนุญาตให้แอปที่ไม่ใช่ระบบ บันทึกเสียงของแอป แม้ว่าจะตั้งค่า 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 แอปใดก็ได้ ระบบเท่านั้น ไม่มีการจับภาพ
เท็จ ระบบเท่านั้น ระบบเท่านั้น ไม่มีการจับภาพ