গাড়ি চালানোর অবস্থা এবং UX বিধিনিষেধ গ্রহণ করুন

এই পৃষ্ঠাটি ব্যাখ্যা করে যে কীভাবে অ্যাপগুলি বিক্ষিপ্তভাবে অপ্টিমাইজড (DO) ব্যবহারকারী ইন্টারফেসে রূপান্তর করতে পারে। এটি একটি গাড়ির ড্রাইভিং অবস্থার পাশাপাশি সংশ্লিষ্ট ব্যবহারকারীর অভিজ্ঞতার বিধিনিষেধগুলি কীভাবে ব্যবহার করতে হয় তা বর্ণনা করে৷ কার ইউজার এক্সপেরিয়েন্স (ইউএক্স) বিধিনিষেধ সম্পর্কে আরও তথ্যের জন্য, গাড়ি ব্যবহারকারীর অভিজ্ঞতার বিধিনিষেধ দেখুন, যা পার্কড, আইডলিং এবং মুভিং-এর তিনটি ড্রাইভিং অবস্থার বিবরণ দেয়।

শ্রোতা

এই বিষয়বস্তুটি তাদের জন্য সরবরাহ করা হয়েছে যারা এমন অ্যাপ ডিজাইন করতে চান যা গাড়ির ড্রাইভিং অবস্থার পরিবর্তন এবং সেইসঙ্গে আরোপিত UX বিধিনিষেধের সাথে খাপ খায়।

প্রযুক্তিগত বিবরণ

CarDrivingStateManager

গাড়ির ড্রাইভিং অবস্থা (পার্ক করা, ইডলিং, বা মুভিং) ভেহিকল হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (VHAL) দ্বারা প্রদত্ত সেন্সর মান থেকে উদ্ভূত হয়। বেসিক সেন্সর তথ্য, যেমন গাড়ির গতি এবং বর্তমান গিয়ার নির্বাচন, গাড়ির বর্তমান ড্রাইভিং অবস্থা বের করতে ব্যবহৃত হয়।

CarDrivingStateEvent

যা @SystemApis প্রদান করে, যার অর্থ শুধুমাত্র প্ল্যাটফর্ম অভ্যন্তরীণ, একত্রিত APK (যেমন SysUI বা সেটিংস), এবং বিশেষাধিকারপ্রাপ্ত APKs (যেমন) GMSCore APIs অ্যাক্সেস করতে পারে। API গুলি ড্রাইভিং স্টেট android.car.permission.CAR_DRIVING_STATE নির্দিষ্ট অনুমতি দ্বারা সুরক্ষিত। যে ক্লায়েন্টদের ড্রাইভিং স্টেট তথ্যে অ্যাক্সেস প্রয়োজন তাদের অবশ্যই এই অনুমতির অনুরোধ করতে হবে।

CarUxRestrictionsManager

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

দ্রষ্টব্য : এই ক্রিয়াকলাপগুলিকে অবশ্যই বিক্ষিপ্তকরণ অপ্টিমাইজড হিসাবে চিহ্নিত করতে হবে , যেমনটি ড্রাইভারের বিভ্রান্তি নির্দেশিকাগুলিতে বর্ণিত হয়েছে৷ ক্রিয়াকলাপগুলি সেই অনুযায়ী চিহ্নিত না হলে, সেগুলি ব্লক করা হয়েছে৷

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

কোড নমুনা

নিম্নলিখিত নমুনা কোডটি ব্যাখ্যা করে কিভাবে একটি অ্যাপ UX সীমাবদ্ধতা নিরীক্ষণ করে:

  1. গাড়ী লাইব্রেরি প্যাকেজ আমদানি করুন:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. CarUxRestrictionManager.OnUxRestrictionsChangedListener ( mUxRChangeListener ) প্রয়োগ করুন। এই শ্রোতা, যখন CarUxRestrictionsManager- এর সাথে নিবন্ধিত হয়, তখন UX বিধিনিষেধের পরিবর্তন ঘটলে ডাকা হয়। প্রয়োজন অনুসারে বিভ্রান্তি অপ্টিমাইজ করার জন্য সীমাবদ্ধতা পরিবর্তনগুলি পরিচালনা করুন:
    @Nullable private CarUxRestrictionsManager mCarUxRestrictionsManager;
    private CarUxRestrictions mCurrentUxRestrictions;
    
    /* Implement the onUxRestrictionsChangedListener interface */
    private CarUxRestrictionsManager.OnUxRestrictionsChangedListener mUxrChangeListener =
                new CarUxRestrictionsManager.OnUxRestrictionsChangedListener()
        {
            @Override
            public void onUxRestrictionsChanged(CarUxRestrictions carUxRestrictions) {
            mCurrentUxRestrictions = carUxRestrictions;
            /* Handle the new restrictions */
            handleUxRestrictionsChanged(carUxRestrictions);
            }
        };
      
  3. mCar নামে একটি গাড়ির ইন্সট্যান্স তৈরি করতে এবং গাড়ি পরিষেবার সাথে সংযোগ করতে কার API-কে কল করুন:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
  4. CarUxRestrictionsManager পেতে mCar.getCarManager() - mCarUxRestrictionsManager কল করুন:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
  5. উপরে 2 ধাপে বাস্তবায়িত mUxRChangeListener রেজিস্টার করতে CarUxRestrictionsManager এর সাথে কল করুন mCarUxRestrictionsManager.registerListener() :
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

নমুনা কোডের সম্পূর্ণ ব্লক (ধাপ 3 থেকে ধাপ 5 এ তৈরি) ফলে শ্রোতা প্রাপ্ত সীমাবদ্ধতা পরিবর্তন করে যখন ড্রাইভের অবস্থা পরিবর্তন হয়:

mCar = Car.createCar(context);
if (mCar == null) {
// handle car connection error
}

CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);

mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
mUxrChangeListener.onUxRestrictionsChanged(
mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

CarUx বিধিনিষেধ

CarUxRestrictions অবজেক্ট দুই ধরনের তথ্য প্রদান করে:

  1. বিক্ষিপ্ততা অপ্টিমাইজ করা একটি বর্তমান প্রয়োজন আছে?
  2. যদি তাই হয়, বর্তমানে কি বিধিনিষেধ আছে?

যখন getCurrentUxRestrictions() বা শ্রোতা কলব্যাক থেকে CarUxRestrictions প্রাপ্ত করা হয়, তখন অ্যাপগুলি এখন isRequiresDistractionOptimization() API ব্যবহার করে ডিস্ট্রাকশন অপ্টিমাইজ করা প্রয়োজন কিনা তা নির্ধারণ করতে পারে। যদি এটি false প্রত্যাবর্তন করে, তাহলে ডিস্ট্রাকশন অপ্টিমাইজড হওয়ার কোন প্রয়োজন নেই এবং একটি অ্যাপ নিরাপদে যেকোনো কার্যকলাপ চালাতে পারে।

যদি অপ্টিমাইজেশনের প্রয়োজন হয়, তাহলে সীমাবদ্ধতার সেট পেতে getActiveRestrictions() API ব্যবহার করুন। এই API একটি int প্রদান করে, যা বর্তমানে কার্যকর সমস্ত বিধিনিষেধের একটি বিট মাস্ক। বর্তমানে বিজ্ঞাপিত বিধিনিষেধের সেট CarUxRestrictions অধীনে তালিকাভুক্ত করা হয়েছে।

দ্রষ্টব্য: বিধিনিষেধের সেটে ছোটখাটো পরিবর্তন অদূর ভবিষ্যতে ঘটতে পারে বলে আশা করা হচ্ছে।

উদাহরণস্বরূপ, CarUxRestrictions অবজেক্ট পাওয়ার পরে, যদি কোনও অ্যাপ ভিডিও চালানোর জন্য কোনও বিধিনিষেধ বিদ্যমান কিনা তা নির্ধারণ করতে চায়, অ্যাপটিকে অবশ্যই সীমাবদ্ধতা পরীক্ষা করতে হবে:

int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions();
if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) {
      handleStopPlayingVideo();
}

ড্রাইভিং স্টেট

CarDrivingStateManager গাড়ির প্রকৃত ড্রাইভিং অবস্থা উপস্থাপন করে (পার্ক করা, অলস বা চলন্ত)। CarDrivingStateManager API-কে CarUxRestrictionsManager-এর মতো বলা যেতে পারে। অ্যাপগুলি একজন শ্রোতা নিবন্ধন করতে পারে বা বর্তমান ড্রাইভিং অবস্থা পেতে পারে। ড্রাইভিং স্টেট CarDrivingStateEvent হিসাবে ফিরে আসে।

CarDrivingStateEvent

পরিবর্তন হলে, onDrivingStateChanged() পদ্ধতিটিকে নতুন CarDrivingStateEvent দিয়ে ডাকা হয়।

import android.car.Car;
/* For CarDrivingState */
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateManager;

mDrivingStateManager = (CarDrivingStateManager) mCar.getCarManager(
       Car.CAR_DRIVING_STATE_SERVICE);
/* Register the listener (implemented below) */
mDrivingStateManager.registerListener(mDrivingStateEventListener);
/* While we wait for a change to be notified, query the current state */
mDrivingStateEvent = mDrivingStateManager.getCurrentCarDrivingState();

private final CarDrivingStateManager.CarDrivingStateEventListener
mDrivingStateEventListener =
       new CarDrivingStateManager.CarDrivingStateEventListener() {
   @Override
   public void onDrivingStateChanged(CarDrivingStateEvent event) {
       mDrivingStateEvent = event;
       /* handle the state change accordingly */
       handleDrivingStateChange();
   }
};

টেস্টিং

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

ড্রাইভিং ইভেন্ট অনুকরণ করতে:

  1. গতি 0 এ সেট করতে:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
  2. পার্ক করা গিয়ার সেট করতে (PARKED এর দিকে নির্দেশ করে CarDrivingStateEvent অনুকরণ করতে):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. ড্রাইভে গিয়ার সেট করতে, স্পিড এখনও 0 এ (আইডিলিং-এর দিকে নির্দেশ করে CarDrivingStateEvent অনুকরণ করতে):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
  4. প্রতি সেকেন্ডে 30 মিটার গতি সেট করতে (চলতে থাকা CarDrivingStateEvent অনুকরণ করতে):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30