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

חומרת הטלוויזיה שונה באופן משמעותי ממכשירי 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

android.hardware.location

android.hardware.location.network (target API level 20 or lower only)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (target API level 20 or lower only)

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).

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

הצהרה על תמיכה במגע

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

אם האפליקציה שלכם מאפשרת שימוש במצב מגע, אתם יכולים להצהיר על תמיכה במגע על ידי הוספת 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: Location = locationManager.getLastKnownLocation("static")

// 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)[0]
                    .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() אם האפליקציה שלכם היא האפליקציה הפעילה בחזית. מידע נוסף על הפעלה והפסקה של פעילות זמין במאמר מחזור החיים של פעילות.