ידית בחומרה של הטלוויזיה

החומרה של טלוויזיות שונה באופן משמעותי ממכשירי 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 and
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (רמת ה-API המיועדת 20 ומטה בלבד)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (רמת ה-API המיועדת 20 ומטה בלבד)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

חלק ממכשירי הטלוויזיה כוללים רק חיבור Ethernet.

רשימה מלאה של בקשות הרשאה שמרמזות על דרישה לתכונת חומרה מופיעה במדריך בנושא uses-feature. אם האפליקציה שלך מבקשת אחת מהתכונות שצוינו למעלה, צריך לכלול הצהרה uses-feature במניפסט לגבי תכונת החומרה המשתמעת, כדי לציין שהיא לא נדרשת. android:required="false".

הערה: אם האפליקציה שלכם מיועדת ל-Android 5.0 (רמת API‏ 21) ומעלה ומשתמשת בהרשאה ACCESS_COARSE_LOCATION או ACCESS_FINE_LOCATION, המשתמשים עדיין יכולים להתקין את האפליקציה במכשיר טלוויזיה, גם אם במכשיר הטלוויזיה אין כרטיס רשת או מקלט GPS.

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

מידע נוסף על סינון תכונות והצהרה עליהן במניפסט זמין במדריך uses-feature.

בדיקת תכונות החומרה

מסגרת Android יכולה להודיע לכם אם תכונות חומרה לא זמינות במכשיר שבו האפליקציה שלכם פועלת. אפשר להשתמש בשיטה 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 עם הערך true ב-AndroidManifest.xml:

<meta-data android:name="android.software.leanback.supports_touch" android:value="true|false"/>

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