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