টিভি হার্ডওয়্যার পরিচালনা করুন

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

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

টিভি ডিভাইসের জন্য পরীক্ষা করুন

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

আপনার অ্যাপটি কোনো টিভি ডিভাইসে চলছে কিনা তা নির্ধারণ করার প্রস্তাবিত উপায় হলো PackageManager.hasSystemFeature() মেথড ব্যবহার করে ডিভাইসটি টেলিভিশন মোডে চলছে কিনা তা পরীক্ষা করা। নিম্নলিখিত উদাহরণ কোডটি দেখায় যে কীভাবে আপনার অ্যাপটি একটি টিভি ডিভাইসে চলছে কিনা তা পরীক্ষা করতে হয়:

কোটলিন

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

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

ফিচার, সাব-ফিচার এবং তাদের বর্ণনাকারীর সম্পূর্ণ তালিকার জন্য ফিচার রেফারেন্স দেখুন।

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

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

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

<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 সেট করে সেটিকে আবশ্যক হিসেবে ঘোষণা করলে, আপনার অ্যাপটি টিভি ডিভাইসে ইনস্টল হতে পারবে না বা অ্যান্ড্রয়েড টিভি হোম স্ক্রিন লঞ্চারে প্রদর্শিত হবে না।

হার্ডওয়্যার বৈশিষ্ট্য নির্দেশ করে এমন অনুমতি সম্পর্কে সচেতন থাকুন।

কিছু 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 (শুধুমাত্র টার্গেট এপিআই লেভেল ২০ বা তার নিচের জন্য)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (শুধুমাত্র টার্গেট এপিআই লেভেল ২০ বা তার নিচের জন্য)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

কিছু টিভি ডিভাইসে শুধু ইথারনেট সংযোগ থাকে।

যেসব পারমিশন রিকোয়েস্টে হার্ডওয়্যার ফিচারের প্রয়োজনীয়তা বোঝায়, তার সম্পূর্ণ তালিকার জন্য uses-feature গাইডটি দেখুন। যদি আপনার অ্যাপ পূর্বে তালিকাভুক্ত ফিচারগুলোর মধ্যে কোনো একটির জন্য অনুরোধ করে, তাহলে সেই হার্ডওয়্যার ফিচারটির জন্য আপনার ম্যানিফেস্টে একটি uses-feature ডিক্লারেশন অন্তর্ভুক্ত করুন, যা নির্দেশ করে যে এটির প্রয়োজন নেই। android:required="false" .

দ্রষ্টব্য: যদি আপনার অ্যাপটি অ্যান্ড্রয়েড ৫.০ (এপিআই লেভেল ২১) বা তার উচ্চতর সংস্করণকে টার্গেট করে এবং ACCESS_COARSE_LOCATION বা ACCESS_FINE_LOCATION পারমিশন ব্যবহার করে, তাহলেও ব্যবহারকারীরা একটি টিভি ডিভাইসে আপনার অ্যাপটি ইনস্টল করতে পারবে, এমনকি সেই টিভি ডিভাইসটিতে কোনো নেটওয়ার্ক কার্ড বা জিপিএস রিসিভার না থাকলেও।

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

ম্যানিফেস্টে ফিচার ফিল্টারিং এবং ডিক্লেয়ার করার বিষয়ে আরও তথ্যের জন্য uses-feature গাইডটি দেখুন।

হার্ডওয়্যার বৈশিষ্ট্যগুলি পরীক্ষা করুন

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

নিম্নলিখিত কোড উদাহরণটি দেখায় কিভাবে রানটাইমে হার্ডওয়্যার বৈশিষ্ট্যগুলির প্রাপ্যতা সনাক্ত করা যায়:

কোটলিন

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

টাচস্ক্রিন

বেশিরভাগ টিভি ডিভাইসে টাচস্ক্রিন বা পয়েন্টার ইনপুট সুবিধা থাকে না এবং নেভিগেশনের জন্য এগুলো সম্পূর্ণরূপে ডিরেকশনাল প্যাড (ডি-প্যাড) রিমোট কন্ট্রোলের উপর নির্ভর করে। টিভি অ্যাপগুলোতে অবশ্যই ডি-প্যাড রিমোট কন্ট্রোল সাপোর্ট থাকতে হবে।

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

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

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

আপনার অ্যাপে টাচ মোডের সুবিধা থাকলে, 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" />

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

কোটলিন

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

কোটলিন

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

জাভা

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

লো-পাওয়ার মোডে প্লেব্যাক বিরতি দিন

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

লো-পাওয়ার মোডে প্লেব্যাক এড়াতে, onStop() ওভাররাইড করুন এবং বর্তমানে প্লে হওয়া যেকোনো কন্টেন্ট বন্ধ করুন:

কোটলিন

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