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