कार के ड्राइविंग स्टेटस और यूज़र एक्सपीरियंस (UX) से जुड़ी पाबंदियों का इस्तेमाल करना

इस पेज पर बताया गया है कि ऐप्लिकेशन, ध्यान भटकाने वाले कॉन्टेंट को कम करने वाले (डीओ) यूज़र इंटरफ़ेस पर आसानी से कैसे ट्रांज़िशन कर सकते हैं. इसमें, कार की ड्राइविंग की स्थिति के साथ-साथ, उपयोगकर्ता अनुभव से जुड़ी पाबंदियों को इस्तेमाल करने का तरीका बताया गया है. कार के यूज़र एक्सपीरियंस (UX) से जुड़ी पाबंदियों के बारे में ज़्यादा जानने के लिए, कार के यूज़र एक्सपीरियंस से जुड़ी पाबंदियां देखें. इसमें, कार के पार्क होने, इंजन के चलने, और चलने की तीन स्थितियों के बारे में बताया गया है.

ऑडियंस

यह कॉन्टेंट उन लोगों के लिए उपलब्ध है जो कार के ड्राइविंग स्टेटस और उससे जुड़ी यूज़र एक्सपीरियंस (यूएक्स) से जुड़ी पाबंदियों में होने वाले बदलावों के हिसाब से ऐप्लिकेशन डिज़ाइन करना चाहते हैं.

तकनीकी जानकारी

CarDrivingStateManager

कार की ड्राइविंग स्टेटस (पार्क की गई, इंजन चालू है या चल रही है) का पता, वाहन हार्डवेयर एब्स्ट्रैक्शन लेयर (वीएचएएल) से मिली सेंसर वैल्यू से चलता है. वाहन की मौजूदा ड्राइविंग स्थिति का पता लगाने के लिए, सेंसर से मिली बुनियादी जानकारी का इस्तेमाल किया जाता है. जैसे, वाहन की रफ़्तार और चुना गया मौजूदा गियर.

CarDrivingStateEvent.

@SystemApis उपलब्ध कराता है. इसका मतलब है कि सिर्फ़ प्लैटफ़ॉर्म के अंदरूनी हिस्से, बंडल किए गए APK (जैसे कि SysUI या Settings) और खास सुविधाओं वाले APK (जैसे कि) GMSCore, एपीआई को ऐक्सेस कर सकते हैं. एपीआई को ड्राइविंग की स्थिति android.car.permission.CAR_DRIVING_STATE से जुड़ी अनुमतियों से सुरक्षित किया जाता है. जिन क्लाइंट को ड्राइविंग की स्थिति की जानकारी ऐक्सेस करनी है उन्हें इस अनुमति का अनुरोध करना होगा.

CarUxRestrictionsManager

जिन ऐप्लिकेशन में ड्राइविंग की स्थिति के हिसाब से यूज़र इंटरफ़ेस दिखता है उन्हें CarUxRestrictionsManager को सुनना होगा. यह ड्राइविंग की स्थिति से यूज़र इंटरफ़ेस की पाबंदियों को मैप करता है, ताकि ऐप्लिकेशन को सुरक्षा से जुड़ी अलग-अलग मार्केट की ज़रूरी शर्तों के हिसाब से अडजस्ट करने की ज़रूरत न पड़े.

ध्यान दें: इन गतिविधियों को ड्राइवर का ध्यान भटकाने से जुड़े दिशा-निर्देशों में बताए गए तरीके के मुताबिक, ध्यान भटकाने वाली गतिविधियों के तौर पर मार्क करना ज़रूरी है. अगर गतिविधियों को इस हिसाब से मार्क नहीं किया जाता है, तो उन्हें ब्लॉक कर दिया जाता है.

इसके बजाय, ऐप्लिकेशन CarUxRestrictionsManager से बताई गई पाबंदियों को मॉनिटर करते हैं. ये पाबंदियां, कार चलाने की सटीक स्थिति से जुड़ी नहीं होतीं. कार चलाने की सटीक स्थिति, CarDrivingStateManager से पता चलती है. यह स्थिति, उपयोगकर्ता इंटरफ़ेस या उपयोगकर्ता अनुभव से जुड़ी किसी भी चीज़ के लिए नहीं होती.

कोड का सैंपल

नीचे दिए गए सैंपल कोड से पता चलता है कि कोई ऐप्लिकेशन, यूज़र एक्सपीरियंस से जुड़ी पाबंदियों को कैसे मॉनिटर करता है:

  1. कार लाइब्रेरी के पैकेज इंपोर्ट करें:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener) लागू करें. CarUxRestrictionsManager के साथ रजिस्टर होने पर, यूज़र इंटरफ़ेस से जुड़ी पाबंदियों में बदलाव होने पर, इस लिसनर को कॉल किया जाता है. ज़रूरत के हिसाब से, ध्यान भटकाने वाली चीज़ों को ऑप्टिमाइज़ करने के लिए, पाबंदी में किए गए बदलावों को मैनेज करें:
    @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 नाम का कार इंस्टेंस बनाने और कार सेवा से कनेक्ट करने के लिए, कार एपीआई को कॉल करें:
    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. ऊपर दूसरे चरण में लागू किए गए mUxRChangeListener को CarUxRestrictionsManager कॉल mCarUxRestrictionsManager.registerListener() के साथ रजिस्टर करने के लिए:
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

सैंपल कोड का पूरा ब्लॉक (तीसरे से लेकर पांचवें चरण तक बनाया गया) होने पर, ड्राइव की स्थिति में बदलाव होने पर, लिसनर को पाबंदी से जुड़े बदलाव मिलते हैं:

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());

CarUxRestrictions

CarUxRestrictions ऑब्जेक्ट दो तरह की जानकारी देता है:

  1. क्या ध्यान भटकाने वाली चीज़ों को ऑप्टिमाइज़ करने के लिए, कोई मौजूदा ज़रूरी शर्त है?
  2. अगर हां, तो फ़िलहाल कौनसी पाबंदियां लागू हैं?

जब CarUxRestrictions को getCurrentUxRestrictions() या listener कॉलबैक से पाया जाता है, तो ऐप्लिकेशन अब isRequiresDistractionOptimization() एपीआई का इस्तेमाल करके यह तय कर सकते हैं कि ध्यान भटकाने वाली चीज़ों से बचने के लिए ऑप्टिमाइज़ किए गए विज्ञापन दिखाने की ज़रूरत है या नहीं. अगर यह false दिखाता है, तो ऐप्लिकेशन को ध्यान भटकाने वाली गतिविधियों को कम करने के लिए ऑप्टिमाइज़ करने की ज़रूरत नहीं है. साथ ही, ऐप्लिकेशन किसी भी गतिविधि को सुरक्षित तरीके से चला सकता है.

अगर ऑप्टिमाइज़ेशन ज़रूरी है, तो getActiveRestrictions() एपीआई का इस्तेमाल करके, लागू पाबंदियों का सेट पाएं. यह एपीआई एक int दिखाता है, जो फ़िलहाल लागू सभी पाबंदियों का बिट मास्क होता है. फ़िलहाल, पाबंदियों का जो सेट बताया गया है वह CarUxRestrictions में दिया गया है.

ध्यान दें: आने वाले समय में, पाबंदियों के सेट में छोटे बदलाव किए जा सकते हैं.

उदाहरण के लिए, अगर किसी ऐप्लिकेशन को यह पता करना है कि वीडियो चलाने पर पाबंदी है या नहीं, तो CarUxRestrictions ऑब्जेक्ट मिलने के बाद, ऐप्लिकेशन को पाबंदी की जांच करनी होगी:

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

DrivingState

CarDrivingStateManager, वाहन की ड्राइविंग की असल स्थिति दिखाता है. जैसे, पार्क किया गया, इंजन चालू है या चल रहा है. CarDrivingStateManager एपीआई को 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 मीटर प्रति सेकंड पर सेट करने के लिए (MOVING पर ले जाने वाले CarDrivingStateEvent को सिम्युलेट करने के लिए):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30