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