টিভি হার্ডওয়্যার ম্যানেজ করা

টিভি হার্ডওয়্যার অন্যান্য 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")
}

জাভা

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
জিপিএস android.hardware.location.gps
মাইক্রোফোন android.hardware.microphone
সেন্সর android.hardware.sensor
স্ক্রিন পোর্ট্রেট ওরিয়েন্টেশনে আছে android.hardware.screen.portrait

মনে রাখবেন: কিছু টিভি কন্ট্রোলারে মাইক্রোফোন থাকে, যা এখানে বর্ণিত মাইক্রোফোন হার্ডওয়্যার ফিচারের মতো নয়। কন্ট্রোলারের মাইক্রোফোন সম্পূর্ণভাবে কাজ করে।

ফিচার, সাবফিচার ও তাদের ডেসক্রিপ্টরগুলির সম্পূর্ণ তালিকা পেতে ফিচার রেফারেন্স দেখুন।

টিভির জন্য হার্ডওয়্যার সংক্রান্ত প্রয়োজনীয়তা ঘোষণা করা

Android অ্যাপ, অ্যাপ ম্যানিফেস্টে হার্ডওয়্যার ফিচার সংক্রান্ত প্রয়োজনীয়তা ঘোষণা করতে পারে, যাতে সেগুলি সেইসব ডিভাইসে ইনস্টল করা না হয় যেগুলিতে সেইসব ফিচার নেই। আপনি যদি TV-তে ব্যবহারের জন্য আগে থেকেই থাকা অ্যাপের সুবিধা বাড়িয়ে থাকেন, তাহলে কোনও হার্ডওয়্যার সংক্রান্ত প্রয়োজনীয়তা ঘোষণা আছে কিনা তা ভালভাবে দেখে নিন, যা TV ডিভাইসে এটি ইনস্টল করা থেকে আটকাতে পারে।

আপনার অ্যাপ যদি টাচস্ক্রিন বা ক্যামেরার মতো হার্ডওয়্যার ফিচার ব্যবহার করে যা টিভিতে উপলভ্য নেই, কিন্তু এটি যদি সেইসব ফিচার ব্যবহার না করেও কাজ করতে পারে, তাহলে আপনার অ্যাপের ম্যানিফেস্ট পরিবর্তন করে দেখিয়ে দিন যে এইসব ফিচার প্রয়োজন নেই। নিচে দেওয়া ম্যানিফেস্ট কোড স্নিপেট দেখায় যে কীভাবে ঘোষণা করতে হয় যে আপনার অ্যাপের এমন হার্ডওয়্যার ফিচারের প্রয়োজন নেই যা টিভি ডিভাইসে উপলভ্য নেই, কিন্তু নন-টিভি ডিভাইসে সেইসব ফিচার ব্যবহার করা হয়:

<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" হিসেবে চিহ্নিত করতে ভুলবেন না।

টিভি ডিভাইসে ব্যবহার করার জন্য তৈরি করা সব অ্যাপকে অবশ্যই ঘোষণা করতে হবে যে টাচস্ক্রিন ফিচার প্রয়োজন নেই, টিভি অ্যাপের সাথে শুরু করুন নিবন্ধে এটি বর্ণনা করা হয়েছে। আপনার অ্যাপ সাধারণত TV ডিভাইসে কাজ করে না এমন এক বা একাধিক ফিচার ব্যবহার করলে, আপনার মেনিফেস্টে সেইসব ফিচারের জন্য android:required অ্যাট্রিবিউট সেটিং পরিবর্তন করে false করুন।

সতর্কতা: কোনও হার্ডওয়্যার ফিচারের ভ্যালু true হিসেবে সেট করে সেটিকে প্রয়োজনীয় হিসেবে ঘোষণা করলে, আপনার অ্যাপ TV ডিভাইসে ইনস্টল করা যাবে না বা 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 লেভেল ২০ বা তার নিচে শুধুমাত্র)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (টার্গেট API লেভেল ২০ বা তার নিচে শুধুমাত্র)

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

জাভা

// 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-প্যাড) রিমোট কন্ট্রোলের উপর নির্ভর করে। টিভি অ্যাপে সবসময় ডি-প্যাড রিমোট কন্ট্রোল কাজ করতে হবে।

টিভিতে উপযুক্ত কন্ট্রোল ব্যবহার করে নেভিগেশনকে সঠিকভাবে সহায়তা করা সম্পর্কে আরও তথ্য পেতে, টিভি নেভিগেশন দেখুন।

টাচ সাপোর্ট ঘোষণা করা

কিছু টিভি ডিভাইসে পয়েন্টার রিমোট ও টাচস্ক্রিন ডিসপ্লে কাজ করে। আপনার অ্যাপ ক্লিক, হোভার ও স্ক্রল ইন্টার‍্যাকশনের মতো সুবিধা দিতে পারে, যেমন মোবাইল ডিভাইসে দেওয়া হয়। এর ফলে, যেসব ডিভাইসে এইসব সুবিধা কাজ করে, সেগুলিতে আরও ভালো অভিজ্ঞতা প্রদান করা যায়।

আপনার অ্যাপে টাচ মোড কাজ করলে, আপনার AndroidManifest.xml-এ android.software.leanback.supports_touch-কে true হিসেবে সেট করে টাচ সাপোর্ট ঘোষণা করতে পারবেন:

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

জাভা

// 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.");
}

জিপিএস

টিভি হল স্থির, ইনডোর ডিভাইস এবং এতে বিল্ট-ইন গ্লোবাল পজিশনিং সিস্টেম (জিপিএস) রিসিভার থাকে না। আপনার অ্যাপ লোকেশন সংক্রান্ত তথ্য ব্যবহার করলে, আপনি এখনও ব্যবহারকারীদের কোনও লোকেশন সার্চ করতে দিতে পারেন অথবা টিভি ডিভাইস সেট-আপ করার সময় কনফিগার করা পোস্টাল কোডের মতো স্ট্যাটিক লোকেশন প্রদানকারী ব্যবহার করতে পারেন।

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
        }

জাভা

// 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()
}

জাভা

@Override
public void onStop() {
  // App-specific method to stop playback.
  stopPlayback();
  super.onStop();
}

ব্যবহারকারী পাওয়ার আবার চালু করলে, আপনার অ্যাপ অ্যাক্টিভ ফোরগ্রাউন্ড অ্যাপ হলে, onStart কল করা হয় । অ্যাক্টিভিটি শুরু ও বন্ধ করা সম্পর্কে আরও জানতে, অ্যাক্টিভিটি লাইফসাইকেল দেখুন।