אפליקציה יכולה להקליט את הסרטון או האודיו שמופעלים מאפליקציה אחרת. אפליקציות כאלה צריכות לטפל באסימון MediaProjection בצורה נכונה. בדף הזה נסביר איך. בסרטון מוצג גם איך אדמין במכשיר יכול להשבית את האפשרות להקליט צילומי מסך, ואיך אפליקציית אודיו יכולה למנוע מאפליקציות אחרות להקליט את התוכן שהיא מפעילה.
איך מטפלים בטוקן MediaProjection
ממשק ה-API MediaProjection מאפשר לאפליקציות לקבל אסימון MediaProjection שמעניק להן גישה חד-פעמית לצילום תוכן מסך או אודיו. מערכת ההפעלה Android מבקשת מהמשתמשים את ההרשאה שלהם לפני שהיא מעניקה את האסימון לאפליקציה.
מערכת ההפעלה מציגה את אסימוני MediaProjection הפעילים בממשק המשתמש של ההגדרות המהירות, ומאפשרת למשתמשים לבטל את הגישה לאסימון בכל שלב. במקרה כזה, הצגים הווירטואליים או זרמי האודיו שמשויכים לסשן מפסיקים לקבל זרמי מדיה. האפליקציה צריכה להגיב בצורה מתאימה, אחרת היא תמשיך להקליט שקט או שידור וידאו שחור.
כדי לטפל במצב שבו אסימון אבד, צריך לרשום קריאה חוזרת במופע MediaProjection באמצעות ה-method registerCallback, ולהפסיק את ההקלטה כשמתבצעת קריאה ל-method onStop.
מידע נוסף זמין במאמר בנושא הקרנת מדיה.
צלם סרטון
אתם יכולים להשתמש ב-DevicePolicyManager
כדי למנוע הקלטת מסך. בחשבונות ארגוניים (Android for Work), האדמין יכול להשבית את איסוף הנתונים של העוזר הדיגיטלי בפרופיל העבודה באמצעות השיטה 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.Builder.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:allowAudioPlaybackCapture="true"בקובץmanifest.xmlשל האפליקציה. - אפשר גם להפעיל את הצילום בכל הנגנים באמצעות הקריאה ל-
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - אפשר להגדיר את המדיניות לשחקן ספציפי כשיוצרים אותו באמצעות
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (אם אתם משתמשים בשיחה ב-AAudioAAudioStreamBuilder_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 | מערכת בלבד | מערכת בלבד | ללא צילום |