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

টিভির হার্ডওয়্যার অন্যান্য Android ডিভাইসের থেকে অনেকটাই আলাদা। টিভিতে অন্যান্য Android ডিভাইসে পাওয়া যায় এমন কিছু হার্ডওয়্যার ফিচার থাকে না, যেমন টাচস্ক্রিন, ক্যামেরা ও জিপিএস রিসিভার। এছাড়াও, টিভি সম্পূর্ণভাবে সেকেন্ডারি হার্ডওয়্যার ডিভাইসের উপর নির্ভর করে: ব্যবহারকারীকে টিভি অ্যাপের সাথে ইন্টার‍্যাক্ট করতে হলে, তাকে অবশ্যই রিমোট কন্ট্রোল বা গেম প্যাড ব্যবহার করতে হবে। (বিভিন্ন ইনপুট পদ্ধতি সম্পর্কে জানতে, টিভি কন্ট্রোলার ম্যানেজ করুন দেখুন।)

টিভির জন্য অ্যাপ তৈরি করার সময়, টিভি হার্ডওয়্যার অপারেট করার ক্ষেত্রে হার্ডওয়্যার সংক্রান্ত সীমাবদ্ধতা ও প্রয়োজনীয়তা যত্নসহকারে বিবেচনা করুন। আপনার অ্যাপ টিভিতে চলছে কিনা তা চেক করুন এবং কাজ করে না এমন হার্ডওয়্যার ফিচার ম্যানেজ করুন।

টিভি ডিভাইস চেক করুন

আপনি যদি এমন কোনও অ্যাপ তৈরি করেন যা টিভি ডিভাইস এবং অন্যান্য ডিভাইস, দুটিতেই কাজ করে, তাহলে আপনার অ্যাপটি কোন ধরনের ডিভাইসে চলছে তা চেক করতে এবং আপনার অ্যাপের অপারেশন অ্যাডজাস্ট করতে হতে পারে। যেমন, আপনার কাছে এমন কোনও অ্যাপ থাকলে যা 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 অ্যাপ, অ্যাপ ম্যানিফেস্টে হার্ডওয়্যার ফিচার সংক্রান্ত প্রয়োজনীয়তা ঘোষণা করতে পারে যাতে যেসব ডিভাইসে এইসব ফিচার নেই সেগুলিতে যেন অ্যাপ ইনস্টল না হয় তা নিশ্চিত করা যায়। আপনি যদি আগে থেকে থাকা কোনও অ্যাপ টিভিতে ব্যবহারের জন্য এক্সটেন্ড করেন, তাহলে অ্যাপের ম্যানিফেস্ট ভালোভাবে পর্যালোচনা করে দেখুন যে কোনও হার্ডওয়্যার সংক্রান্ত প্রয়োজনীয়তা ঘোষণা করা আছে কিনা, যার ফলে এটি টিভি ডিভাইসে ইনস্টল করা যাবে না।

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

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

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 লেভেল ২১) বা তার পরবর্তী ভার্সনকে টার্গেট করলে এবং ACCESS_COARSE_LOCATION বা ACCESS_FINE_LOCATION অনুমতি ব্যবহার করলে, টিভি ডিভাইসে নেটওয়ার্ক কার্ড বা জিপিএস রিসিভার না থাকলেও ব্যবহারকারীরা টিভি ডিভাইসে আপনার অ্যাপ ইনস্টল করতে পারবেন।

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

ম্যানিফেস্টে ফিচার ফিল্টার ও ঘোষণা করা সম্পর্কে আরও জানতে, 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-প্যাড) রিমোট কন্ট্রোলের উপর সম্পূর্ণ নির্ভর করে। TV অ্যাপে সবসময় ডি-প্যাড রিমোট কন্ট্রোল কাজ করতে হবে।

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

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

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

আপনার অ্যাপে টাচ মোড থাকলে, আপনি সম্পূর্ণ অ্যাপ বা স্বতন্ত্র অ্যাক্টিভিটির জন্য টাচ সাপোর্ট ঘোষণা করতে পারেন। এর জন্য AndroidManifest.xml-এ <application> বা <activity> এলিমেন্টের মধ্যে true-এ সেট করা android.software.leanback.supports_touch <property> এলিমেন্ট যোগ করতে হবে:

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

জাভা

// 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) রিসিভার নেই। আপনার অ্যাপ লোকেশন সংক্রান্ত তথ্য ব্যবহার করলে, আপনি এখনও ব্যবহারকারীদের কোনও লোকেশন সার্চ করতে দিতে পারেন অথবা টিভি ডিভাইস সেট-আপ করার সময় কনফিগার করা পোস্টাল কোডের মতো কোনও স্ট্যাটিক লোকেশন প্রোভাইডার ব্যবহার করতে দিতে পারেন।

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 কল করা হয়। অ্যাক্টিভিটি শুরু ও বন্ধ করা সম্পর্কে আরও তথ্যের জন্য, অ্যাক্টিভিটি লাইফসাইকেল দেখুন।