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

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

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

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

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

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

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

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

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

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

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