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

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

ACCESS_FINE_LOCATION

android.hardware.location

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

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

לחלק ממכשירי הטלוויזיה יש חיבור אתרנט בלבד.

לרשימה מלאה של בקשות הרשאה שמרמזות על דרישה לתכונת חומרה: 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.");
}

מסך מגע

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

במכשירי טלוויזיה, צריך לעצב את האפליקציה כך שתתמוך ניווט באמצעות מקשי החיצים (D-pad) בשלט הרחוק של הטלוויזיה. מידע נוסף על תמיכה הולמת בניווט באמצעות פקדים מתאימים לטלוויזיה, ניווט בטלוויזיה.

מצלמה

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

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

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