אפליקציה יכולה להקליט את הווידאו או האודיו שמופעלים מאפליקציה אחרת. אפליקציות כאלה צריכות לטפל באסימון MediaProjection
בצורה נכונה. בדף הזה נסביר איך: בנוסף, הוא מראה איך מנהל מכשיר יכול להשבית את האפשרות להקליט צילומי מסך, ואיך אפליקציית אודיו יכולה למנוע מאפליקציות אחרות להקליט את התוכן שהיא מפעילה.
איך מטפלים בטוקן של MediaProjection
API MediaProjection
מאפשר לאפליקציות לקבל אסימון MediaProjection
שמעניק להן גישה חד-פעמית לצילום תוכן מסך או אודיו. מערכת ההפעלה Android מבקשת מהמשתמש את ההרשאה שלו לפני שהיא מעניקה את האסימון לאפליקציה.
מערכת ההפעלה מציגה את אסימוני MediaProjection
הפעילים בממשק המשתמש של ההגדרות המהירות, ומאפשרת למשתמשים לבטל את הגישה לאסימון בכל שלב. במצב כזה, הצגים הווירטואליים או זרמי האודיו שמשויכים לסשן מפסיקים לקבל זרמי מדיה. האפליקציה צריכה להגיב בצורה מתאימה, אחרת היא תמשיך להקליט שקט באודיו או שידור וידאו שחור.
כדי לטפל במצב של אובדן טוקן, צריך לרשום קריאה חוזרת (callback) במופע MediaProjection
באמצעות השיטה registerCallback
, ולהפסיק את ההקלטה כשמתבצעת קריאה לשיטה onStop
.
מידע נוסף זמין במאמר בנושא הקרנת מדיה.
צילום סרטון
כדי ללמוד איך להשתמש ב-Media Projection API כדי לצלם את המסך של מכשיר בזמן אמת ולהציג אותו ב-SurfaceView, אפשר לעיין באפליקציית הדוגמה ScreenCapture.
אפשר להשתמש בDevicePolicyManager
כדי למנוע הקלטת מסך. בחשבונות ארגוניים (Android for Work), האדמין יכול להשבית את איסוף הנתונים של העוזר הדיגיטלי בפרופיל העבודה באמצעות השיטה setScreenCaptureDisabled.
ב-codelab Managing Android Devices Without an App מוסבר איך לאסור צילומי מסך.
הקלטת השמע
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 ספציפי. מפעילים את ה-method כמה פעמים כדי לציין יותר מ-UID אחד.
- מעבירים UID אל AudioPlaybackCaptureConfiguration.excludeUid() כדי למנוע את הלכידה של ה-UID הזה. מפעילים את ה-method כמה פעמים כדי לציין יותר מ-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 כשמבצעים קריאה לשיטה, האודיו לא מושפע. כדי שהשינוי במדיניות ייכנס לתוקף, צריך לסגור את הנגן או את הרצועה ולפתוח אותם מחדש.
מדיניות = מניפסט + 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 | מערכת בלבד | מערכת בלבד | לא מתבצע צילום |