אפליקציה יכולה להקליט את הסרטון או את האודיו שמושמעים מאפליקציה אחרת. כאלה
חייבים לטפל
אסימון MediaProjection
בצורה נכונה. בדף הזה נסביר איך עושים את זה. הוא מראה גם איך אדמין יכול להשבית את המכשיר
היכולת להקליט תמונות מסך, ואיך אפליקציית אודיו יכולה למנוע
לאפליקציות אחרות מהקלטת התוכן שהוא מופעל.
איך לטפל באסימון MediaProjection
ה-API של MediaProjection
מאפשר לאפליקציות לקבל אסימון MediaProjection
שמעניק להן גישה חד-פעמית לצילום תוכן המסך או אודיו. מערכת Android OS מבקשת מהמשתמש
הרשאה לפני שמעניקים את האסימון לאפליקציה.
מערכת ההפעלה מציגה את האסימונים הפעילים של MediaProjection
בממשק המשתמש של ההגדרות המהירות,
שמאפשר למשתמשים לבטל את הגישה לאסימון בכל שלב. במקרה כזה,
מסכים וירטואליים או שידורי אודיו שמשויכים לסשן יפסיקו לקבל
סטרימינג של מדיה. האפליקציה צריכה להגיב בצורה מתאימה, אחרת היא תמשיך להקליט דממה או שידור וידאו שחור.
כדי להתמודד עם אובדן אסימון, עליך לרשום קריאה חוזרת (callback) ב-MediaProjection
באמצעות הפונקציה
registerCallback
ולהפסיק את ההקלטה כאשר
onStop
נקראת.
מידע נוסף זמין במאמר הקרנת מדיה.
צילום סרטון
לצפייה אפליקציה לדוגמה של צילום מסך ללמוד איך משתמשים בממשק ה-API של Media Projection כדי לתעד במסך בזמן אמת ולהציג אותו ב-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() כדי לאפשר תיעוד של שימוש ספציפי. קוראים ל-method מספר פעמים כדי לציין יותר משימוש אחד. - מעבירים ערך של
AUDIO_USAGE
אל AudioPlaybackCaptureConfiguration.ExcludeUsage() אל ואסור לתעד את השימוש הזה. כדי לציין יותר משימוש אחד, צריך להפעיל את השיטה כמה פעמים. - העברת UID אל AudioPlaybackCaptureConfiguration.addMatchingUid() כדי לתעד רק אפליקציות עם UID ספציפי. כדי לציין יותר מ-UID אחד, צריך להפעיל את השיטה כמה פעמים.
- מעבירים מזהה UID ל-AudioPlaybackCaptureConfiguration.excludeUid() כדי לאסור את הצילום של המזהה הייחודי הזה. קוראים לשיטה כמה פעמים כדי לציין יותר מ-UID אחד.
לתשומת ליבך: לא ניתן להשתמש בשיטות 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
מאחר שאפשר לציין את מדיניות הצילום בכמה מקומות, חשוב להבין איך נקבעת המדיניות היעילה.
המערכת תמיד מחילה את מדיניות הצילום המגבילה ביותר. לדוגמה, אפליקציה
המניפסט כולל setAllowedCapturePolicy="false"
לעולם לא יתיר קבצים שאינם מערכת
אפליקציות להקליט את האודיו שלו, גם אם AudioManager#setAllowedCapturePolicy
מוגדר
אל ALLOW_CAPTURE_BY_ALL
. באופן דומה, אם
הערך AudioManager#setAllowedCapturePolicy
מוגדר ל-ALLOW_CAPTURE_BY_ALL
המניפסט מגדיר את setAllowedCapturePolicy="true"
, אבל
AudioAttributes
פותחו עם
AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, לאחר מכן
אפליקציות שאינן של המערכת לא יוכלו לפענח את נגן המדיה הזה.
הטבלה הבאה מסכמת את ההשפעה של מאפיין המניפסט המדיניות שנמצאת בתוקף:
allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
true | כל אפליקציה | מערכת בלבד | ללא תיעוד |
false | מערכת בלבד | מערכת בלבד | ללא תיעוד |