החומרה של הטלוויזיה שונה באופן משמעותי ממכשירי Android אחרים. בטלוויזיות אין חלק מתכונות החומרה שקיימות במכשירי Android אחרים, כמו מסכי מגע, מצלמות ומקלטי GPS. בנוסף, טלוויזיות תלויות לחלוטין במכשירי חומרה משניים: כדי שהמשתמשים יוכלו להשתמש באפליקציות לטלוויזיה, הם צריכים להשתמש בשלט רחוק או בבקר משחקים. (במאמר ניהול של בקרי טלוויזיה מוסבר על שיטות קלט שונות).
כשמפתחים אפליקציה לטלוויזיה, חשוב לשקול היטב את מגבלות החומרה ואת הדרישות להפעלה בחומרת טלוויזיה. בודקים אם האפליקציה פועלת בטלוויזיה ומטפלים בתכונות חומרה שלא נתמכות.
חיפוש מכשיר טלוויזיה
אם אתם מפתחים אפליקציה שפועלת גם במכשירי טלוויזיה וגם במכשירים אחרים, יכול להיות שתצטרכו לבדוק באיזה סוג מכשיר האפליקציה פועלת ולשנות את הפעולה שלה. לדוגמה, אם יש לכם אפליקציה שאפשר להפעיל באמצעות Intent, בדקו את מאפייני המכשיר כדי לקבוע אם להפעיל פעילות שמותאמת לטלוויזיה או פעילות שמותאמת לטלפון.
הדרך המומלצת לקבוע אם האפליקציה פועלת במכשיר טלוויזיה היא להשתמש ב-PackageManager.hasSystemFeature כדי לבדוק אם המכשיר פועל במצב טלוויזיה. הקוד לדוגמה הבא מראה איך לבדוק אם האפליקציה פועלת במכשיר טלוויזיה:
Kotlin
const val TAG = "DeviceTypeRuntimeCheck" val isTelevision = packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK) if (isTelevision) { Log.d(TAG, "Running on a TV Device") } else { Log.d(TAG, "Running on a non-TV Device") }
Java
public static final String TAG = "DeviceTypeRuntimeCheck"; boolean isTelevision = getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK); if (isTelevision) { Log.d(TAG, "Running on a TV Device"); } else { Log.d(TAG, "Running on a non-TV Device"); }
טיפול בתכונות חומרה שלא נתמכות
בהתאם לעיצוב ולפונקציונליות של האפליקציה, יכול להיות שתוכלו לעקוף את חוסר הזמינות של תכונות חומרה מסוימות. בקטע הזה נסביר אילו תכונות חומרה בדרך כלל לא זמינות בטלוויזיה, איך לזהות תכונות חומרה חסרות ואילו חלופות מוצעות לתכונות האלה.
תכונות חומרה לא נתמכות בטלוויזיה
לטלוויזיות יש מטרה שונה ממכשירים אחרים, ולכן אין להן תכונות חומרה שלמכשירים אחרים עם Android יש לעיתים קרובות. לכן, מערכת Android לא תומכת בתכונות הבאות במכשירי טלוויזיה:
| חומרה | תיאור התכונה ב-Android |
|---|---|
| מסך מגע | android.hardware.touchscreen |
| אמולטור של מסך מגע | android.hardware.faketouch |
| טלפוניה | android.hardware.telephony |
| מצלמה | android.hardware.camera |
| תקשורת מטווח קצר (NFC) | android.hardware.nfc |
| GPS | android.hardware.location.gps |
| מיקרופון | android.hardware.microphone |
| חיישנים | android.hardware.sensor |
| מסך בכיוון לאורך | android.hardware.screen.portrait |
הערה: בחלק מהשלטים של הטלוויזיה יש מיקרופון, אבל הוא לא זהה לתכונת החומרה של המיקרופון שמתוארת כאן. יש תמיכה מלאה במיקרופון של הבקר.
רשימה מלאה של תכונות, תכונות משנה והתיאורים שלהן מופיעה ב חומר העזר בנושא תכונות.
הצהרה על דרישות החומרה לטלוויזיה
אפליקציות ל-Android יכולות להצהיר על דרישות לתכונות חומרה בקובץ המניפסט של האפליקציה, כדי לוודא שהן לא יותקנו במכשירים שלא מספקים את התכונות האלה. אם אתם מרחיבים אפליקציה קיימת לשימוש בטלוויזיה, בדקו היטב את המניפסט של האפליקציה כדי לראות אם יש הצהרות על דרישות חומרה שעשויות למנוע את ההתקנה שלה במכשיר טלוויזיה.
אם האפליקציה משתמשת בתכונות חומרה כמו מסך מגע או מצלמה שלא זמינות בטלוויזיה, אבל היא יכולה לפעול בלי להשתמש בתכונות האלה, צריך לשנות את המניפסט של האפליקציה כדי לציין שהתכונות האלה לא נדרשות. קטע הקוד הבא במניפסט מדגים איך להצהיר שהאפליקציה לא דורשת תכונות חומרה שלא זמינות במכשירי טלוויזיה, אבל משתמשת בתכונות האלה במכשירים שהם לא טלוויזיה:
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/> <uses-feature android:name="android.hardware.faketouch" android:required="false"/> <uses-feature android:name="android.hardware.telephony" android:required="false"/> <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-feature android:name="android.hardware.nfc" android:required="false"/> <uses-feature android:name="android.hardware.location.gps" android:required="false"/> <uses-feature android:name="android.hardware.microphone" android:required="false"/> <uses-feature android:name="android.hardware.sensor" android:required="false"/> <!-- Some TV devices have an ethernet connection only --> <uses-feature android:name="android.hardware.wifi" android:required="false"/>
הערה: לחלק מהתכונות יש תכונות משנה, כמו android.hardware.camera.front, כפי שמתואר ב
מאמר העזר בנושא תכונות. חשוב לסמן גם את כל תכונות המשנה שבהן נעשה שימוש באפליקציה בתור required="false".
בכל האפליקציות שמיועדות לשימוש במכשירי טלוויזיה צריך להצהיר שלא נדרשת תכונת מסך המגע, כמו שמתואר במאמר תחילת העבודה עם אפליקציות לטלוויזיה. אם האפליקציה שלכם משתמשת בדרך כלל באחת או יותר מהתכונות שלא נתמכות במכשירי טלוויזיה, צריך לשנות את הגדרת המאפיין android:required ל-false עבור התכונות האלה בקובץ המניפסט.
זהירות: אם מגדירים תכונת חומרה כנדרשת על ידי הגדרת הערך שלה ל-true, האפליקציה לא תוכל להיות מותקנת במכשירי טלוויזיה או להופיע במרכז האפליקציות במסך הבית של Android TV.
שימו לב להרשאות שמרמזות על תכונות חומרה
חלק מההצהרות במניפסט של uses-permission מרמזות על תכונות חומרה. המשמעות של ההתנהגות הזו היא שאם תבקשו הרשאות מסוימות בקובץ המניפסט של האפליקציה, יכול להיות שהאפליקציה לא תותקן ולא תפעל במכשירי טלוויזיה. ההרשאות הנפוצות הבאות יוצרות דרישה משתמעת לתכונת חומרה:
| הרשאה | תכונת חומרה משתמעת |
|---|---|
RECORD_AUDIO |
android.hardware.microphone |
CAMERA |
android.hardware.camera וגם android.hardware.camera.autofocus |
ACCESS_COARSE_LOCATION |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATECHANGE_WIFI_STATE
|
בחלק מהטלוויזיות יש רק חיבור אתרנט. |
רשימה מלאה של בקשות הרשאה שמרמזות על דרישה לתכונת חומרה מופיעה במדריך uses-feature. אם האפליקציה מבקשת אחת מהתכונות שצוינו למעלה, צריך לכלול הצהרת
uses-feature
במניפסט של תכונת החומרה המשתמעת, שמציינת שהיא לא
נדרשת. android:required="false".
הערה: אם האפליקציה מטרגטת את Android 5.0 (רמת API 21) ומעלה ומשתמשת בהרשאה ACCESS_COARSE_LOCATION או ACCESS_FINE_LOCATION, המשתמשים עדיין יכולים להתקין את האפליקציה בטלוויזיה, גם אם אין בה כרטיס רשת או מקלט GPS.
אחרי שמגדירים את תכונות החומרה כאופציונליות באפליקציה, צריך לבדוק אם התכונות האלה זמינות בזמן הריצה, ואז לשנות את ההתנהגות של האפליקציה. בקטע הבא מוסבר איך לבדוק את תכונות החומרה ומוצעות כמה גישות לשינוי ההתנהגות של האפליקציה.
מידע נוסף על סינון והצהרה על תכונות במניפסט זמין במדריך uses-feature.
בדיקת תכונות החומרה
מסגרת Android יכולה להודיע לכם אם תכונות חומרה לא זמינות במכשיר שבו האפליקציה פועלת. אפשר להשתמש ב-method hasSystemFeature(String) כדי לבדוק תכונות ספציפיות בזמן הריצה. השיטה הזו מקבלת ארגומנט מחרוזת יחיד שמציין את התכונה שרוצים לבדוק.
דוגמת הקוד הבאה ממחישה איך לזהות את הזמינות של תכונות חומרה בזמן ריצה:
Kotlin
// Check whether the telephony hardware feature is available. if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { Log.d("HardwareFeatureTest", "Device can make phone calls") } // Check whether android.hardware.touchscreen feature is available. if (packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) { Log.d("HardwareFeatureTest", "Device has a touchscreen.") }
Java
// Check whether the telephony hardware feature is available. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { Log.d("HardwareFeatureTest", "Device can make phone calls"); } // Check whether android.hardware.touchscreen feature is available. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) { Log.d("HardwareFeatureTest", "Device has a touchscreen."); }
מסך מגע
לרוב מכשירי הטלוויזיה אין מסכי מגע או יכולות קלט של סמן, והם מסתמכים באופן מלא על שלטים רחוקים עם כפתורי חיצים (D-pad) לצורך ניווט. אפליקציות לטלוויזיה חייבות תמיד לתמוך בשלט רחוק עם כפתורי החיצים (D-pad).
מידע נוסף על תמיכה נכונה בניווט באמצעות פקדים שמתאימים לטלוויזיה זמין במאמר ניווט בטלוויזיה.
הצהרה על תמיכה במסך מגע
חלק ממכשירי הטלוויזיה תומכים בשלטים עם סמן ובמסכי מגע. האפליקציה יכולה לתמוך באינטראקציות של קליק, העברת העכבר מעל פריט וגלילה, כמו במכשיר נייד, כדי לספק חוויה טובה יותר במכשירים שתומכים בהן.
אם האפליקציה מאפשרת מצב מגע, אפשר להצהיר על תמיכה במגע לכל האפליקציה או לפעילויות ספציפיות על ידי הוספת הרכיב android.software.leanback.supports_touch
<property> שמוגדר לערך true בתוך הרכיב <application> או <activity> בקובץ AndroidManifest.xml:
<application ...> <property android:name="android.software.leanback.supports_touch" android:value="true|false" /> ... </application>
הערה: במכשירים שתומכים בשלט רחוק עם מצביע (כמו עכבר אוויר או משטח מגע), הפעלת ההגדרה הזו מפעילה את מצב הסמן והמגע במקום להסתמך על אמולציית תאימות לפלטפורמה. הצהרה ברמת הפעילות מבטלת את ההצהרה ברמת האפליקציה לגבי אותה פעילות. אם לא מציינים את המאפיין הזה, ברירת המחדל היא false.
מצלמה
למרות שבדרך כלל אין מצלמה בטלוויזיה, עדיין אפשר לספק אפליקציה שקשורה לצילום בטלוויזיה. לדוגמה, אם יש לכם אפליקציה שמאפשרת לצלם, להציג ולערוך תמונות, אתם יכולים להשבית את פונקציונליות הצילום בטלוויזיות, ועדיין לאפשר למשתמשים להציג ואפילו לערוך תמונות. אם אתם מחליטים להפעיל את האפליקציה שקשורה למצלמה בטלוויזיה, הוסיפו את הצהרת התכונה הבאה לקובץ מניפסט של אפליקציה:
<uses-feature android:name="android.hardware.camera" android:required="false" />
אם אתם מאפשרים לאפליקציה לפעול בלי מצלמה, הוסיפו לאפליקציה קוד שמזהה אם תכונת המצלמה זמינה ומבצע התאמות לפעולת האפליקציה. דוגמת הקוד הבאה מדגימה איך לזהות נוכחות של מצלמה:
Kotlin
// Check whether the camera hardware feature is available. if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) { Log.d("Camera test", "Camera available!") } else { Log.d("Camera test", "No camera available. View and edit features only.") }
Java
// Check whether the camera hardware feature is available. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { Log.d("Camera test", "Camera available!"); } else { Log.d("Camera test", "No camera available. View and edit features only."); }
GPS
טלוויזיות הן מכשירים נייחים שנמצאים בתוך מבנים, ואין בהן מקלטי GPS מובנים. אם האפליקציה שלכם משתמשת בנתוני מיקום, אתם עדיין יכולים לאפשר למשתמשים לחפש מיקום או להשתמש בספק מיקום סטטי, כמו מיקוד שהוגדר במהלך הגדרת מכשיר הטלוויזיה.
Kotlin
// Request a static location from the location manager. val locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager val location = locationManager.getLastKnownLocation("static") if (location == null) { Log.e(TAG, "Location is null") return } // Attempt to get postal code from the static location object. val geocoder = Geocoder(this) val address: Address? = try { geocoder.getFromLocation(location.latitude, location.longitude, 1)?.firstOrNull() ?.apply { Log.d(TAG, postalCode) } } catch (e: IOException) { Log.e(TAG, "Geocoder error", e) null }
Java
// Request a static location from the location manager. LocationManager locationManager = (LocationManager) this.getSystemService( Context.LOCATION_SERVICE); Location location = locationManager.getLastKnownLocation("static"); // Attempt to get postal code from the static location object. Geocoder geocoder = new Geocoder(this); Address address = null; try { address = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1).get(0); Log.d("Postal code", address.getPostalCode()); } catch (IOException e) { Log.e(TAG, "Geocoder error", e); }
השהיית ההפעלה במצב חיסכון בסוללה
חלק מהטלוויזיות תומכות במצב חיסכון בסוללה כשהמשתמש מכבה את המכשיר. במקום לכבות את המכשיר, הוא משבית את המסך ומשאיר את Android TV פועל ברקע. פלט האודיו עדיין פועל במצב הזה, אז צריך להפסיק את התוכן שמופעל כרגע כשהמכשיר במצב חיסכון בסוללה.
כדי למנוע הפעלה במצב חיסכון בסוללה, צריך לשנות את ההגדרה של
onStop
ולעצור את כל התוכן שמופעל כרגע:
Kotlin
override fun onStop() { // App-specific method to stop playback. stopPlayback() super.onStop() }
Java
@Override public void onStop() { // App-specific method to stop playback. stopPlayback(); super.onStop(); }
כשהמשתמש מפעיל מחדש את המכשיר, מתבצעת קריאה ל-onStart אם האפליקציה שלכם פועלת בחזית. מידע נוסף על הפעלה והפסקה של פעילות זמין במאמר
מחזור החיים של פעילות.