আপনার মিডিয়া অ্যাপে Android Automotive OS সমর্থন যোগ করুন

অ্যান্ড্রয়েড অটোমোটিভ ওএস ব্যবহারকারীদের গাড়িতে অ্যাপ ইনস্টল করার সুযোগ দেয়। এই প্ল্যাটফর্মে ব্যবহারকারীদের কাছে পৌঁছানোর জন্য, আপনাকে অ্যান্ড্রয়েড অটোমোটিভ ওএস-এর সাথে সামঞ্জস্যপূর্ণ এবং ড্রাইভারদের জন্য বিশেষভাবে তৈরি একটি অ্যাপ বিতরণ করতে হবে। আপনি আপনার অ্যান্ড্রয়েড অটো অ্যাপের প্রায় সমস্ত কোড এবং রিসোর্স পুনরায় ব্যবহার করতে পারেন, কিন্তু আপনাকে অবশ্যই একটি পৃথক বিল্ড তৈরি করতে হবে যা এই পৃষ্ঠার প্রয়োজনীয়তাগুলো পূরণ করে।

উন্নয়ন ওভারভিউ

অ্যান্ড্রয়েড অটোমোটিভ ওএস সাপোর্ট যোগ করার জন্য মাত্র কয়েকটি ধাপ অনুসরণ করতে হয়, যা নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে:

  1. অ্যান্ড্রয়েড স্টুডিওতে স্বয়ংচালিত বৈশিষ্ট্যগুলি সক্রিয় করুন
  2. একটি স্বয়ংচালিত মডিউল তৈরি করুন
  3. আপনার Gradle নির্ভরতাগুলো আপডেট করুন
  4. ঐচ্ছিকভাবে, সেটিংস এবং সাইন-ইন কার্যক্রম বাস্তবায়ন করুন
  5. ঐচ্ছিকভাবে, মিডিয়া হোস্টের পরামর্শগুলো পড়ুন

নকশা বিবেচনা

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

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

আপনার প্রজেক্ট সেট আপ করুন

অ্যান্ড্রয়েড অটোমোটিভ ওএস-এর জন্য সমর্থন চালু করতে আপনাকে আপনার অ্যাপের প্রজেক্টের কয়েকটি অংশ সেট আপ করতে হবে।

অ্যান্ড্রয়েড স্টুডিওতে স্বয়ংচালিত বৈশিষ্ট্যগুলি সক্রিয় করুন

অটোমোটিভ ওএস-এর সকল ফিচার সক্রিয় আছে কিনা তা নিশ্চিত করতে অ্যান্ড্রয়েড স্টুডিও ৪.০ বা তার উচ্চতর সংস্করণ ব্যবহার করুন।

একটি স্বয়ংচালিত মডিউল তৈরি করুন

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

আপনার প্রজেক্টে একটি অটোমোটিভ মডিউল যোগ করতে এই ধাপগুলো অনুসরণ করুন:

  1. অ্যান্ড্রয়েড স্টুডিওতে, ফাইল > নতুন > নতুন মডিউল-এ ক্লিক করুন।
  2. অটোমোটিভ মডিউল নির্বাচন করুন, তারপর নেক্সট-এ ক্লিক করুন।
  3. একটি অ্যাপ্লিকেশন/লাইব্রেরির নাম লিখুন। অ্যান্ড্রয়েড অটোমোটিভ ওএস-এ ব্যবহারকারীরা আপনার অ্যাপের জন্য এই নামটিই দেখতে পান।
  4. একটি মডিউলের নাম লিখুন।
  5. আপনার অ্যাপের সাথে মিলিয়ে প্যাকেজের নামটি পরিবর্তন করুন।
  6. ন্যূনতম SDK হিসেবে API 28: Android 9.0 (Pie) নির্বাচন করুন, এবং তারপর Next ক্লিক করুন।

    অ্যান্ড্রয়েড অটোমোটিভ ওএস সমর্থনকারী সমস্ত গাড়ি অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) বা তার উচ্চতর সংস্করণে চলে, তাই এই মানটি নির্বাচন করলে সমস্ত সামঞ্জস্যপূর্ণ গাড়ি এর আওতায় আসবে।

  7. ‘কোনো কার্যকলাপ নেই’ নির্বাচন করুন, এবং তারপর ‘সমাপ্ত’ ক্লিক করুন।

অ্যান্ড্রয়েড স্টুডিওতে আপনার মডিউল তৈরি করার পরে, আপনার নতুন অটোমোটিভ মডিউলে AndroidManifest.xml ফাইলটি খুলুন:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

</manifest>

<application> এলিমেন্টটিতে অ্যাপের কিছু সাধারণ তথ্যের পাশাপাশি একটি <uses-feature> এলিমেন্ট রয়েছে, যা অ্যান্ড্রয়েড অটোমোটিভ ওএস-এর জন্য সমর্থন ঘোষণা করে। উল্লেখ্য যে, ম্যানিফেস্টে কোনো অ্যাক্টিভিটি ঘোষণা করা হয়নি।

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

যেকোনো সেটিংস বা সাইন-ইন অ্যাক্টিভিটি যোগ করার পর, <application> এলিমেন্টের android:appCategory অ্যাট্রিবিউটটিকে "audio" তে সেট করে আপনার ম্যানিফেস্ট ফাইলটি সম্পূর্ণ করুন।

<application
  ...
  android:appCategory="audio" />

বৈশিষ্ট্যের প্রয়োজনীয়তা ঘোষণা করুন

অ্যান্ড্রয়েড অটোমোটিভ ওএস-এর জন্য তৈরি সমস্ত অ্যাপকে গুগল প্লে-তে বিতরণ করার জন্য নির্দিষ্ট কিছু শর্ত পূরণ করতে হবে। আরও তথ্যের জন্য ‘মিট গুগল প্লে ফিচার রিকোয়ারমেন্টস’ দেখুন।

অ্যান্ড্রয়েড অটোমোটিভ ওএস-এর জন্য মিডিয়া সমর্থন ঘোষণা করুন।

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

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

এই ম্যানিফেস্ট এন্ট্রিটি একটি XML ফাইলকে নির্দেশ করে, যা আপনার অ্যাপের সমর্থিত স্বয়ংচালিত সক্ষমতাগুলো ঘোষণা করে।

আপনার একটি মিডিয়া অ্যাপ আছে তা বোঝানোর জন্য, আপনার প্রজেক্টের res/xml/ ডিরেক্টরিতে automotive_app_desc.xml নামের একটি XML ফাইল যোগ করুন। এই ফাইলে নিম্নলিখিত বিষয়বস্তু অন্তর্ভুক্ত করুন:

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

অভিপ্রায় ফিল্টার

অ্যান্ড্রয়েড অটোমোটিভ ওএস আপনার মিডিয়া অ্যাপে অ্যাক্টিভিটি ট্রিগার করার জন্য এক্সপ্লিসিট ইনটেন্ট ব্যবহার করে। ম্যানিফেস্ট ফাইলে CATEGORY_LAUNCHER বা ACTION_MAIN ইনটেন্ট ফিল্টারযুক্ত কোনো অ্যাক্টিভিটি অন্তর্ভুক্ত করবেন না।

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

<activity android:name=".MyActivity">
    <intent-filter>
        <!-- You can't use either of these intents for Android Automotive OS -->
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <!--
        In their place, you can include other intent filters for any activities
        that your app needs for Android Automotive OS, such as settings or
        sign-in activities.
        -->
    </intent-filter>
</activity>

আপনার গ্রেডল নির্ভরতা আপডেট করুন

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

my-auto-module /build.gradle

গ্রুভি

buildscript {
    ...
    dependencies {
        ...
        implementation project(':shared_module_name')
    }
}

কোটলিন

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

সেটিংস এবং সাইন-ইন কার্যক্রম বাস্তবায়ন করুন

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

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

কার্যকলাপ কর্মপ্রবাহ

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

সেটিংস এবং সাইন-ইন কার্যকলাপের জন্য কর্মপ্রবাহ

চিত্র ১. সেটিংস এবং সাইন-ইন কার্যক্রমের কার্যপ্রবাহ।

আপনার সেটিংস এবং সাইন-ইন কার্যক্রমে মনোযোগ বিঘ্নকারী বিষয়গুলোকে নিরুৎসাহিত করুন।

ব্যবহারকারীর যানবাহন পার্ক করা থাকা অবস্থাতেই যেন আপনার সেটিংস এবং সাইন-ইন কার্যক্রমগুলো ব্যবহারযোগ্য থাকে, তা নিশ্চিত করতে <activity> এলিমেন্ট(গুলো)তে নিম্নলিখিত <meta-data> এলিমেন্টটি অন্তর্ভুক্ত নেই তা যাচাই করুন। এই ধরনের কোনো এলিমেন্ট উপস্থিত থাকলে পর্যালোচনার সময় আপনার অ্যাপটি বাতিল করা হবে।

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

একটি সেটিংস কার্যকলাপ যোগ করুন

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

একটি সেটিংস কার্যকলাপ ঘোষণা করুন

আপনাকে অবশ্যই আপনার অ্যাপের ম্যানিফেস্ট ফাইলে সেটিংস অ্যাক্টিভিটি ঘোষণা করতে হবে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

<application>
    ...
    <activity android:name=".AppSettingsActivity"
              android:exported="true"
              android:theme="@style/SettingsActivity"
              android:label="@string/app_settings_activity_title">
        <intent-filter>
            <action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
        </intent-filter>
    </activity>
    ...
</application>

আপনার সেটিংস কার্যকলাপ বাস্তবায়ন করুন

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

এই বিভাগের বাকি অংশে দেখানো হয়েছে, কীভাবে আপনি ইউনিভার্সাল অ্যান্ড্রয়েড মিউজিক প্লেয়ার (UAMP) স্যাম্পল অ্যাপের কোড ব্যবহার করে আপনার অ্যাপের জন্য একটি সেটিংস অ্যাক্টিভিটি তৈরি করতে পারেন।

শুরু করতে, নমুনা কোডটি ডাউনলোড করুন:

# Clone the UAMP repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

আপনার কার্যক্রমটি বাস্তবায়ন করতে, এই ধাপগুলো অনুসরণ করুন:

  1. automotive/automotive-lib ফোল্ডারটি আপনার automotive মডিউলে কপি করুন।
  2. automotive/src/main/res/xml/preferences.xml এর মতো করে একটি প্রেফারেন্স ট্রি সংজ্ঞায়িত করুন।
  3. একটি PreferenceFragmentCompat প্রয়োগ করুন যা আপনার সেটিংস অ্যাক্টিভিটি প্রদর্শন করবে। আরও তথ্যের জন্য UAMP-এর SettingsFragment.ktSettingsActivity.kt ফাইল এবং অ্যান্ড্রয়েড সেটিংস গাইড দেখুন।

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

  • আপনার সেটিংস অ্যাক্টিভিটিতে মূল ভিউয়ের নিচে দুইটির বেশি গভীরতার স্তর রাখবেন না।
  • DropDownPreference ব্যবহার করবেন না। এর পরিবর্তে ListPreference ব্যবহার করুন।
  • সাংগঠনিক উপাদানসমূহ:
    • PreferenceScreen
      • এটি অবশ্যই আপনার প্রেফারেন্স ট্রি-এর সর্বোচ্চ স্তর হতে হবে।
    • PreferenceCategory
      • Preference অবজেক্টগুলোকে একসাথে গ্রুপ করতে ব্যবহৃত হয়।
      • একটি title অন্তর্ভুক্ত করুন।
  • নিম্নলিখিত সমস্ত উপাদানে একটি key এবং title অন্তর্ভুক্ত করুন। আপনি একটি summary , একটি icon , অথবা উভয়ই অন্তর্ভুক্ত করতে পারেন:
    • Preference
      • আপনার PreferenceFragmentCompat ইমপ্লিমেন্টেশনের onPreferenceTreeClick() কলব্যাকে লজিকটি কাস্টমাইজ করুন।
    • CheckBoxPreference
      • শর্তসাপেক্ষ টেক্সটের ক্ষেত্রে summary এর পরিবর্তে summaryOn বা summaryOff ব্যবহার করা যেতে পারে।
    • SwitchPreference
      • শর্তসাপেক্ষ টেক্সটের ক্ষেত্রে summary এর পরিবর্তে summaryOn বা summaryOff ব্যবহার করা যেতে পারে।
      • switchTextOn বা switchTextOff থাকতে পারে।
    • SeekBarPreference
      • একটি min , max এবং defaultValue অন্তর্ভুক্ত করুন।
    • EditTextPreference
      • dialogTitle , positiveButtonText এবং negativeButtonText অন্তর্ভুক্ত করুন।
      • dialogMessage এবং dialogLayoutResource এর একটি বা উভয়ই থাকতে পারে।
    • com.example.android.uamp.automotive.lib.ListPreference
      • এটি মূলত ListPreference থেকে উদ্ভূত।
      • Preference অবজেক্টগুলোর একটি একক-পছন্দের তালিকা প্রদর্শন করতে ব্যবহৃত হয়।
      • অবশ্যই entries একটি অ্যারে এবং সংশ্লিষ্ট entryValues থাকতে হবে।
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • মূলত MultiSelectListPreference থেকে উদ্ভূত
      • Preference অবজেক্টগুলোর একটি বহু-নির্বাচনী তালিকা প্রদর্শন করতে ব্যবহৃত হয়।
      • অবশ্যই entries একটি অ্যারে এবং সংশ্লিষ্ট entryValues থাকতে হবে।

একটি সাইন-ইন কার্যকলাপ যোগ করুন

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

অ্যাপ চালু করার সময় সাইন ইন করতে হবে।

আপনার অ্যাপ ব্যবহার করার আগে ব্যবহারকারীকে সাইন ইন করতে বাধ্য করার জন্য, আপনার মিডিয়া ব্রাউজার সার্ভিসকে নিম্নলিখিত কাজগুলো করতে হবে:

  1. আপনার সার্ভিসের onLoadChildren() মেথডে, sendResult() মেথড ব্যবহার করে null রেজাল্ট পাঠান।
  2. setState() মেথড ব্যবহার করে মিডিয়া সেশনের PlaybackStateCompat কে STATE_ERROR এ সেট করুন। এটি Android Automotive OS-কে জানিয়ে দেয় যে, ত্রুটিটির সমাধান না হওয়া পর্যন্ত অন্য কোনো অপারেশন করা যাবে না।
  3. মিডিয়া সেশনের PlaybackStateCompat এরর কোডটি ERROR_CODE_AUTHENTICATION_EXPIRED এ সেট করুন। এটি Android Automotive OS-কে জানিয়ে দেয় যে ব্যবহারকারীকে প্রমাণীকরণ করতে হবে।
  4. setErrorMessage() মেথড ব্যবহার করে মিডিয়া সেশনের PlaybackStateCompat এরর মেসেজ সেট করুন। যেহেতু এই এরর মেসেজটি ব্যবহারকারী দেখতে পান, তাই এটিকে ব্যবহারকারীর বর্তমান লোকেল অনুযায়ী স্থানীয়করণ করুন।
  5. setExtras() মেথড ব্যবহার করে মিডিয়া সেশনের PlaybackStateCompat এক্সট্রাগুলো সেট করুন। নিম্নলিখিত দুটি কী অন্তর্ভুক্ত করুন:

    • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL : একটি স্ট্রিং যা সাইন-ইন প্রক্রিয়া শুরু করার বোতামে প্রদর্শিত হয়। যেহেতু এই স্ট্রিংটি ব্যবহারকারীর সামনে থাকে, তাই এটিকে ব্যবহারকারীর বর্তমান লোকেল অনুযায়ী স্থানীয়করণ করুন।
    • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT : একটি PendingIntent যা ব্যবহারকারীকে আপনার সাইন-ইন অ্যাক্টিভিটিতে নিয়ে যায় যখন ব্যবহারকারী PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL দ্বারা নির্দেশিত বোতামটি ট্যাপ করেন।

নিম্নলিখিত কোড স্নিপেটটি দেখায় যে কীভাবে আপনার অ্যাপ ব্যবহার করার আগে ব্যবহারকারীকে সাইন ইন করতে বলতে পারে:

কোটলিন

import androidx.media.utils.MediaConstants

val signInIntent = Intent(this, SignInActivity::class.java)
val signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0)
val extras = Bundle().apply {
    putString(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
        "Sign in"
    )
    putParcelable(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
        signInActivityPendingIntent
    )
}

val playbackState = PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
        .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
        )
        .setExtras(extras)
        .build()
mediaSession.setPlaybackState(playbackState)

জাভা

import androidx.media.utils.MediaConstants;

Intent signInIntent = new Intent(this, SignInActivity.class);
PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0);
Bundle extras = new Bundle();
extras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
    "Sign in");
extras.putParcelable(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
    signInActivityPendingIntent);

PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder()
    .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
    .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
    )
    .setExtras(extras)
    .build();
mediaSession.setPlaybackState(playbackState);

ব্যবহারকারী সফলভাবে প্রমাণীকৃত হওয়ার পর, PlaybackStateCompat কে STATE_ERROR ব্যতীত অন্য কোনো অবস্থায় ফিরিয়ে আনুন, তারপর অ্যাক্টিভিটির finish() মেথড কল করে ব্যবহারকারীকে Android Automotive OS-এ ফিরিয়ে নিয়ে যান।

আপনার সাইন-ইন কার্যকলাপ বাস্তবায়ন করুন

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

নিম্নলিখিত টুলগুলি সেইসব ব্যবহারকারীদের জন্য একটি সহজতর সাইন-ইন অভিজ্ঞতা তৈরি করতে সাহায্য করতে পারে, যারা পূর্বে অন্য কোনো ডিভাইসে সাইন-ইন করেছেন:

  • ওয়ান ট্যাপ সাইন-ইন এবং সাইন-আপ: যদি আপনি ইতিমধ্যেই আপনার ফোন অ্যাপের মতো অন্যান্য ডিভাইসের জন্য ওয়ান ট্যাপ প্রয়োগ করে থাকেন, তবে বিদ্যমান ওয়ান ট্যাপ ব্যবহারকারীদের সমর্থন করার জন্য আপনার অ্যান্ড্রয়েড অটোমোটিভ ওএস অ্যাপের জন্যও এটি প্রয়োগ করুন।
  • গুগল সাইন-ইন: যদি আপনি ইতিমধ্যেই আপনার ফোন অ্যাপের মতো অন্যান্য ডিভাইসের জন্য গুগল সাইন-ইন চালু করে থাকেন, তাহলে বিদ্যমান গুগল সাইন-ইন ব্যবহারকারীদের সমর্থন করার জন্য আপনার অ্যান্ড্রয়েড অটোমোটিভ ওএস অ্যাপের জন্যও গুগল সাইন-ইন চালু করুন।
  • গুগল অটোফিল: যদি ব্যবহারকারীরা তাদের অন্যান্য অ্যান্ড্রয়েড ডিভাইসে গুগল অটোফিল চালু করে থাকেন, তাহলে তাদের ক্রেডেনশিয়ালগুলো গুগল পাসওয়ার্ড ম্যানেজারে সেভ হয়ে যায়। যখন সেই ব্যবহারকারীরা আপনার অ্যান্ড্রয়েড অটোমোটিভ ওএস অ্যাপে সাইন ইন করেন, তখন গুগল অটোফিল প্রাসঙ্গিক সেভ করা ক্রেডেনশিয়ালগুলো সাজেস্ট করে। গুগল অটোফিল ব্যবহার করার জন্য কোনো অ্যাপ্লিকেশন ডেভেলপমেন্ট প্রচেষ্টার প্রয়োজন হয় না। তবে, অ্যাপ্লিকেশন ডেভেলপাররা আরও ভালো মানের ফলাফলের জন্য তাদের অ্যাপ অপটিমাইজ করতে পারেন। অ্যান্ড্রয়েড অটোমোটিভ ওএস সহ অ্যান্ড্রয়েড ৮.০ (এপিআই লেভেল ২৬) বা তার উচ্চতর সংস্করণে চালিত সমস্ত ডিভাইসে গুগল অটোফিল সাপোর্ট করে।

AccountManager ব্যবহার করুন

যেসব অ্যান্ড্রয়েড অটোমোটিভ ওএস অ্যাপে অথেনটিকেশন রয়েছে, সেগুলোতে নিম্নলিখিত কারণগুলোর জন্য অবশ্যই AccountManager ব্যবহার করতে হবে:

  • উন্নত ইউএক্স এবং অ্যাকাউন্ট ব্যবস্থাপনার সুবিধা: ব্যবহারকারীরা সিস্টেম সেটিংসের অ্যাকাউন্টস মেনু থেকে তাদের সমস্ত অ্যাকাউন্ট পরিচালনা করতে পারেন, যার মধ্যে সাইন-ইন এবং সাইন-আউটও অন্তর্ভুক্ত।
  • "গেস্ট" অভিজ্ঞতা: গাড়ি হলো শেয়ার করা ডিভাইস, যার মানে হলো OEM-রা গাড়িতে "গেস্ট" অভিজ্ঞতা চালু করতে পারে, যেখানে অ্যাকাউন্ট যোগ করা যায় না। AccountManager এর জন্য DISALLOW_MODIFY_ACCOUNTS ব্যবহার করে এই সীমাবদ্ধতাটি আরোপ করা হয়।

অনুমতি

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

মিডিয়া হোস্ট অ্যাপটি চালু করুন

আপনি আপনার অ্যাপে অথবা আপনার অ্যাপের ভেতরের কন্টেন্টে মিডিয়া হোস্ট অ্যাপটি খোলার জন্য ইন্টেন্ট তৈরি করতে পারেন। উদাহরণস্বরূপ:

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

মিডিয়া হোস্টের সক্ষমতা নির্ধারণ করুন

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

সকল মিডিয়া হোস্ট অ্যাপ MEDIA_TEMPLATE ইন্টেন্ট সমর্থন করে। মিডিয়া হোস্টটি MEDIA_TEMPLATE_V2 ইন্টেন্ট সমর্থন করে কিনা তা নির্ধারণ করতে, আপনি নিম্নলিখিতভাবে queryIntentActivities() ব্যবহার করতে পারেন:

val isMediaTemplateV2Supported = packageManager.queryIntentActivities(
  Intent(MediaIntentExtras.ACTION_MEDIA_TEMPLATE_V2),
  //  MATCH_DEFAULT_ONLY  since the host should be started with implicit intents
  //  MATCH_SYSTEM_ONLY  excludes any apps that aren't preinstalled
  PackageManager.MATCH_DEFAULT_ONLY or PackageManager.MATCH_SYSTEM_ONLY
).size > 0

একটি ইন্টেন্ট তৈরি করুন এবং ব্যবহার করুন

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

অতিরিক্ত চাবি প্রকার বর্ণনা সমর্থিত পদক্ষেপ
EXTRA_KEY_MEDIA_COMPONENT String মিডিয়া হোস্ট অ্যাপটি যে MediaBrowserService এর সাথে সংযোগ স্থাপন করবে, তার সংক্ষিপ্ত কম্পোনেন্ট নামটি – সাধারণত এটি আপনার অ্যাপের নিজস্ব কম্পোনেন্ট। যদি এই অতিরিক্ত অংশটি নির্দিষ্ট করা না থাকে, তবে মিডিয়া হোস্ট ডিফল্টরূপে সক্রিয় মিডিয়া সোর্সটিকে ব্যবহার করে। MEDIA_TEMPLATE , MEDIA_TEMPLATE_V2
EXTRA_KEY_SEARCH_QUERY String কল করার সময় যে সার্চ কোয়েরি ব্যবহার করতে হবে MEDIA_TEMPLATE , MEDIA_TEMPLATE_V2
EXTRA_KEY_MEDIA_ID String ব্রাউজ ভিউতে খোলার জন্য মিডিয়া আইডি। MEDIA_TEMPLATE_V2
EXTRA_KEY_SEARCH_ACTION Integer EXTRA_KEY_SEARCH_QUERY এর অনুসন্ধান সম্পন্ন হওয়ার পর করণীয় পদক্ষেপ। MEDIA_TEMPLATE_V2

উদাহরণস্বরূপ, MEDIA_TEMPLATE_V2 অ্যাকশন সমর্থন করে এমন কোনো হোস্টে, নিম্নলিখিত কোডটি মিডিয়া হোস্ট অ্যাপটি খুলবে, এটিকে MyMediaBrowserService এর সাথে সংযুক্ত করবে, "Jazz" লিখে অনুসন্ধান করবে এবং তারপর অনুসন্ধানের ফলাফল থেকে প্রথম আইটেমটি প্লে করবে। অন্য সব হোস্টে, এটি কেবল মিডিয়া হোস্ট অ্যাপটি খুলবে এবং "Jazz" লিখে অনুসন্ধান করবে, এবং ব্যবহারকারীকে ফলাফল থেকে প্লে করার জন্য একটি আইটেম বেছে নিতে দেবে।

val startMediaHostIntent = Intent(ACTION_MEDIA_TEMPLATE)
  .putExtra(MediaIntentExtras.EXTRA_KEY_MEDIA_COMPONENT, MyMediaBrowserService::class.java)
  .putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_QUERY, "Jazz")
  .putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_ACTION, MediaIntentExtras.EXTRA_VALUE_PLAY_FIRST_ITEM_FROM_SEARCH)

context.startActivity(startMediaHostIntent)

অ্যান্ড্রয়েড অটোমোটিভ ওএস ডিভাইসগুলিতে আপনার মিডিয়া অ্যাপের অভিজ্ঞতা উন্নত করতে, আপনি আপনার অ্যাপে ডিপ লিঙ্কের জন্য সমর্থন যোগ করতে পারেন। উদাহরণস্বরূপ, এটি ব্যবহারকারীদের সরাসরি ব্রাউজার থেকে অথবা কুইক শেয়ার ব্যবহার করে ফোন থেকে শেয়ার করা কোনো ইউআরএল পাওয়ার পর আপনার অ্যাপটি খোলার সুযোগ দেয়।

ডিপ লিঙ্ক ইন্টেন্ট ফিল্টার যোগ করুন

আপনার অ্যাপটি যে ডিপ লিঙ্ক পরিচালনা করতে সক্ষম, তা অপারেটিং সিস্টেমকে (OS) জানানোর জন্য, এতে উপযুক্ত ইন্টেন্ট ফিল্টারসহ অ্যাক্টিভিটি থাকা প্রয়োজন। ডিপ লিঙ্কের জন্য ব্যবহৃত ইন্টেন্ট ফিল্টারের ফরম্যাট সম্পর্কে নির্দেশনার জন্য ‘ইনকামিং লিঙ্কের জন্য ইন্টেন্ট ফিল্টার যোগ করুন’ দেখুন।

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

আপনার অ্যাপের অ্যাক্টিভিটি শুরু করতে ব্যবহৃত ইন্টেন্টটি কীভাবে পড়তে ও সে অনুযায়ী প্রতিক্রিয়া জানাতে হয়, সে বিষয়ে নির্দেশনার জন্য ‘ইনকামিং ইন্টেন্ট থেকে ডেটা পড়ুন’ দেখুন।

যেহেতু ব্রাউজিং এবং প্লেব্যাকের জন্য UI হোস্ট অ্যাপ দ্বারা তৈরি করা হয়, তাই প্লেব্যাক এবং ব্রাউজিং অ্যাকশনের জন্য ডিপ লিঙ্কগুলি পরিচালনা করতে ব্যবহৃত অ্যাক্টিভিটির নিজস্ব কোনো UI থাকা উচিত নয়।

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

fun DeepLinkTrampolineActivity : ComponentActivity() {

  override fun onCreate() {
    handleIntent(intent)
  }

  override fun onNewIntent(intent: Intent) {
    handleIntent(intent)
  }

  private fun handleIntent(intent: Intent) {
    // Handle any side effects, such as adding a song to the queue
    ...
    // Build the intent used to start the media host app
    val startMediaHostIntent = ...
    startActivity(intent)
    // Finish the activity immediately so it isn't shown on screen
    finish()
  }
}

মিডিয়া হোস্টের ইঙ্গিতগুলো পড়ুন

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

ত্রুটি পরিচালনা

অ্যান্ড্রয়েড অটোমোটিভ ওএস-এর মিডিয়া অ্যাপে কোনো ত্রুটি হলে, তা মিডিয়া সেশনের PlaybackStateCompat ব্যবহার করে জানানো হয়। সব ধরনের ত্রুটির জন্য, PlaybackStateCompat এ একটি উপযুক্ত এরর কোড এবং এরর মেসেজ সেট করুন। এর ফলে ইউজার ইন্টারফেসে (UI) একটি Toast প্রদর্শিত হবে।

যখন কোনো ত্রুটি ঘটে কিন্তু প্লেব্যাক চলতে পারে, তখন একটি নন-ফেটাল এরর (nonfatal error ) দেখান। উদাহরণস্বরূপ, একজন ব্যবহারকারী সাইন ইন করার আগেই কোনো অ্যাপে গান চালাতে পারেন, কিন্তু একটি গান স্কিপ করার আগে তাকে অবশ্যই সাইন ইন করতে হবে। যখন আপনি একটি নন-ফেটাল এরর ব্যবহার করেন, তখন সিস্টেমটি বর্তমান মিডিয়া আইটেমটির প্লেব্যাকে বাধা না দিয়েই ব্যবহারকারীকে সাইন ইন করার পরামর্শ দিতে পারে।

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

যখন প্লেব্যাক সম্ভব নয়, যেমন ইন্টারনেট সংযোগ না থাকলে এবং কোনো অফলাইন কন্টেন্ট না থাকলে, PlaybackStateCompat স্টেটটিকে STATE_ERROR এ সেট করুন।

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

যদি কোনো কারণে আপনি একটি ব্রাউজ ট্রি লোড করতে না পারেন—উদাহরণস্বরূপ, যদি আপনার প্রমাণীকরণের প্রয়োজন হয় এবং ব্যবহারকারী সাইন ইন করা না থাকে—তাহলে একটি খালি ব্রাউজ ট্রি পাঠান। এটি বোঝানোর জন্য, রুট মিডিয়া নোডের জন্য onLoadChildren() থেকে একটি null ফলাফল রিটার্ন করুন। যখন এটি ঘটে, সিস্টেমটি PlaybackStateCompat এ সেট করা ত্রুটির বার্তা সহ একটি পূর্ণ-স্ক্রিন ত্রুটি প্রদর্শন করে।

কার্যকরী ত্রুটি

যদি কোনো ত্রুটির বিরুদ্ধে ব্যবস্থা গ্রহণ করা যায়, তাহলে PlaybackStateCompat এ অতিরিক্তভাবে নিম্নলিখিত দুটি এক্সট্রা সেট করুন:

  • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL : ত্রুটি সমাধান করার জন্য ক্লিক করার বাটনের একটি লেবেল। যেহেতু এই স্ট্রিংটি ব্যবহারকারীর সামনে প্রদর্শিত হয়, তাই এটিকে ব্যবহারকারীর বর্তমান লোকেল অনুযায়ী স্থানীয়করণ করুন।
  • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT : এটি সেই PendingIntent যা বাটনটি ত্রুটি সমাধান করার জন্য চালায়, যেমন আপনার সাইন-ইন অ্যাক্টিভিটি চালু করার মাধ্যমে।

সমাধানযোগ্য ত্রুটিগুলো একটি Dialog হিসেবে প্রদর্শিত হয় এবং ব্যবহারকারীরা কেবল গাড়ি থামানো অবস্থাতেই তা সমাধান করতে পারেন।

পরীক্ষার ত্রুটির ঘটনা

যাচাই করুন যে আপনার অ্যাপটি নিম্নলিখিত সকল পরিস্থিতিতে ত্রুটিগুলি সুষ্ঠুভাবে সামাল দেয়:

  • আপনার পণ্যের বিভিন্ন স্তর: যেমন, ফ্রি বনাম প্রিমিয়াম অথবা সাইন ইন করা বনাম সাইন আউট করা।
  • ড্রাইভের বিভিন্ন অবস্থা: যেমন, পার্ক করা বনাম চালানো।
  • সংযোগের বিভিন্ন অবস্থা: যেমন, অনলাইন বনাম অফলাইন

অন্যান্য বিবেচ্য বিষয়

আপনার অ্যান্ড্রয়েড অটোমোটিভ ওএস অ্যাপ তৈরি করার সময় এই অন্যান্য বিষয়গুলোও মনে রাখবেন:

অফলাইন বিষয়বস্তু

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

আপনার অফলাইন সাপোর্ট কৌশল বিবেচনা করার সময় কয়েকটি বিষয় মনে রাখবেন:

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

ওয়েবভিউ সমর্থন

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

ওয়েবভিউ ব্যবহারের কিছু গ্রহণযোগ্য উদাহরণ নিচে দেওয়া হলো:

  • আপনার সেটিংস কার্যক্রমে আপনার গোপনীয়তা নীতি, পরিষেবার শর্তাবলী বা অন্যান্য আইন-সম্পর্কিত লিঙ্ক প্রদর্শন করা।
  • আপনার সাইন-ইন কার্যক্রমে একটি ওয়েব-ভিত্তিক প্রক্রিয়া।

WebView ব্যবহার করার সময় আপনি জাভাস্ক্রিপ্ট সক্রিয় করতে পারেন।

আপনার ওয়েবভিউ সুরক্ষিত করুন

আপনার WebView যেন বৃহত্তর ইন্টারনেটে প্রবেশের একটি পথ না হয়ে ওঠে, তা নিশ্চিত করতে সম্ভাব্য সকল সতর্কতা অবলম্বন করুন। loadUrl() ` কলে ব্যবহৃত URL-এ WebView-কে লক করে রিডাইরেক্ট প্রতিরোধ করার একটি উদাহরণের জন্য নিম্নলিখিত কোড স্নিপেটটি দেখুন। আমরা দৃঢ়ভাবে সুপারিশ করি যে, যখনই সম্ভব, যেমন আইন-সম্পর্কিত লিঙ্ক প্রদর্শনের ক্ষেত্রে, আপনি এই ধরনের সুরক্ষা ব্যবস্থা প্রয়োগ করুন।

কোটলিন

override fun shouldOverrideUrlLoading(webView: WebView,
                             webResourceRequest: WebResourceRequest): Boolean {
  val originalUri: Uri = Uri.parse(webView.originalUrl)
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.url)) {
    return false
  }
  if (webResourceRequest.isRedirect) {
    logger.w("Redirect detected, not following")
    return true
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url)
  logger.w(
    String.format(
      "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri))
  return true
}

জাভা

@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) {
  Uri originalUri = Uri.parse(webView.getOriginalUrl());
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.getUrl())) {
    return false;
  }
  if (webResourceRequest.isRedirect()) {
    logger.w("Redirect detected, not following");
    return true;
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl());
  logger.w(
      String.format(
          "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri));
  return true;
}

প্যাকেজের নাম

যেহেতু আপনি অ্যান্ড্রয়েড অটোমোটিভ ওএস-এর জন্য একটি আলাদা অ্যান্ড্রয়েড প্যাকেজ কিট (APK) বিতরণ করেন, তাই আপনি আপনার মোবাইল অ্যাপের প্যাকেজ নামটি পুনরায় ব্যবহার করতে পারেন অথবা একটি নতুন প্যাকেজ নাম তৈরি করতে পারেন। আপনি যদি একটি ভিন্ন প্যাকেজ নাম ব্যবহার করেন, তাহলে আপনার অ্যাপের প্লে স্টোরে দুটি আলাদা তালিকা থাকবে। আপনি যদি আপনার বর্তমান প্যাকেজ নামটি পুনরায় ব্যবহার করেন, তাহলে উভয় প্ল্যাটফর্মে আপনার অ্যাপের একটিই তালিকা থাকবে।

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

আপনার বর্তমান প্যাকেজের নাম রাখা এবং নতুন প্যাকেজের নাম ব্যবহার করার মধ্যে আরও কিছু মূল পার্থক্য নিচের সারণিতে সংক্ষেপে তুলে ধরা হলো:

বৈশিষ্ট্য একই প্যাকেজের নাম নতুন প্যাকেজের নাম
দোকানের তালিকা একক একাধিক
মিররড ইনস্টল হ্যাঁ: সেটআপ উইজার্ডের সময় "দ্রুত অ্যাপ পুনরায় ইনস্টল"। না
প্লে স্টোর পর্যালোচনা প্রক্রিয়া রিভিউ ব্লক করা: যদি কোনো একটি APK-এর রিভিউ ব্যর্থ হয়, তাহলে একই রিলিজে জমা দেওয়া অন্যান্য APK-গুলোও ব্লক হয়ে যায়। ব্যক্তিগত পর্যালোচনা
পরিসংখ্যান, মেট্রিক এবং গুরুত্বপূর্ণ বিষয় সমন্বিতভাবে: আপনি গাড়ি-সংক্রান্ত নির্দিষ্ট ডেটা ফিল্টার করতে পারেন। পৃথক
ইনডেক্সিং এবং সার্চ র‍্যাঙ্কিং বর্তমান অবস্থানের উপর ভিত্তি করে গড়ে তুলুন কোনো ক্যারিওভার নেই
অন্যান্য অ্যাপের সাথে একীভূত করা সম্ভবত কোনো পরিবর্তনের প্রয়োজন নেই, যদি ধরে নেওয়া হয় যে উভয় APK-এর মধ্যে মিডিয়া কোড একই। সংশ্লিষ্ট অ্যাপটি আপডেট করতে হতে পারে, যেমন গুগল অ্যাসিস্ট্যান্টের মাধ্যমে ইউআরআই প্লেব্যাকের জন্য।

প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী

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

হার্ডওয়্যার

আমার অ্যাপ কি মাইক্রোফোন অ্যাক্সেস করতে পারবে?

অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) বা তার উচ্চতর সংস্করণের অ্যাপগুলির জন্য, অডিও ইনপুট শেয়ারিং সংক্রান্ত ডকুমেন্টেশন দেখুন। এপিআই লেভেল ২৯-এর আগে এটি সম্ভব নয়।

আমরা কোন কোন গাড়ির এপিআই (API) অ্যাক্সেস করতে পারব এবং কীভাবে?

আপনি OEM কর্তৃক উন্মুক্ত করা API-গুলোর মধ্যেই সীমাবদ্ধ থাকবেন। এই API-গুলো অ্যাক্সেস করার পদ্ধতিকে প্রমিত করার জন্য প্রক্রিয়া তৈরি করা হচ্ছে।

অ্যাপগুলো CarPropertyManager এর SetProperty() এবং GetProperty() ব্যবহার করে গাড়ির API অ্যাক্সেস করতে পারে। উপলব্ধ সমস্ত প্রপার্টির তালিকা দেখতে সোর্স কোড বা রেফারেন্স ডকুমেন্টেশন দেখুন। যদি প্রপার্টিটি @SystemApi দিয়ে অ্যানোটেট করা থাকে, তবে এটি শুধুমাত্র প্রি-লোডেড সিস্টেম অ্যাপের জন্য সীমাবদ্ধ থাকে।

কোন কোন ধরনের অডিও কোডেক সমর্থিত?

অ্যান্ড্রয়েড সিডিডি-তে অডিও কোডেক বিবরণ দেখুন।

ওয়াইডভাইন কি ডিআরএম সমর্থন করে?

হ্যাঁ, ওয়াইডভাইন ডিআরএম সমর্থিত।

উন্নয়ন এবং পরীক্ষা

তৃতীয় পক্ষের SDK এবং লাইব্রেরি ব্যবহারের ক্ষেত্রে কোনো বিধিনিষেধ বা সুপারিশ আছে কি?

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

আমি কি ফোরগ্রাউন্ড সার্ভিস ব্যবহার করতে পারি?

ফোরগ্রাউন্ড সার্ভিসের একমাত্র অনুমোদিত ব্যবহার হলো অফলাইনে ব্যবহারের জন্য কন্টেন্ট ডাউনলোড করা। ফোরগ্রাউন্ড সার্ভিসের জন্য আপনার যদি অন্য কোনো ব্যবহারের ক্ষেত্র থাকে যার জন্য আপনি সমর্থন দেখতে চান, তাহলে Android Automotive OS আলোচনা গ্রুপ ব্যবহার করে আমাদের সাথে যোগাযোগ করুন।

অ্যান্ড্রয়েড অটোমোটিভ ওএস অ্যাপ প্রকাশ করা

আমি কীভাবে গুগল প্লে কনসোল ব্যবহার করে আমার অ্যান্ড্রয়েড অটোমোটিভ ওএস অ্যাপটি প্রকাশ করব?

গুগল প্লে কনসোল ব্যবহার করে আপনার অ্যান্ড্রয়েড অটোমোটিভ ওএস অ্যাপটি কীভাবে প্রকাশ করবেন সে সম্পর্কে বিস্তারিত জানতে, ‘গাড়িতে বিতরণ করুন’ দেখুন।

অতিরিক্ত সম্পদ

অ্যান্ড্রয়েড অটোমোটিভ ওএস সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্সগুলো দেখুন।

নমুনা

গাইড

ব্লগ

ভিডিও

অ্যান্ড্রয়েড অটোমোটিভ ওএস মিডিয়া সংক্রান্ত সমস্যা রিপোর্ট করুন

অ্যান্ড্রয়েড অটোমোটিভ ওএস-এর জন্য আপনার মিডিয়া অ্যাপ তৈরি করার সময় কোনো সমস্যা হলে, আপনি গুগল ইস্যু ট্র্যাকার ব্যবহার করে তা জানাতে পারেন। ইস্যু টেমপ্লেটে অনুরোধ করা সমস্ত তথ্য অবশ্যই পূরণ করবেন।

একটি নতুন সমস্যা তৈরি করুন

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