แอปสามารถบันทึกวิดีโอหรือเสียงที่เล่นจากแอปอื่นได้ โดยแอปดังกล่าวต้องจัดการโทเค็น MediaProjection
อย่างถูกต้อง หน้านี้จะอธิบายวิธี นอกจากนี้ ยังแสดงให้เห็นวิธีที่ผู้ดูแลระบบของอุปกรณ์ปิดใช้ความสามารถในการบันทึกภาพหน้าจอ และวิธีที่แอปเสียงสามารถป้องกันไม่ให้แอปอื่นๆ บันทึกเนื้อหาที่เล่น
วิธีจัดการโทเค็น MediaProjection
MediaProjection
API ช่วยให้คุณรับโทเค็น MediaProjection
ที่ให้สิทธิ์เข้าถึงแบบครั้งเดียวเพื่อบันทึกเนื้อหาบนหน้าจอหรือเสียง ระบบปฏิบัติการ Android จะขอสิทธิ์จากผู้ใช้ก่อนที่จะให้โทเค็นแก่แอปของคุณ
ระบบปฏิบัติการจะแสดงโทเค็น MediaProjection
ที่ใช้งานอยู่ใน UI การตั้งค่าด่วน และอนุญาตให้ผู้ใช้ถอนสิทธิ์เข้าถึงโทเค็นได้ทุกเมื่อ เมื่อเกิดกรณีนี้ขึ้น จอแสดงผลเสมือนจริงหรือสตรีมเสียงที่เชื่อมโยงกับเซสชันจะหยุดรับสตรีมสื่อ แอปของคุณต้องตอบสนองอย่างเหมาะสม มิเช่นนั้นแอปจะบันทึกเสียงที่เงียบหรือสตรีมวิดีโอสีดําต่อไป
หากต้องการจัดการกับการสูญเสียโทเค็น ให้ลงทะเบียนการเรียกกลับในอินสแตนซ์ MediaProjection
ใช้เมธอด registerCallback
และหยุดบันทึกเมื่อมีการเรียกใช้เมธอด onStop
ดูข้อมูลเพิ่มเติมได้ที่การฉายสื่อ
จับภาพวิดีโอ
ดูวิธีใช้ Media Projection API เพื่อจับภาพหน้าจอของอุปกรณ์แบบเรียลไทม์และแสดงบน SurfaceView ได้จากตัวอย่างแอป ScreenCapture
คุณสามารถใช้ DevicePolicyManager
เพื่อป้องกันการบันทึกหน้าจอ สำหรับบัญชีองค์กร (Android for Work) ผู้ดูแลระบบสามารถปิดใช้การเก็บรวบรวมข้อมูลผู้ช่วยสำหรับโปรไฟล์งานได้โดยใช้เมธอด setScreenCaptureDisabled
โค้ดแล็บการจัดการอุปกรณ์ Android โดยไม่ต้องใช้แอปจะแสดงวิธีห้ามไม่ให้ถ่ายภาพหน้าจอ
บันทึกการเล่นเสียง
AudioPlaybackCapture API เปิดตัวใน Android 10 API นี้ช่วยให้แอปคัดลอกเสียงที่เล่นโดยแอปอื่นๆ ได้ ฟีเจอร์นี้เทียบเท่ากับการจับภาพหน้าจอสำหรับเสียง กรณีการใช้งานหลักคือสําหรับแอปสตรีมมิงที่ต้องการบันทึกเสียงที่เกมเล่น
โปรดทราบว่า AudioPlaybackCapture API จะไม่ส่งผลต่อเวลาในการตอบสนองของแอปที่กำลังบันทึกเสียง
การสร้างแอปการจับภาพ
การบันทึกการเล่นมีข้อจำกัดบางอย่างเพื่อรักษาความปลอดภัยและความเป็นส่วนตัว แอปต้องเป็นไปตามข้อกำหนดต่อไปนี้จึงจะบันทึกเสียงได้
- แอปต้องมีสิทธิ์
RECORD_AUDIO
- แอปต้องแสดงข้อความแจ้งที่แสดงโดย
MediaProjectionManager.createScreenCaptureIntent()
และผู้ใช้ต้องอนุมัติ - แอปจับภาพและเล่นต้องอยู่ในโปรไฟล์ผู้ใช้เดียวกัน
หากต้องการบันทึกเสียงจากแอปอื่น แอปของคุณต้องสร้างออบเจ็กต์ AudioRecord
และเพิ่มออบเจ็กต์ AudioPlaybackCaptureConfiguration
เข้าไป โปรดทำตามขั้นตอนต่อไปนี้
- โทรหา
AudioPlaybackCaptureConfiguration.Builder.build()
เพื่อสร้างAudioPlaybackCaptureConfiguration
- ส่งการกำหนดค่าไปยัง
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:allowAudioPlaybackCapture="true"
ในไฟล์manifest.xml
ของแอป - นอกจากนี้ คุณยังเปิดใช้การบันทึกในผู้เล่นทั้งหมดได้โดยเรียกใช้
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
- คุณสามารถตั้งค่านโยบายในเพลเยอร์แต่ละรายการเมื่อสร้างโดยใช้
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
(หากใช้AAudio
ให้โทรไปที่AAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_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 |
---|---|---|---|
จริง | แอปใดก็ได้ | ระบบเท่านั้น | ไม่มีภาพ |
เท็จ | ระบบเท่านั้น | ระบบเท่านั้น | ไม่มีภาพ |