אפליקציה יכולה להקליט את הסרטון או האודיו שמתנגנים מאפליקציה אחרת. אפליקציות כאלה צריכות לטפל בצורה נכונה באסימון MediaProjection
. בדף הזה נסביר איך. בנוסף, מוסבר איך אדמין של מכשיר יכול להשבית את היכולת להקליט צילומי מסך, ואיך אפליקציית אודיו יכולה למנוע מאפליקציות אחרות להקליט את התוכן שהיא מפעילה.
איך מטפלים בטוקן MediaProjection
ה-API של MediaProjection
מאפשר לאפליקציות לקבל אסימון MediaProjection
שמעניק להן גישה חד-פעמית לצילום תוכן המסך או האודיו. מערכת ההפעלה של Android מבקשת מהמשתמש הרשאה לפני שהיא מעניקה את האסימון לאפליקציה.
אסימוני MediaProjection
פעילים מוצגים בממשק המשתמש של ההגדרות המהירות במערכת ההפעלה, ומאפשרים למשתמשים לבטל את הגישה לאסימון בכל שלב. במקרה כזה, המסכים הווירטואליים או שידורי האודיו המשויכים לסשן יפסיקו לקבל שידורי מדיה. האפליקציה צריכה להגיב בצורה מתאימה, אחרת היא תמשיך להקליט דממה או שידור וידאו שחור.
כדי לטפל באובדן אסימון, צריך לרשום קריאה חוזרת (callback) במכונה MediaProjection
באמצעות השיטה registerCallback
ולהפסיק את ההקלטה כשמתבצעת קריאה לשיטה onStop
.
מידע נוסף זמין במאמר הקרנת מדיה.
צילום סרטון
באפליקציית הדוגמה ScreenCapture מוסבר איך משתמשים ב-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() כדי לאפשר תיעוד של שימוש ספציפי. כדי לציין יותר משימוש אחד, צריך להפעיל את השיטה כמה פעמים. - כדי לאסור את הצילום של השימוש הזה, מעבירים את הערך
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 | מערכת בלבד | מערכת בלבד | ללא תיעוד |