תיעוד הפעלה של וידאו ואודיו

אפליקציה יכולה להקליט את הווידאו או האודיו שמופעלים מאפליקציה אחרת. אפליקציות כאלה צריכות לטפל באסימון MediaProjection בצורה נכונה. בדף הזה נסביר איך. בנוסף, מוסבר איך מנהל מכשיר יכול להשבית את האפשרות להקליט צילומי מסך, ואיך אפליקציית אודיו יכולה למנוע מאפליקציות אחרות להקליט את התוכן שהיא מפעילה.

איך מטפלים בטוקן MediaProjection

MediaProjection API מאפשר לאפליקציות לקבל אסימון MediaProjection שנותן להן גישה חד-פעמית לצילום תוכן מסך או אודיו. מערכת ההפעלה Android מבקשת מהמשתמש את ההרשאה שלו לפני שהיא מעניקה את האסימון לאפליקציה.

מערכת ההפעלה מציגה את אסימוני MediaProjection הפעילים בממשק המשתמש של ההגדרות המהירות, ומאפשרת למשתמשים לבטל את הגישה לאסימון בכל שלב. במצב כזה, הצגים הווירטואליים או זרמי האודיו שמשויכים לסשן מפסיקים לקבל זרמי מדיה. האפליקציה צריכה להגיב בצורה מתאימה, אחרת היא תמשיך להקליט שקט באודיו או שידור וידאו שחור.

כדי לטפל במצב שבו אסימון אבד, צריך לרשום קריאה חוזרת במופע MediaProjection באמצעות ה-method‏ registerCallback, ולהפסיק את ההקלטה כשמתבצעת קריאה ל-method‏ onStop.

מידע נוסף זמין במאמר בנושא הקרנת מדיה.

צילום סרטון

באפליקציה לדוגמה ScreenCapture מוסבר איך להשתמש ב-Media Projection API כדי לצלם את המסך של מכשיר בזמן אמת ולהציג אותו ב-SurfaceView.

אתם יכולים להשתמש ב-DevicePolicyManager כדי למנוע הקלטת מסך. בחשבונות ארגוניים (Android for Work), האדמין יכול להשבית את איסוף הנתונים של העוזר הדיגיטלי בפרופיל העבודה באמצעות השיטה setScreenCaptureDisabled.

בשיעור התכנות ניהול מכשירי Android ללא אפליקציה מוסבר איך לאסור צילומי מסך.

קליטת הפעלת אודיו

AudioPlaybackCapture API הושק ב-Android 10. ממשק ה-API הזה מאפשר לאפליקציות להעתיק את האודיו שמופעל באפליקציות אחרות. התכונה הזו מקבילה לצילום מסך, אבל היא מיועדת לאודיו. תרחיש השימוש העיקרי הוא באפליקציות סטרימינג שרוצות ללכוד את האודיו שמופעל במשחקים.

הערה: ממשק ה-API‏ AudioPlaybackCapture לא משפיע על זמן האחזור של האפליקציה שהאודיו שלה נלכד.

פיתוח אפליקציה ללכידת נתונים

מטעמי אבטחה ופרטיות, יש כמה מגבלות על צילום ההפעלה. כדי שאפליקציה תוכל לצלם אודיו, היא צריכה לעמוד בדרישות הבאות:

  • לאפליקציה צריכה להיות ההרשאה RECORD_AUDIO.
  • האפליקציה צריכה להציג את ההודעה שמוצגת על ידי MediaProjectionManager.createScreenCaptureIntent(), והמשתמש צריך לאשר אותה.
  • אפליקציות הצילום וההפעלה צריכות להיות באותו פרופיל משתמש.

כדי ללכוד אודיו מאפליקציה אחרת, האפליקציה שלכם צריכה ליצור אובייקט AudioRecord ולהוסיף לו אובייקט AudioPlaybackCaptureConfiguration. בצע את השלבים הבאים:

  1. מתקשרים אל AudioPlaybackCaptureConfiguration.Builder.build() כדי ליצור AudioPlaybackCaptureConfiguration.
  2. מעבירים את ההגדרה אל AudioRecord על ידי קריאה ל-setAudioPlaybackCaptureConfig.

שליטה בהקלטת אודיו

האפליקציה יכולה לשלוט בסוגי התוכן שהיא יכולה להקליט, ובסוגים אחרים של אפליקציות שיכולות להקליט את ההפעלה שלה.

הגבלת הצילום לפי תוכן האודיו

אפליקציה יכולה להגביל את האודיו שהיא יכולה ללכוד באמצעות השיטות הבאות:

  • מעבירים AUDIO_USAGE אל AudioPlaybackCaptureConfiguration.addMatchingUsage() כדי לאפשר צילום של שימוש ספציפי. מבצעים קריאה לשיטה כמה פעמים כדי לציין יותר משימוש אחד.
  • מעבירים AUDIO_USAGE אל AudioPlaybackCaptureConfiguration.excludeUsage()‎ כדי למנוע את התיעוד של השימוש הזה. מבצעים קריאה לשיטה כמה פעמים כדי לציין יותר משימוש אחד.
  • מעבירים מזהה ייחודי (UID) אל AudioPlaybackCaptureConfiguration.addMatchingUid() כדי ללכוד רק אפליקציות עם מזהה ייחודי ספציפי. מבצעים קריאה לשיטה כמה פעמים כדי לציין יותר מ-UID אחד.
  • מעבירים מזהה ייחודי (UID) אל AudioPlaybackCaptureConfiguration.excludeUid()‎ כדי למנוע את הלכידה של המזהה הייחודי הזה. מבצעים קריאה לשיטה כמה פעמים כדי לציין יותר מ-UID אחד.

שימו לב שאי אפשר להשתמש בשיטות addMatchingUsage() ו-excludeUsage() ביחד. צריך לבחור באחת מהאפשרויות. באופן דומה, אי אפשר להשתמש ב-addMatchingUid() וב-excludeUid() בו-זמנית.

הגבלת הצילום על ידי אפליקציות אחרות

אתם יכולים להגדיר אפליקציה כך שאפליקציות אחרות לא יוכלו לצלם את האודיו שלה. אפשר ללכוד אודיו שמגיע מאפליקציה רק אם האפליקציה עומדת בדרישות הבאות:

שימוש

צריך להגדיר את השימוש בנגן שמפיק את האודיו לערך USAGE_MEDIA,‏ USAGE_GAME או USAGE_UNKNOWN.

מדיניות צילום

מדיניות הצילום של הנגן צריכה להיות AudioAttributes.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 מערכת בלבד מערכת בלבד לא מתבצע צילום