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

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

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

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

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

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

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

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

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

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

โค้ดแล็บการจัดการอุปกรณ์ 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 และนโยบายที่มีผล

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
จริง แอปใดก็ได้ ระบบเท่านั้น ไม่มีการจับภาพ
เท็จ ระบบเท่านั้น ระบบเท่านั้น ไม่มีการจับภาพ