'कार के लिए Android ऐप्लिकेशन' की लाइब्रेरी का इस्तेमाल करना

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

यह गाइड, लाइब्रेरी की मुख्य सुविधाओं और सिद्धांतों के बारे में खास जानकारी देती है. बेसिक ऐप्लिकेशन को सेट अप करने की प्रोसेस के बारे में जानकारी देता है.

शुरू करने से पहले

  1. डिज़ाइन फ़ॉर ड्राइविंग देखें कार ऐप्लिकेशन लाइब्रेरी को कवर करने वाले पेज
  2. यहां दी गई मुख्य शर्तों और सिद्धांतों को पढ़ें सेक्शन में जाएं.
  3. स्वयं को Android Auto सिस्टम के बारे में जानें यूज़र इंटरफ़ेस (यूआई) और Android Automotive OS डिज़ाइन के लिए जानी जाती है.
  4. रिलीज़ नोट देखें.
  5. सैंपल देखें.

मुख्य शब्द और सिद्धांत

मॉडल और टेंप्लेट
यूज़र इंटरफ़ेस को मॉडल ऑब्जेक्ट के ग्राफ़ से दिखाया जाता है. इस ग्राफ़ को टेंप्लेट के हिसाब से, उन्हें अलग-अलग तरीकों से व्यवस्थित किया जा सकता है से. टेंप्लेट उन मॉडल के सबसेट होते हैं जो उन ग्राफ़. मॉडल में उपयोगकर्ता को दिखाई जाने वाली जानकारी शामिल होती है के पहलुओं को कॉन्फ़िगर करने के लिए विशेषताओं को शामिल किया है. ऐसी जानकारी को विज़ुअल के तौर पर दिखाना—उदाहरण के लिए, टेक्स्ट के रंग या इमेज साइज़. होस्ट, मॉडल को ऐसे व्यू में बदल देता है जो पूरा होने के लिए डिज़ाइन किए गए हों ड्राइवर का ध्यान भटकने से रोकने के लिए तय किए गए स्टैंडर्ड और ध्यान रखता है कि कार की स्क्रीन फ़ैक्टर और इनपुट के मोडलिटी पर ध्यान दिया जाता है.
होस्ट
होस्ट, बैकएंड कॉम्पोनेंट है जो दी गई सुविधा को लागू करता है के एपीआई का इस्तेमाल करें, ताकि आपका ऐप्लिकेशन कार में चल सके. कॉन्टेंट बनाने होस्ट की ज़िम्मेदारियां, आपके ऐप्लिकेशन को खोजने से लेकर उसे मैनेज करने तक की हैं आपके मॉडल को व्यू में बदलने और ऐप्लिकेशन को सूचना भेजने की यह लाइफ़साइकल उपयोगकर्ता इंटरैक्शन की संख्या बढ़ानी होती है. मोबाइल डिवाइसों पर, Android इस होस्ट को लागू करता है ऑटो. Android Automotive OS पर, यह होस्ट, सिस्टम ऐप्लिकेशन के तौर पर इंस्टॉल होता है.
टेंप्लेट की पाबंदियां
अलग-अलग टेंप्लेट अपने मॉडल के कॉन्टेंट पर पाबंदियां लागू करते हैं. इसके लिए उदाहरण के लिए, सूची टेंप्लेट में उन आइटम की संख्या की सीमा तय होती है जिन्हें उपयोगकर्ता को दिखाई जाती हैं. टेंप्लेट में भी कुछ पाबंदियां होती हैं. वेब पर किसी टास्क को पूरा किया जा सकता है. उदाहरण के लिए, ऐप्लिकेशन सिर्फ़ स्क्रीन स्टैक में ज़्यादा से ज़्यादा पाँच टेंप्लेट शामिल किए जा सकते हैं. यहां जाएं: ज़्यादा जानकारी के लिए, टेंप्लेट की पाबंदियां देखें.
Screen
Screen एक क्लास है जिसे लाइब्रेरी, जिसे ऐप्लिकेशन, उपयोगकर्ता. Screen में लाइफ़साइकल का इस्तेमाल करती है. इससे ऐप्लिकेशन को स्क्रीन के दिखने पर टेंप्लेट को दिखाने के लिए भेजें. Screen इंस्टेंस को भी पुश किया जा सकता है और Screen स्टैक में पॉप-अप हुआ और उससे पॉप-अप हुआ, जिसमें का पालन करता है, टेंप्लेट के फ़्लो से जुड़ी पाबंदियां.
CarAppService
CarAppService आपके ऐप्लिकेशन के बारे में ऐब्सट्रैक्ट Service क्लास को लागू और एक्सपोर्ट करना होगा, ताकि होस्ट इसे खोज और मैनेज कर सके. आपके ऐप्लिकेशन का CarAppService का इस्तेमाल करके, वे यह पक्का करते हैं कि होस्ट कनेक्शन पर भरोसा किया जा सकता है या नहीं createHostValidator और बाद में Session उपलब्ध करा रहा है का इस्तेमाल करके हर कनेक्शन के लिए इंस्टेंस onCreateSession.
Session

Session एक ऐब्सट्रैक्ट क्लास है, जो आपके ऐप्लिकेशन को इसे लागू करना होगा और इसका इस्तेमाल करके वापस आना होगा CarAppService.onCreateSession. यह कार की स्क्रीन पर जानकारी दिखाने के लिए, एंट्री पॉइंट की तरह काम करता है. यह एक लाइफ़साइकल होती है, जो कार की स्क्रीन पर, आपके ऐप्लिकेशन की मौजूदा स्थिति. जैसे, जब आपका ऐप्लिकेशन दिखता या छिपाया जाता है.

जब Session चालू हो, जैसे जब ऐप्लिकेशन पहली बार लॉन्च किया जाता है, तो होस्ट, Screen का इस्तेमाल करके onCreateScreen तरीका.

कार ऐप्लिकेशन लाइब्रेरी इंस्टॉल करें

Jetpack लाइब्रेरी देखें रिलीज़ पेज: अपने ऐप्लिकेशन में लाइब्रेरी जोड़ने के तरीके से जुड़े निर्देश देखें.

अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइलें कॉन्फ़िगर करें

कार के लिए ऐप्लिकेशन बनाने से पहले, अपने ऐप्लिकेशन की सेटिंग कॉन्फ़िगर करें मेनिफ़ेस्ट फ़ाइलों को मैन्युअल तरीके से सेट अप कर सकते हैं.

CarAppService के बारे में बताएं

होस्ट आपके ऐप्लिकेशन से कनेक्ट होता है CarAppService लागू करना. आपने लोगों तक पहुंचाया मुफ़्त में अपने मेनिफ़ेस्ट में इस सेवा का एलान करें, ताकि होस्ट इसे खोज सके और कनेक्ट कर सके आपके ऐप्लिकेशन को मिलता है.

आपको इसमें अपने ऐप्लिकेशन की कैटगरी का एलान भी करना होगा: आपके ऐप्लिकेशन के <category> एलिमेंट इंटेंट फ़िल्टर का इस्तेमाल करें. इसकी सूची देखें काम करने वाली ऐप्लिकेशन श्रेणियों के लिए मंज़ूर किए गए मानों के लिए इस एलिमेंट का इस्तेमाल करें.

नीचे दिया गया कोड स्निपेट बताता है कि जहां तक अपनी मेनिफ़ेस्ट फ़ाइल में इंटरेस्ट ऐप्लिकेशन जोड़ें:

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService"/>
        <category android:name="androidx.car.app.category.POI"/>
      </intent-filter>
    </service>

    ...
<application>

इस्तेमाल किए जा सकने वाले ऐप्लिकेशन की कैटगरी

इनमें से एक या ज़्यादा कैटगरी जोड़कर अपने ऐप्लिकेशन की कैटगरी बताएं जब आपने बताए गए तरीके से CarAppService का एलान किया, तब इंटेंट फ़िल्टर में वैल्यू पिछले सेक्शन में:

इनके लिए, कार के लिए Android ऐप्लिकेशन की क्वालिटी देखें ऐप्लिकेशन से जुड़ी हर कैटगरी और शर्तों के बारे में पूरी जानकारी.

ऐप्लिकेशन का नाम और आइकॉन बताएं

आपको एक ऐसा ऐप्लिकेशन नाम और आइकॉन बताना होगा जिसका इस्तेमाल होस्ट, ऐप्लिकेशन खोलें.

इसका इस्तेमाल करके, आपके ऐप्लिकेशन को दिखाने के लिए इस्तेमाल किए जाने वाले ऐप्लिकेशन का नाम और आइकॉन तय किया जा सकता है label और आपके प्रॉडक्ट के icon एट्रिब्यूट CarAppService:

...
<service
   android:name=".MyCarAppService"
   android:exported="true"
   android:label="@string/my_app_name"
   android:icon="@drawable/my_app_icon">
   ...
</service>
...

यदि लेबल या आइकन <service> एलिमेंट, होस्ट के लिए तय मानों पर वापस चला जाता है <application> एलिमेंट.

पसंद के मुताबिक थीम सेट करना

कार के ऐप्लिकेशन के लिए कस्टम थीम सेट करने के लिए, <meta-data> घटक मेनिफ़ेस्ट फ़ाइल में इस तरह बदलाव करें:

<meta-data
    android:name="androidx.car.app.theme"
    android:resource="@style/MyCarAppTheme />

इसके बाद, अपने स्टाइल रिसॉर्स का एलान करें, कार के ऐप्लिकेशन की पसंद के मुताबिक बनाई गई थीम के लिए, ये एट्रिब्यूट सेट करें:

<resources>
  <style name="MyCarAppTheme">
    <item name="carColorPrimary">@layout/my_primary_car_color</item>
    <item name="carColorPrimaryDark">@layout/my_primary_dark_car_color</item>
    <item name="carColorSecondary">@layout/my_secondary_car_color</item>
    <item name="carColorSecondaryDark">@layout/my_secondary_dark_car_color</item>
    <item name="carPermissionActivityLayout">@layout/my_custom_background</item>
  </style>
</resources>

कार ऐप्लिकेशन का एपीआई लेवल

कार ऐप्लिकेशन लाइब्रेरी अपने एपीआई लेवल तय करती है, ताकि आप जान सकें कि लाइब्रेरी की सुविधाएं, वाहन पर टेंप्लेट होस्ट के साथ काम करती हैं. किसी होस्ट के साथ काम करने वाला सबसे बड़ा Car ऐप्लिकेशन एपीआई लेवल वापस पाने के लिए, getCarAppApiLevel() तरीका.

अपनी AndroidManifest.xml फ़ाइल:

<manifest ...>
    <application ...>
        <meta-data
            android:name="androidx.car.app.minCarApiLevel"
            android:value="1"/>
    </application>
</manifest>

इसके लिए दस्तावेज़ देखें RequiresCarApi पुराने सिस्टम के साथ काम करने की सुविधा को बनाए रखने और एलान करने के तरीके की जानकारी किसी सुविधा का इस्तेमाल करने के लिए, एपीआई लेवल का कम से कम ज़रूरी लेवल. किस एपीआई की परिभाषा जानने के लिए कार ऐप्लिकेशन लाइब्रेरी की किसी खास सुविधा का इस्तेमाल करने के लिए, किसी खास लेवल की ज़रूरत होती है, तो के लिए संदर्भ दस्तावेज़ CarAppApiLevels.

अपना CarAppService और सेशन बनाएं

आपके ऐप्लिकेशन को CarAppService क्लास और लागू करें यह onCreateSession तरीका, जो नतीजे के तौर पर Session दिखाता है होस्ट के मौजूदा कनेक्शन से जुड़ा इंस्टेंस:

Kotlin

class HelloWorldService : CarAppService() {
    ...
    override fun onCreateSession(): Session {
        return HelloWorldSession()
    }
    ...
}

Java

public final class HelloWorldService extends CarAppService {
    ...
    @Override
    @NonNull
    public Session onCreateSession() {
        return new HelloWorldSession();
    }
    ...
}

Session इंस्टेंस इसके लिए ज़िम्मेदार है यह फ़ंक्शन इस्तेमाल करने के लिए, Screen इंस्टेंस दिखाता है पहली बार ऐप्लिकेशन शुरू किए जाने पर:

Kotlin

class HelloWorldSession : Session() {
    ...
    override fun onCreateScreen(intent: Intent): Screen {
        return HelloWorldScreen(carContext)
    }
    ...
}

Java

public final class HelloWorldSession extends Session {
    ...
    @Override
    @NonNull
    public Screen onCreateScreen(@NonNull Intent intent) {
        return new HelloWorldScreen(getCarContext());
    }
    ...
}

ऐसी स्थितियों को मैनेज करने के लिए जहां आपके कार ऐप्लिकेशन को ऐसी स्क्रीन से शुरू करने की ज़रूरत हो जो अपने ऐप्लिकेशन की होम या लैंडिंग स्क्रीन पर, जैसे कि डीप लिंक मैनेज करना, पिछली स्क्रीन का इस्तेमाल करके ScreenManager.push से वापस आने से पहले onCreateScreen. प्री-सीडिंग की मदद से उपयोगकर्ता, स्क्रीन पर पहले से ही पिछली स्क्रीन पर वापस जा सकते हैं वह स्क्रीन जिस पर आपका ऐप्लिकेशन दिखाया जा रहा है.

अपनी स्टार्ट स्क्रीन बनाएं

आप Screen क्लास और इसे लागू करना onGetTemplate तरीका, जो नतीजे के तौर पर Template इंस्टेंस, कार की स्क्रीन में दिखने वाली यूज़र इंटरफ़ेस (यूआई) की स्थिति.

नीचे दिया गया स्निपेट दिखाता है कि Screen, जो PaneTemplate टेम्प्लेट को एक सामान्य “नमस्ते दुनिया!” स्ट्रिंग:

Kotlin

class HelloWorldScreen(carContext: CarContext) : Screen(carContext) {
    override fun onGetTemplate(): Template {
        val row = Row.Builder().setTitle("Hello world!").build()
        val pane = Pane.Builder().addRow(row).build()
        return PaneTemplate.Builder(pane)
            .setHeaderAction(Action.APP_ICON)
            .build()
    }
}

Java

public class HelloWorldScreen extends Screen {
    @NonNull
    @Override
    public Template onGetTemplate() {
        Row row = new Row.Builder().setTitle("Hello world!").build();
        Pane pane = new Pane.Builder().addRow(row).build();
        return new PaneTemplate.Builder(pane)
            .setHeaderAction(Action.APP_ICON)
            .build();
    }
}

CarContext क्लास

CarContext क्लास ContextWrapper सब-क्लास आपके Session और Screen इंस्टेंस. इससे ऐक्सेस मिलता है जैसे कि कार सेवाओं को ScreenManager स्क्रीन स्टैक; यह ऐप्लिकेशन से जुड़ी सामान्य समस्याओं के लिए AppManager फ़ंक्शन, जैसे मैप बनाने के लिए, Surface ऑब्जेक्ट को ऐक्सेस करना; और NavigationManager नेविगेशन वाले ऐप्लिकेशन लोगों के साथ शेयर करने के लिए, मोड़-दर-मोड़ नेविगेशन वाले ऐप्लिकेशन इनका इस्तेमाल करते हैं मेटाडेटा और अन्य नेविगेशन-संबंधी इवेंट होस्ट.

नेविगेशन को ऐक्सेस करना देखें टेंप्लेट चुनकर, ऐप्लिकेशन पर नेविगेट करने के लिए उपलब्ध लाइब्रेरी की सुविधाओं की पूरी सूची.

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

स्क्रीन नेविगेशन लागू करना

ऐप्लिकेशन अक्सर कई अलग-अलग स्क्रीन दिखाते हैं. इन सभी स्क्रीन का इस्तेमाल किया जा सकता है अलग-अलग टेंप्लेट, जिनका इस्तेमाल उपयोगकर्ता इंटरैक्ट करते समय कर सकता है पर क्लिक करें.

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

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

Kotlin

val template = MessageTemplate.Builder("Hello world!")
    .setHeaderAction(Action.BACK)
    .addAction(
        Action.Builder()
            .setTitle("Next screen")
            .setOnClickListener { screenManager.push(NextScreen(carContext)) }
            .build())
    .build()

Java

MessageTemplate template = new MessageTemplate.Builder("Hello world!")
    .setHeaderAction(Action.BACK)
    .addAction(
        new Action.Builder()
            .setTitle("Next screen")
            .setOnClickListener(
                () -> getScreenManager().push(new NextScreen(getCarContext())))
            .build())
    .build();

Action.BACK ऑब्जेक्ट स्टैंडर्ड Action है, जो अपने-आप ScreenManager.pop को शुरू करता है. इस व्यवहार को बदला जा सकता है OnBackPressedDispatcher यहां से उपलब्ध इंस्टेंस CarContext.

गाड़ी चलाते समय ऐप्लिकेशन का इस्तेमाल सुरक्षित तरीके से किया जा सके, यह पक्का करने के लिए स्क्रीन स्टैक में ज़्यादा से ज़्यादा स्क्रीन की गहराई. टेंप्लेट की पाबंदियां देखें सेक्शन देखें.

टेंप्लेट का कॉन्टेंट रीफ़्रेश करना

आपका ऐप्लिकेशन किसी Screen को इस नंबर पर कॉल करके अमान्य किया जाएगा Screen.invalidate तरीका. होस्ट बाद में आपके ऐप्लिकेशन के Screen.onGetTemplate नए कॉन्टेंट के साथ टेंप्लेट को फिर से पाने का तरीका बताया गया है.

Screen को रीफ़्रेश करने पर, ऐसा होता है इस टेंप्लेट में मौजूद उस कॉन्टेंट को समझना ज़रूरी है जिसे अपडेट किया जा सकता है इसलिए होस्ट, टेंप्लेट कोटा में नए टेंप्लेट की गिनती नहीं करता है. ज़्यादा जानकारी के लिए, टेंप्लेट की पाबंदियां सेक्शन देखें.

हमारा सुझाव है कि आप अपनी अलग-अलग स्क्रीन को स्ट्रक्चर करें, ताकि Screen और इस तरह के बीच के बीच मैपिंग onGetTemplate लागू करने पर, यह टेंप्लेट दिखता है.

मैप बनाएं

नेविगेशन और लोकप्रिय जगह (पीओआई) ऐप्लिकेशन, इन टेंप्लेट का इस्तेमाल करके Surface को ऐक्सेस करके मैप ड्रॉ करने के लिए:

टेंप्लेट टेंप्लेट की अनुमति कैटगरी के लिए सलाह
NavigationTemplate androidx.car.app.NAVIGATION_TEMPLATES एक हिस्से से दूसरे हिस्से पर जाना
MapWithContentTemplate androidx.car.app.NAVIGATION_TEMPLATES या
androidx.car.app.MAP_TEMPLATES
नेविगेशन, लोकप्रिय जगह
MapTemplate (अब सेवा में नहीं है) androidx.car.app.NAVIGATION_TEMPLATES एक हिस्से से दूसरे हिस्से पर जाना
PlaceListNavigationTemplate (अब सेवा में नहीं है) androidx.car.app.NAVIGATION_TEMPLATES एक हिस्से से दूसरे हिस्से पर जाना
RoutePreviewNavigationTemplate (अब सेवा में नहीं है) androidx.car.app.NAVIGATION_TEMPLATES एक हिस्से से दूसरे हिस्से पर जाना

प्लैटफ़ॉर्म को अनुमति दें

आपके ऐप्लिकेशन के लिए इस्तेमाल किए जा रहे टेंप्लेट के लिए ज़रूरी अनुमति के अलावा, आपके ऐप्लिकेशन को androidx.car.app.ACCESS_SURFACE की अनुमति का एलान करना होगा सरफ़ेस का ऐक्सेस पाने के लिए AndroidManifest.xml फ़ाइल:

<manifest ...>
  ...
  <uses-permission android:name="androidx.car.app.ACCESS_SURFACE" />
  ...
</manifest>

प्लैटफ़ॉर्म को ऐक्सेस करना

होस्ट से मिलने वाले Surface को ऐक्सेस करने के लिए, आपको SurfaceCallback और उपलब्ध कराएं AppManager पर लागू किया गया कार सेवा. वर्तमान Surface आपके SurfaceCallback में SurfaceContainer पैरामीटर onSurfaceAvailable() और onSurfaceDestroyed() कॉलबैक.

Kotlin

carContext.getCarService(AppManager::class.java).setSurfaceCallback(surfaceCallback)

Java

carContext.getCarService(AppManager.class).setSurfaceCallback(surfaceCallback);

सतह के दिखने वाले इलाके को समझना

होस्ट, सबसे ऊपर और टेंप्लेट के लिए यूज़र इंटरफ़ेस एलिमेंट बना सकता है मैप. होस्ट, सतह के उस हिस्से के बारे में बताता है जिसके होने की गारंटी होती है बिना रुकावट और पूरी तरह से SurfaceCallback.onVisibleAreaChanged तरीका. साथ ही, बदलावों की संख्या को कम करने के लिए, होस्ट SurfaceCallback.onStableAreaChanged सबसे छोटी आयत वाली पद्धति, जिसे इसके आधार पर हमेशा देखा जा सकता है मौजूदा टेम्प्लेट.

उदाहरण के लिए, जब कोई नेविगेशन ऐप्लिकेशन NavigationTemplate इसके सबसे ऊपर ऐक्शन स्ट्रिप है. इससे ऐक्शन बार छिप सकता है जब उपयोगकर्ता ने ज़्यादा विज्ञापन बनाने के लिए स्क्रीन से कुछ समय तक इंटरैक्ट नहीं किया हो मैप के लिए जगह. इस मामले में, onStableAreaChanged के लिए एक कॉलबैक है और इसी रेक्टैंगल के साथ onVisibleAreaChanged. ऐक्शन बार के छिपे होने पर, बड़े क्षेत्र में सिर्फ़ onVisibleAreaChanged को कॉल किया जाता है. अगर उपयोगकर्ता स्क्रीन से इंटरैक्ट करता है, तो फिर से सिर्फ़ onVisibleAreaChanged को कॉल किया जाता है पहला आयत.

गहरे रंग वाली थीम काम करती है

ऐप्लिकेशन को Surface इंस्टेंस पर, सही तरीके से डार्क मोड में अपने मैप को फिर से ड्रॉ करना होगा रंग, जब होस्ट यह तय करता है कि शर्तें, इसकी गारंटी देती हैं, जैसा कि कार के लिए Android ऐप्लिकेशन की क्वालिटी.

गहरे रंग का मैप बनाना है या नहीं, यह तय करने के लिए CarContext.isDarkMode तरीका. जब भी गहरे रंग वाली थीम की स्थिति बदलती है, तब आपको Session.onCarConfigurationChanged.

उपयोगकर्ताओं को अपने मैप से इंटरैक्ट करने दें

इन टेंप्लेट का इस्तेमाल करते समय, उपयोगकर्ताओं की इंटरैक्ट करने के लिए सहायता जोड़ी जा सकती है बनाए गए मैप के साथ, जैसे कि मैप के अलग-अलग हिस्सों को ज़ूम और पैन करना.

टेंप्लेट कार ऐप्लिकेशन एपीआई लेवल के बाद से, बातचीत का इस्तेमाल किया जा सकता है
NavigationTemplate 2
PlaceListNavigationTemplate (अब सेवा में नहीं है) 4
RoutePreviewNavigationTemplate (अब सेवा में नहीं है) 4
MapTemplate (अब सेवा में नहीं है) 5 (टेंप्लेट के बारे में जानकारी)
MapWithContentTemplate 7 (टेंप्लेट के बारे में जानकारी)

इंटरैक्टिविटी कॉलबैक लागू करना

SurfaceCallback इंटरफ़ेस में कई कॉलबैक विधियां हैं, जिन्हें आप मैप पर इंटरैक्टिविटी जोड़ने के लिए लागू कर सकते हैं इन टेंप्लेट की मदद से:

बातचीत SurfaceCallback तरीका यह सुविधा, कार ऐप्लिकेशन एपीआई लेवल पर काम करती है
टैप करें onClick 5
ज़ूम करने के लिए पिंच करें onScale 2
सिंगल-टच में खींचें और छोड़ें onScroll 2
सिंगल-टच फ़्लिंग onFling 2
दो बार टैप करें onScale (टेंप्लेट होस्ट से तय किए गए स्केल फ़ैक्टर के साथ) 2
पैन मोड में रोटरी नज onScroll (डिस्टेंस फ़ैक्टर को टेंप्लेट होस्ट से तय किया गया है) 2

मैप ऐक्शन बार जोड़ें

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

मैप पर इंटरैक्टिव कॉलबैक पाने के लिए, आपको मैप के ऐक्शन बार में Action.PAN बटन जोड़ना ज़रूरी है. जब उपयोगकर्ता पैन बटन दबाता है, तो होस्ट पैन मोड में चला जाता है, जैसा कि नीचे बताया गया है सेक्शन में जाएं.

अगर आपके ऐप्लिकेशन में Action.PAN, सेव नहीं किया जाता है बटन दिखाई देता है, तो इसे इससे उपयोगकर्ता इनपुट नहीं मिलता SurfaceCallback तरीके और होस्ट, पहले से चालू किसी भी तरीके को बंद कर देता है पैन मोड.

टचस्क्रीन पर, 'पैन करें' बटन नहीं दिखता है.

पैन मोड के बारे में जानकारी

पैन मोड में, टेंप्लेट होस्ट, नॉन-टच इनपुट से उपयोगकर्ता के इनपुट का अनुवाद करता है रोटरी कंट्रोलर और टचपैड जैसे डिवाइस SurfaceCallback तरीके. पैन मोड में जाने या उससे बाहर निकलने के लिए, उपयोगकर्ता की कार्रवाई पर कार्रवाई करें के साथ setPanModeListener NavigationTemplate.Builder में तरीका. होस्ट अन्य यूज़र इंटरफ़ेस (यूआई) छिपा सकता है पैन मोड में उपयोगकर्ता के टेंप्लेट में कॉम्पोनेंट.

उपयोगकर्ता के साथ इंटरैक्ट करना

आपका ऐप्लिकेशन, किसी मोबाइल ऐप्लिकेशन से मिलते-जुलते पैटर्न का इस्तेमाल करके, उपयोगकर्ता के साथ इंटरैक्ट कर सकता है.

उपयोगकर्ता के इनपुट मैनेज करना

आपका ऐप्लिकेशन सही लिसनर को पास करके, उपयोगकर्ता के इनपुट का जवाब दे सकता है: कुछ मॉडल की मदद से, ये मॉडल बनाए जा सकते हैं. नीचे दिया गया स्निपेट दिखाता है कि Action मॉडल, जो OnClickListener वह आपके ऐप्लिकेशन के कोड के मुताबिक तय किए गए तरीके का इस्तेमाल करता है:

Kotlin

val action = Action.Builder()
    .setTitle("Navigate")
    .setOnClickListener(::onClickNavigate)
    .build()

Java

Action action = new Action.Builder()
    .setTitle("Navigate")
    .setOnClickListener(this::onClickNavigate)
    .build();

इसके बाद, onClickNavigate तरीका डिफ़ॉल्ट नेविगेशन कार ऐप्लिकेशन यह तय करें कि CarContext.startCarApp तरीका:

Kotlin

private fun onClickNavigate() {
    val intent = Intent(CarContext.ACTION_NAVIGATE, Uri.parse("geo:0,0?q=" + address))
    carContext.startCarApp(intent)
}

Java

private void onClickNavigate() {
    Intent intent = new Intent(CarContext.ACTION_NAVIGATE, Uri.parse("geo:0,0?q=" + address));
    getCarContext().startCarApp(intent);
}

ऐप्लिकेशन शुरू करने के तरीके के बारे में ज़्यादा जानकारी पाने के लिए, ACTION_NAVIGATE इंटेंट, इंटेंट के साथ कार ऐप्लिकेशन शुरू करें देखें सेक्शन में जाएं.

कुछ कार्रवाइयां, जैसे कि वे कार्रवाइयां जिन्हें जारी रखने के लिए उपयोगकर्ता को निर्देश देना ज़रूरी होता है मोबाइल डिवाइस पर इंटरैक्शन, सिर्फ़ कार पार्क होने पर ही किए जा सकते हैं. Google आपके यूआरएल पैरामीटर को कैसे इस्तेमाल करेगा, यह तय करने के लिए ParkedOnlyOnClickListener इन कार्रवाइयों को लागू करने के लिए किया जा सकता है. अगर कार पार्क नहीं की गई है, तो होस्ट उपयोगकर्ता को सूचित करें कि इस मामले में कार्रवाई की अनुमति नहीं है. अगर कार पार्क किया जाता है, तो कोड सामान्य रूप से काम करता है. नीचे दिए गए स्निपेट में, ParkedOnlyOnClickListener का इस्तेमाल करें मोबाइल डिवाइस पर सेटिंग स्क्रीन खोलने के लिए:

Kotlin

val row = Row.Builder()
    .setTitle("Open Settings")
    .setOnClickListener(ParkedOnlyOnClickListener.create(::openSettingsOnPhone))
    .build()

Java

Row row = new Row.Builder()
    .setTitle("Open Settings")
    .setOnClickListener(ParkedOnlyOnClickListener.create(this::openSettingsOnPhone))
    .build();

सूचनाएं दिखाएं

मोबाइल डिवाइस पर भेजी गई सूचनाएं, कार की स्क्रीन पर सिर्फ़ तब दिखती हैं, जब उन्हें लंबे समय तक CarAppExtender. सूचना से जुड़े कुछ एट्रिब्यूट, जैसे कि कॉन्टेंट का टाइटल, टेक्स्ट, आइकॉन, और कार्रवाइयां, सूचना की विशेषताओं को बदलकर, CarAppExtender में सेट किया जा सकता है बटन दिखाई देते हैं.

नीचे दिए गए स्निपेट में, कार की स्क्रीन पर सूचना भेजने का तरीका बताया गया है मोबाइल डिवाइस पर दिखाए गए टाइटल से अलग टाइटल दिखाता है:

Kotlin

val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    .setContentTitle(titleOnThePhone)
    .extend(
        CarAppExtender.Builder()
            .setContentTitle(titleOnTheCar)
            ...
            .build())
    .build()

Java

Notification notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    .setContentTitle(titleOnThePhone)
    .extend(
        new CarAppExtender.Builder()
            .setContentTitle(titleOnTheCar)
            ...
            .build())
    .build();

सूचनाओं से, यूज़र इंटरफ़ेस के इन हिस्सों पर असर पड़ सकता है:

  • उपयोगकर्ता को चेतावनी वाली सूचना (HUN) दिखाई जा सकती है.
  • सूचना केंद्र में एक एंट्री जोड़ी जा सकती है. विकल्प के तौर पर, बैज का इस्तेमाल किया जा सकता है जिसे रेल में देखा जा सकता है.
  • नेविगेशन ऐप्लिकेशन के लिए, सूचना रेल विजेट में इस तरह दिख सकती है इसमें बताया गया है मोड़-दर-मोड़ सूचनाएं.

आपके पास यह तय करने का विकल्प होता है कि अपने ऐप्लिकेशन की सूचनाओं को किस तरह कॉन्फ़िगर किया जाए, ताकि उन सूचनाओं पर असर पड़े जैसा कि ऊपर बताया गया है, सूचना की प्राथमिकता का इस्तेमाल करके यूज़र इंटरफ़ेस के एलिमेंट के बारे में बताया गया है. में CarAppExtender दस्तावेज़.

अगर आपने NotificationCompat.Builder.setOnlyAlertOnce को true मान के साथ कॉल किया जाता है, तो ज़्यादा प्राथमिकता वाली सूचना इस तौर पर दिखती है सिर्फ़ एक बार हन.

अपनी कार के ऐप्लिकेशन की सूचनाओं को डिज़ाइन करने के बारे में ज़्यादा जानने के लिए, Google डिज़ाइन फ़ॉर ड्राइविंग गाइड सूचनाएं.

टोस्ट दिखाएं

आपका ऐप्लिकेशन, इसका इस्तेमाल करके टोस्ट दिखा सकता है CarToast, जैसा कि इस स्निपेट में दिखाया गया है:

Kotlin

CarToast.makeText(carContext, "Hello!", CarToast.LENGTH_SHORT).show()

Java

CarToast.makeText(getCarContext(), "Hello!", CarToast.LENGTH_SHORT).show();

अनुमतियां मांगें

अगर आपके ऐप्लिकेशन को प्रतिबंधित डेटा या कार्रवाइयों के ऐक्सेस की ज़रूरत हो, तो उदाहरण के लिए, जगह—Android के स्टैंडर्ड नियम अनुमतियां लागू करें. अनुमति पाने का अनुरोध करने के लिए, CarContext.requestPermissions() तरीका.

इस्तेमाल करने के फ़ायदे CarContext.requestPermissions(), इसका इस्तेमाल करने के बजाय मानक Android API, इन कामों के लिए आपको अपना Activity लॉन्च करने की ज़रूरत नहीं है अनुमति वाला डायलॉग बॉक्स बनाएं. इसके अलावा, आप दोनों में एक ही कोड का इस्तेमाल कर सकते हैं सिर्फ़ Android Auto और Android Automotive OS पर आधारित प्लैटफ़ॉर्म-डिपेंडेंट फ़्लो.

Android Auto पर अनुमतियों वाले डायलॉग का फ़ॉर्मैट अपने हिसाब से बनाएं

Android Auto पर, फ़ोन पर उपयोगकर्ता के लिए अनुमतियों वाला डायलॉग दिखेगा. डिफ़ॉल्ट रूप से, डायलॉग के पीछे कोई बैकग्राउंड नहीं होगा. कस्टम बैकग्राउंड की मदद से, अपने ऐप्लिकेशन में कार ऐप्लिकेशन की थीम का एलान करें AndroidManifest.xml फ़ाइल और carPermissionActivityLayout एट्रिब्यूट सेट करें कार के ऐप्लिकेशन की थीम के लिए.

<meta-data
    android:name="androidx.car.app.theme"
    android:resource="@style/MyCarAppTheme />

इसके बाद, कार ऐप्लिकेशन की थीम के लिए carPermissionActivityLayout एट्रिब्यूट को सेट करें:

<resources>
  <style name="MyCarAppTheme">
    <item name="carPermissionActivityLayout">@layout/my_custom_background</item>
  </style>
</resources>

इंटेंट के आधार पर कार का ऐप्लिकेशन चालू करें

आप CarContext.startCarApp में से कोई एक कार्रवाई करें:

  • फ़ोन कॉल करने के लिए डायलर खोलें.
  • जिस जगह के लिए मोड़-दर-मोड़ नेविगेशन की सुविधा चालू करनी है वहां डिफ़ॉल्ट नेविगेशन कार ऐप्लिकेशन.
  • इंटेंट के साथ अपना खुद का ऐप्लिकेशन शुरू करें.

नीचे दिए गए उदाहरण में ऐसी कार्रवाई के साथ सूचना बनाने का तरीका बताया गया है जो इससे आपका ऐप्लिकेशन, पार्किंग बुकिंग की जानकारी वाली स्क्रीन पर खुलेगा. सूचना इंस्टेंस को ऐसे कॉन्टेंट इंटेंट के साथ बढ़ाया जा सकता है जिसमें PendingIntent किसी खास टेक्स्ट के साथ रैप करना के मुताबिक:

Kotlin

val notification = notificationBuilder
    ...
    .extend(
        CarAppExtender.Builder()
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_VIEW_PARKING_RESERVATION.hashCode(),
                    Intent(ACTION_VIEW_PARKING_RESERVATION)
                        .setComponent(ComponentName(context, MyNotificationReceiver::class.java)),
                    0))
            .build())

Java

Notification notification = notificationBuilder
    ...
    .extend(
        new CarAppExtender.Builder()
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_VIEW_PARKING_RESERVATION.hashCode(),
                    new Intent(ACTION_VIEW_PARKING_RESERVATION)
                        .setComponent(new ComponentName(context, MyNotificationReceiver.class)),
                    0))
            .build());

आपके ऐप्लिकेशन को यह भी बताना होगा कि BroadcastReceiver इसका मतलब है इंटेंट को प्रोसेस करने के लिए तब शुरू किया गया, जब उपयोगकर्ता सूचना का इंटरफ़ेस और शुरू होता है CarContext.startCarApp डेटा यूआरआई वाले इंटेंट से:

Kotlin

class MyNotificationReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val intentAction = intent.action
        if (ACTION_VIEW_PARKING_RESERVATION == intentAction) {
            CarContext.startCarApp(
                intent,
                Intent(Intent.ACTION_VIEW)
                    .setComponent(ComponentName(context, MyCarAppService::class.java))
                    .setData(Uri.fromParts(MY_URI_SCHEME, MY_URI_HOST, intentAction)))
        }
    }
}

Java

public class MyNotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();
        if (ACTION_VIEW_PARKING_RESERVATION.equals(intentAction)) {
            CarContext.startCarApp(
                intent,
                new Intent(Intent.ACTION_VIEW)
                    .setComponent(new ComponentName(context, MyCarAppService.class))
                    .setData(Uri.fromParts(MY_URI_SCHEME, MY_URI_HOST, intentAction)));
        }
    }
}

आख़िर में, Session.onNewIntent आपके ऐप्लिकेशन में, पार्किंग रिज़र्वेशन स्क्रीन को पुश करके इस इंटेंट को हैंडल किया जा सकता है स्टैक में, अगर वह पहले से सबसे ऊपर नहीं है:

Kotlin

override fun onNewIntent(intent: Intent) {
    val screenManager = carContext.getCarService(ScreenManager::class.java)
    val uri = intent.data
    if (uri != null
        && MY_URI_SCHEME == uri.scheme
        && MY_URI_HOST == uri.schemeSpecificPart
        && ACTION_VIEW_PARKING_RESERVATION == uri.fragment
    ) {
        val top = screenManager.top
        if (top !is ParkingReservationScreen) {
            screenManager.push(ParkingReservationScreen(carContext))
        }
    }
}

Java

@Override
public void onNewIntent(@NonNull Intent intent) {
    ScreenManager screenManager = getCarContext().getCarService(ScreenManager.class);
    Uri uri = intent.getData();
    if (uri != null
        && MY_URI_SCHEME.equals(uri.getScheme())
        && MY_URI_HOST.equals(uri.getSchemeSpecificPart())
        && ACTION_VIEW_PARKING_RESERVATION.equals(uri.getFragment())
    ) {
        Screen top = screenManager.getTop();
        if (!(top instanceof ParkingReservationScreen)) {
            screenManager.push(new ParkingReservationScreen(getCarContext()));
        }
    }
}

ज़्यादा जानकारी के लिए, सूचनाएं दिखाएं सेक्शन देखें कार ऐप्लिकेशन के लिए सूचनाएं मैनेज करने के तरीके के बारे में जानकारी.

टेंप्लेट की पाबंदियां

होस्ट ने किसी टास्क के लिए, टेंप्लेट की संख्या को तय सीमा तक सीमित रखा है पाँच में से, जिसमें से आखिरी टेंप्लेट इनमें से किसी एक टाइप का होना चाहिए:

ध्यान दें कि यह सीमा टेम्प्लेट की संख्या पर लागू होती है, स्टैक में Screen इंस्टेंस. इसके लिए उदाहरण के लिए, अगर कोई ऐप्लिकेशन स्क्रीन A में दो टेंप्लेट भेजता है और फिर स्क्रीन को पुश करता है B, यह अब तीन और टेंप्लेट भेज सकता है. इसके अलावा, अगर हर स्क्रीन स्ट्रक्चर्ड है एक टेंप्लेट भेजने के लिए किया जाता है, तो ऐप्लिकेशन पांच स्क्रीन इंस्टेंस को पुश ScreenManager स्टैक.

इन पाबंदियों के कुछ खास मामले होते हैं: टेंप्लेट रीफ़्रेश करना और वापस जाना और कार्रवाइयां रीसेट करें.

टेंप्लेट रीफ़्रेश हो जाता है

कुछ कॉन्टेंट अपडेट को टेंप्लेट की सीमा के तहत नहीं गिना जाता. सामान्य तौर पर, अगर कोई ऐप्लिकेशन एक ही तरह के नए टेंप्लेट को पुश करता है और पिछले टेंप्लेट के समान मुख्य कॉन्टेंट, नया टेंप्लेट को कोटे में गिना जाता है. उदाहरण के लिए, किसी पंक्ति की टॉगल स्थिति को अपडेट करके इसमें ListTemplate को शामिल नहीं किया जाता को कम कर सकते हैं. ज़्यादा जानने के लिए, अलग-अलग टेंप्लेट के दस्तावेज़ देखें कॉन्टेंट अपडेट के किस तरह के अपडेट को रीफ़्रेश माना जा सकता है.

बैक ऑपरेशन

किसी टास्क में सब-फ़्लो चालू करने के लिए, होस्ट यह पता लगाता है कि कोई ऐप्लिकेशन ScreenManager स्टैक और अपडेट में से Screen बचा हुआ कोटा, ऐप्लिकेशन के टेंप्लेट की संख्या के हिसाब से तय होता है को पीछे करें.

उदाहरण के लिए, अगर ऐप्लिकेशन स्क्रीन A में होने पर दो टेंप्लेट भेजता है, फिर पुश करता है स्क्रीन B जोड़ने के साथ-साथ दो और टेंप्लेट भेजता है. हालांकि, ऐप्लिकेशन के लिए सिर्फ़ एक कोटा बचा है. अगर आपने ऐप्लिकेशन फिर से स्क्रीन A पर पॉप-अप करता है, इसलिए होस्ट कोटा को तीन पर रीसेट कर देता है. ऐसा इसलिए, क्योंकि ऐप्लिकेशन दो टेम्प्लेट से पीछे चला गया है.

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

कार्रवाइयां रीसेट करें

कुछ टेंप्लेट में खास सिमेंटिक्स होते हैं, जो टास्क खत्म होने के बारे में बताते हैं. इसके लिए उदाहरण के लिए, NavigationTemplate एक ऐसा व्यू है जो स्क्रीन पर बना रहेगा और नए के साथ रीफ़्रेश हो जाएगा उपयोगकर्ता के इस्तेमाल के बारे में सिलसिलेवार निर्देश. जब यह इनमें से किसी एक पर पहुंच जाए होस्ट, टेंप्लेट के कोटा को रीसेट करता है. तो वह नए काम का पहला कदम है. इससे ऐप्लिकेशन को नया टास्क शुरू करने की अनुमति मिलती है. यह देखने के लिए कि कौनसे टेंप्लेट रीसेट ट्रिगर होते हैं, अलग-अलग टेंप्लेट के दस्तावेज़ देखें होस्ट पर.

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

ज़्यादा जानकारी के लिए, सूचनाएं दिखाएं सेक्शन देखें कार की स्क्रीन में अपने ऐप्लिकेशन की सूचनाएं दिखाने का तरीका जानें. ज़्यादा जानकारी के लिए, इंटेंट के साथ कार ऐप्लिकेशन शुरू करें सेक्शन से, आपको यह जानकारी मिलेगी कि सूचना पर कार्रवाई करके अपना ऐप्लिकेशन शुरू करें.

कनेक्शन एपीआई

यह तय किया जा सकता है कि आपका ऐप्लिकेशन, Android Auto पर चल रहा है या Android पर Automotive OS का इस्तेमाल करके, CarConnection API को रनटाइम पर कनेक्शन की जानकारी पाएं.

उदाहरण के लिए, आपकी कार के ऐप्लिकेशन के Session में, CarConnection को शुरू करें और LiveData अपडेट के लिए सदस्य बनें:

Kotlin

CarConnection(carContext).type.observe(this, ::onConnectionStateUpdated)

Java

new CarConnection(getCarContext()).getType().observe(this, this::onConnectionStateUpdated);

ऑब्ज़र्वर में, कनेक्शन की स्थिति में हुए बदलावों पर प्रतिक्रिया दी जा सकती है:

Kotlin

fun onConnectionStateUpdated(connectionState: Int) {
  val message = when(connectionState) {
    CarConnection.CONNECTION_TYPE_NOT_CONNECTED -> "Not connected to a head unit"
    CarConnection.CONNECTION_TYPE_NATIVE -> "Connected to Android Automotive OS"
    CarConnection.CONNECTION_TYPE_PROJECTION -> "Connected to Android Auto"
    else -> "Unknown car connection type"
  }
  CarToast.makeText(carContext, message, CarToast.LENGTH_SHORT).show()
}

Java

private void onConnectionStateUpdated(int connectionState) {
  String message;
  switch(connectionState) {
    case CarConnection.CONNECTION_TYPE_NOT_CONNECTED:
      message = "Not connected to a head unit";
      break;
    case CarConnection.CONNECTION_TYPE_NATIVE:
      message = "Connected to Android Automotive OS";
      break;
    case CarConnection.CONNECTION_TYPE_PROJECTION:
      message = "Connected to Android Auto";
      break;
    default:
      message = "Unknown car connection type";
      break;
  }
  CarToast.makeText(getCarContext(), message, CarToast.LENGTH_SHORT).show();
}

कंस्ट्रेंट एपीआई

अलग-अलग कारों में Item इंस्टेंस इन्हें दिखाने हैं उपयोगकर्ता को एक बार में ट्रैक कर सकते हैं. इसका इस्तेमाल करें ConstraintManager रनटाइम के दौरान कॉन्टेंट की सीमा देखने और आइटम की सही संख्या सेट करने के लिए आपके टेंप्लेट में.

CarContext से ConstraintManager लें:

Kotlin

val manager = carContext.getCarService(ConstraintManager::class.java)

Java

ConstraintManager manager = getCarContext().getCarService(ConstraintManager.class);

इसके बाद, वापस मिले ConstraintManager ऑब्जेक्ट से क्वेरी करें एक तय सीमा तक कॉन्टेंट अपलोड किया जा सकता है. उदाहरण के लिए, यह पता लगाने के लिए कि कितने आइटम में दिखाए जा सकते हैं ग्रिड, कॉल getContentLimit के साथ CONTENT_LIMIT_TYPE_GRID:

Kotlin

val gridItemLimit = manager.getContentLimit(ConstraintManager.CONTENT_LIMIT_TYPE_GRID)

Java

int gridItemLimit = manager.getContentLimit(ConstraintManager.CONTENT_LIMIT_TYPE_GRID);

साइन-इन फ़्लो जोड़ें

अगर आपका ऐप्लिकेशन उपयोगकर्ताओं को साइन-इन करने का अनुभव देता है, तो आप इस तरह के टेंप्लेट इस्तेमाल कर सकते हैं SignInTemplate और LongMessageTemplate कार ऐप्लिकेशन API लेवल 2 और उसके बाद वाले वर्शन के साथ, मुख्य यूनिट की जानकारी दें.

SignInTemplate बनाने के लिए, SignInMethod तय करें. द कार फ़िलहाल, ऐप्लिकेशन लाइब्रेरी में साइन-इन करने के ये तरीके काम करते हैं:

  • InputSignInMethod का इस्तेमाल करें.
  • PinSignInMethod पिन से साइन-इन करने के लिए, जहां उपयोगकर्ता अपने फ़ोन से अपने खाते को लिंक करता है मुख्य यूनिट पर दिखने वाले पिन का इस्तेमाल करके.
  • ProviderSignInMethod सेवा देने वाली कंपनी के तौर पर साइन-इन के लिए, जैसे कि Google साइन इन और One Tap.
  • QRCodeSignInMethod क्यूआर कोड साइन इन के लिए, जहां उपयोगकर्ता साइन-इन पूरा करने के लिए क्यूआर कोड स्कैन करता है उसका फ़ोन. यह सुविधा, कार एपीआई लेवल 4 और उसके बाद के लेवल में उपलब्ध है.

उदाहरण के लिए, उपयोगकर्ता के पासवर्ड को इकट्ठा करने वाले टेंप्लेट को लागू करने के लिए, InputCallback बनाया जा रहा है उपयोगकर्ता के इनपुट को प्रोसेस और पुष्टि करने के लिए:

Kotlin

val callback = object : InputCallback {
    override fun onInputSubmitted(text: String) {
        // You will receive this callback when the user presses Enter on the keyboard.
    }

    override fun onInputTextChanged(text: String) {
        // You will receive this callback as the user is typing. The update
        // frequency is determined by the host.
    }
}

Java

InputCallback callback = new InputCallback() {
    @Override
    public void onInputSubmitted(@NonNull String text) {
        // You will receive this callback when the user presses Enter on the keyboard.
    }

    @Override
    public void onInputTextChanged(@NonNull String text) {
        // You will receive this callback as the user is typing. The update
        // frequency is determined by the host.
    }
};

InputSignInMethod Builder के लिए, InputCallback ज़रूरी है.

Kotlin

val passwordInput = InputSignInMethod.Builder(callback)
    .setHint("Password")
    .setInputType(InputSignInMethod.INPUT_TYPE_PASSWORD)
    ...
    .build()

Java

InputSignInMethod passwordInput = new InputSignInMethod.Builder(callback)
    .setHint("Password")
    .setInputType(InputSignInMethod.INPUT_TYPE_PASSWORD)
    ...
    .build();

आखिर में, SignInTemplate बनाने के लिए, अपने नए InputSignInMethod का इस्तेमाल करें.

Kotlin

SignInTemplate.Builder(passwordInput)
    .setTitle("Sign in with username and password")
    .setInstructions("Enter your password")
    .setHeaderAction(Action.BACK)
    ...
    .build()

Java

new SignInTemplate.Builder(passwordInput)
    .setTitle("Sign in with username and password")
    .setInstructions("Enter your password")
    .setHeaderAction(Action.BACK)
    ...
    .build();

Account Manager का इस्तेमाल करें

पुष्टि करने वाले Android Automotive OS वाले ऐप्लिकेशन का इस्तेमाल करना ज़रूरी है Account Manager की ये वजहें हो सकती हैं:

  • बेहतर उपयोगकर्ता अनुभव और खाते को मैनेज करना आसान होना: लोग सभी ऐप्लिकेशन को आसानी से मैनेज कर सकते हैं सिस्टम सेटिंग में मौजूद खाता मेन्यू से अपने खाते बनाना, जिसमें साइन-इन करना भी शामिल है और साइन-आउट करें.
  • "मेहमान" अनुभव: कार, शेयर किए गए डिवाइस होती हैं. इसलिए, OEM ये चालू कर सकते हैं: वाहन में मेहमानों के अनुभव, जहां खाते जोड़े नहीं जा सकते.

टेक्स्ट स्ट्रिंग के वैरिएंट जोड़ें

अलग-अलग कार की स्क्रीन के लिए, अलग-अलग साइज़ में टेक्स्ट दिख सकता है. Car App API की मदद से लेवल 2 और उससे ऊपर के लेवल के लिए, आप किसी टेक्स्ट स्ट्रिंग के एक से ज़्यादा वैरिएंट को सबसे अच्छे उस स्क्रीन पर फ़िट हो जाता है. यह देखने के लिए कि टेक्स्ट के वैरिएंट कहां स्वीकार किए जाते हैं, टेंप्लेट देखें और CarText लेने वाले कॉम्पोनेंट.

CarText में टेक्स्ट स्ट्रिंग के वैरिएंट जोड़ने के लिए, CarText.Builder.addVariant() तरीका:

Kotlin

val itemTitle = CarText.Builder("This is a very long string")
    .addVariant("Shorter string")
    ...
    .build()

Java

CarText itemTitle = new CarText.Builder("This is a very long string")
    .addVariant("Shorter string")
    ...
    .build();

फिर आप इस CarText का इस्तेमाल कर सकते हैं—उदाहरण के लिए, GridItem.

Kotlin

GridItem.Builder()
    .addTitle(itemTitle)
    ...
    .build()

Java

new GridItem.Builder()
    .addTitle(itemTitle)
    ...
    build();

स्ट्रिंग को सबसे ज़्यादा से सबसे कम पसंदीदा के क्रम में जोड़ें—उदाहरण के लिए, सबसे लंबे से लेकर सबसे छोटा. होस्ट उचित लंबाई वाली स्ट्रिंग चुनता है, जो कार की स्क्रीन पर कितनी जगह बची है.

पंक्तियों के लिए इनलाइन कैरिकॉन जोड़ें

इनका इस्तेमाल करके, अपने ऐप्लिकेशन को बेहतर तरीके से दिखाने के लिए, आइकॉन में टेक्स्ट जोड़ा जा सकता है CarIconSpan. इसके लिए दस्तावेज़ देखें CarIconSpan.create देखें. यहां जाएं: स्पैंटैस्टिक स्पैन के साथ टेक्स्ट स्टाइलिंग का इस्तेमाल करें.

Kotlin

  
val rating = SpannableString("Rating: 4.5 stars")
rating.setSpan(
    CarIconSpan.create(
        // Create a CarIcon with an image of four and a half stars
        CarIcon.Builder(...).build(),
        // Align the CarIcon to the baseline of the text
        CarIconSpan.ALIGN_BASELINE
    ),
    // The start index of the span (index of the character '4')
    8,
    // The end index of the span (index of the last 's' in "stars")
    16,
    Spanned.SPAN_INCLUSIVE_INCLUSIVE
)

val row = Row.Builder()
    ...
    .addText(rating)
    .build()
  
  

Java

  
SpannableString rating = new SpannableString("Rating: 4.5 stars");
rating.setSpan(
        CarIconSpan.create(
                // Create a CarIcon with an image of four and a half stars
                new CarIcon.Builder(...).build(),
                // Align the CarIcon to the baseline of the text
                CarIconSpan.ALIGN_BASELINE
        ),
        // The start index of the span (index of the character '4')
        8,
        // The end index of the span (index of the last 's' in "stars")
        16,
        Spanned.SPAN_INCLUSIVE_INCLUSIVE
);
Row row = new Row.Builder()
        ...
        .addText(rating)
        .build();
  
  

कार हार्डवेयर एपीआई

कार ऐप्लिकेशन के एपीआई लेवल 3 से शुरू करते हुए, कार ऐप्लिकेशन की लाइब्रेरी में ऐसे एपीआई मौजूद हैं जिनसे का इस्तेमाल वाहन की प्रॉपर्टी और सेंसर को ऐक्सेस करने के लिए कर सकता है.

ज़रूरी शर्तें

Android Auto के साथ एपीआई इस्तेमाल करने के लिए, इस पर डिपेंडेंसी जोड़कर शुरुआत करें आपके Android के लिए build.gradle फ़ाइल में androidx.car.app:app-projected ऑटो मॉड्यूल. Android Automotive OS के लिए, इस पर डिपेंडेंसी जोड़ें आपके Android के लिए build.gradle फ़ाइल में androidx.car.app:app-automotive Automotive OS का मॉड्यूल.

इसके अलावा, अपनी AndroidManifest.xml फ़ाइल में, आपको ये काम करने होंगे इन कामों के लिए ज़रूरी ज़रूरी अनुमतियों का एलान करना होगा कार के उस डेटा का अनुरोध करें जिसका आपको इस्तेमाल करना है. ध्यान दें कि ये अनुमतियां भी ज़रूरी हैं आपको उपयोगकर्ता की ओर से दिया गया है. Google आपके यूआरएल पैरामीटर को कैसे इस्तेमाल करेगा, यह तय करने के लिए Android Auto और Android Automotive OS, दोनों पर एक ही कोड का इस्तेमाल करें. प्लैटफ़ॉर्म-निर्भर फ़्लो बनाने से ज़्यादा है. हालांकि, जिन अनुमतियों की ज़रूरत है अलग हैं.

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

इस टेबल में उन प्रॉपर्टी के बारे में बताया गया है जो CarInfo एपीआई और इन अनुमतियों का अनुरोध करना ज़रूरी है:

माटिंग में इस्तेमाल हुए तरीके प्रॉपर्टी Android Auto की अनुमतियां Android Automotive OS की अनुमतियां यह सुविधा, कार ऐप्लिकेशन एपीआई लेवल पर काम करती है
fetchModel ब्रैंड, मॉडल, साल android.car.permission.CAR_INFO 3
fetchEnergyProfile ईवी कनेक्टर के टाइप, ईंधन के टाइप com.google.android.gms.permission.CAR_FUEL android.car.permission.CAR_INFO 3
fetchExteriorDimensions

यह डेटा, Android Automotive OS की कुछ गाड़ियों में ही उपलब्ध है एपीआई 30 या उसके बाद का वर्शन चल रहा है

बाहरी हिस्से के डाइमेंशन लागू नहीं android.car.permission.CAR_INFO 7
addTollListener
removeTollListener
टोल कार्ड का स्टेटस, टोल कार्ड का टाइप 3
addEnergyLevelListener
removeEnergyLevelListener
बैटरी लेवल, ईंधन का लेवल, ईंधन का लेवल कम है, बैटरी बची है com.google.android.gms.permission.CAR_FUEL android.car.permission.CAR_ENERGY,
android.car.permission.CAR_ENERGY_PORTS,
android.car.permission.READ_CAR_DISPLAY_UNITS
3
addSpeedListener
removeSpeedListener
रॉ स्पीड, डिसप्ले स्पीड (कार के क्लस्टर डिसप्ले पर दिखती है) com.google.android.gms.permission.CAR_SPEED android.car.permission.CAR_SPEED,
android.car.permission.READ_CAR_DISPLAY_UNITS
3
addMileageListener
removeMileageListener
ओडोमीटर की दूरी com.google.android.gms.permission.CAR_MILEAGE यह डेटा, Android Automotive OS का इस्तेमाल करके, Play Store से इंस्टॉल किए गए ऐप्लिकेशन के लिए उपलब्ध नहीं है. 3

उदाहरण के लिए, शेष रेंज पाने के लिए, इंस्टैंशिएट करके CarInfo ऑब्जेक्ट और उसके बाद OnCarDataAvailableListener बनाएं और रजिस्टर करें:

Kotlin

val carInfo = carContext.getCarService(CarHardwareManager::class.java).carInfo

val listener = OnCarDataAvailableListener<EnergyLevel> { data ->
    if (data.rangeRemainingMeters.status == CarValue.STATUS_SUCCESS) {
      val rangeRemaining = data.rangeRemainingMeters.value
    } else {
      // Handle error
    }
  }

carInfo.addEnergyLevelListener(carContext.mainExecutor, listener)

// Unregister the listener when you no longer need updates
carInfo.removeEnergyLevelListener(listener)

Java

CarInfo carInfo = getCarContext().getCarService(CarHardwareManager.class).getCarInfo();

OnCarDataAvailableListener<EnergyLevel> listener = (data) -> {
  if(data.getRangeRemainingMeters().getStatus() == CarValue.STATUS_SUCCESS) {
    float rangeRemaining = data.getRangeRemainingMeters().getValue();
  } else {
    // Handle error
  }
};

carInfo.addEnergyLevelListener(getCarContext().getMainExecutor(), listener);

// Unregister the listener when you no longer need updates
carInfo.removeEnergyLevelListener(listener);

यह न मानें कि कार का डेटा हर समय उपलब्ध है. अगर आपको गड़बड़ी का कोई मैसेज मिलता है, तो की स्थिति इसके लिए अनुरोध किया है, ताकि यह बेहतर ढंग से समझा जा सके कि आपने जिस डेटा का अनुरोध किया है वह उसे वापस नहीं पाया जा सकता. देखें के लिए संदर्भ दस्तावेज़ CarInfo क्लास की पूरी परिभाषा.

कार सेंसर्स

CarSensors क्लास आपको वाहन के एक्सलरोमीटर, जाइरोस्कोप, कंपास, और जगह की जानकारी का डेटा. इन वैल्यू की उपलब्धता, इन बातों पर निर्भर कर सकती है: ओईएम. एक्सलरोमीटर, जाइरोस्कोप, और कंपास से मिले डेटा का फ़ॉर्मैट यह आपको मिल सकता है, जैसे कि SensorManager एपीआई. उदाहरण के लिए, देखें कि वाहन का हेडिंग क्या है:

Kotlin

val carSensors = carContext.getCarService(CarHardwareManager::class.java).carSensors

val listener = OnCarDataAvailableListener<Compass> { data ->
    if (data.orientations.status == CarValue.STATUS_SUCCESS) {
      val orientation = data.orientations.value
    } else {
      // Data not available, handle error
    }
  }

carSensors.addCompassListener(CarSensors.UPDATE_RATE_NORMAL, carContext.mainExecutor, listener)

// Unregister the listener when you no longer need updates
carSensors.removeCompassListener(listener)

Java

CarSensors carSensors = getCarContext().getCarService(CarHardwareManager.class).getCarSensors();

OnCarDataAvailableListener<Compass> listener = (data) -> {
  if (data.getOrientations().getStatus() == CarValue.STATUS_SUCCESS) {
    List<Float> orientations = data.getOrientations().getValue();
  } else {
    // Data not available, handle error
  }
};

carSensors.addCompassListener(CarSensors.UPDATE_RATE_NORMAL, getCarContext().getMainExecutor(),
    listener);

// Unregister the listener when you no longer need updates
carSensors.removeCompassListener(listener);

कार से जगह की जानकारी का डेटा ऐक्सेस करने के लिए, आपको android.permission.ACCESS_FINE_LOCATION की अनुमति.

टेस्ट करना

Android Auto पर टेस्ट करते समय सेंसर डेटा को सिम्युलेट करने के लिए, यह देखें: सेंसर और सेंसर कॉन्फ़िगरेशन सेक्शन में डेस्कटॉप मुख्य यूनिट की गाइड. Android पर टेस्ट करते समय सेंसर डेटा को सिम्युलेट करने के लिए Automotive OS, इसे एमुलेट हार्डवेयर देखें Android के स्टेट सेक्शन में Automotive OS के लिए एम्युलेटर गाइड.

CarAppService, सेशन, और स्क्रीन की लाइफ़साइकल

Session और Screen क्लास, LifecycleOwner इंटरफ़ेस. जैसे उपयोगकर्ता ऐप्लिकेशन, आपके Session और Screen ऑब्जेक्ट से इंटरैक्ट करता है लाइफ़साइकल कॉलबैक शुरू किए जाते हैं, जैसा कि नीचे दिए गए डायग्राम में बताया गया है.

CarAppService और सेशन की लाइफ़साइकल

पहली इमेज. Session का लाइफ़साइकल.

पूरी जानकारी के लिए, Session.getLifecycle तरीका.

स्क्रीन का लाइफ़साइकल

दूसरी इमेज. Screen का लाइफ़साइकल.

पूरी जानकारी के लिए, Screen.getLifecycle तरीका.

कार के माइक्रोफ़ोन से रिकॉर्ड करें

आपके ऐप्लिकेशन की CarAppService और CarAudioRecord एपीआई, तो आपके ऐप्लिकेशन को उपयोगकर्ता की कार के माइक्रोफ़ोन का ऐक्सेस दिया जा सकता है. उपयोगकर्ताओं को यह देना होगा कार के माइक्रोफ़ोन को ऐक्सेस करने के लिए आपके ऐप्लिकेशन को अनुमति. आपका ऐप्लिकेशन, वीडियो को रिकॉर्ड और आपके ऐप्लिकेशन में उपयोगकर्ता के इनपुट को प्रोसेस कर सके.

रिकॉर्ड करने की अनुमति

कोई भी ऑडियो रिकॉर्ड करने से पहले, आपको AndroidManifest.xml और उपयोगकर्ता से इसके लिए अनुरोध करें.

<manifest ...>
   ...
   <uses-permission android:name="android.permission.RECORD_AUDIO" />
   ...
</manifest>

रनटाइम के दौरान रिकॉर्ड करने के लिए, आपको अनुमति का अनुरोध करना होगा. अनुरोध देखें अनुमतियों वाले सेक्शन में, अनुमति नहीं है.

ऑडियो रिकॉर्ड करने की अनुमति दें

उपयोगकर्ता से रिकॉर्डिंग करने की अनुमति मिलने के बाद, ऑडियो रिकॉर्ड किया जा सकता है और प्रोसेस किया जा सकता है रिकॉर्डिंग शामिल है.

Kotlin

val carAudioRecord = CarAudioRecord.create(carContext)
        carAudioRecord.startRecording()

        val data = ByteArray(CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE)
        while(carAudioRecord.read(data, 0, CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE) >= 0) {
            // Use data array
            // Potentially call carAudioRecord.stopRecording() if your processing finds end of speech
        }
        carAudioRecord.stopRecording()
 

Java

CarAudioRecord carAudioRecord = CarAudioRecord.create(getCarContext());
        carAudioRecord.startRecording();

        byte[] data = new byte[CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE];
        while (carAudioRecord.read(data, 0, CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE) >= 0) {
            // Use data array
            // Potentially call carAudioRecord.stopRecording() if your processing finds end of speech
        }
        carAudioRecord.stopRecording();
 

ऑडियो फ़ोकस

कार के माइक्रोफ़ोन से रिकॉर्ड करते समय, पहले ऑडियो सुनें फ़ोकस करना कि सभी मौजूदा मीडिया को रोक दिया जाए. अगर आपका ऑडियो फ़ोकस बंद हो जाता है, रिकॉर्डिंग बंद करें.

ऑडियो फ़ोकस की सुविधा पाने का तरीका यहां दिया गया है:

Kotlin

 
val carAudioRecord = CarAudioRecord.create(carContext)
        
        // Take audio focus so that user's media is not recorded
        val audioAttributes = AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
            // Use the most appropriate usage type for your use case
            .setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
            .build()
        
        val audioFocusRequest =
            AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
                .setAudioAttributes(audioAttributes)
                .setOnAudioFocusChangeListener { state: Int ->
                    if (state == AudioManager.AUDIOFOCUS_LOSS) {
                        // Stop recording if audio focus is lost
                        carAudioRecord.stopRecording()
                    }
                }
                .build()
        
        if (carContext.getSystemService(AudioManager::class.java)
                .requestAudioFocus(audioFocusRequest)
            != AudioManager.AUDIOFOCUS_REQUEST_GRANTED
        ) {
            // Don't record if the focus isn't granted
            return
        }
        
        carAudioRecord.startRecording()
        // Process the audio and abandon the AudioFocusRequest when done

Java

CarAudioRecord carAudioRecord = CarAudioRecord.create(getCarContext());
        // Take audio focus so that user's media is not recorded
        AudioAttributes audioAttributes =
                new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                        // Use the most appropriate usage type for your use case
                        .setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
                        .build();

        AudioFocusRequest audioFocusRequest =
                new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
                        .setAudioAttributes(audioAttributes)
                        .setOnAudioFocusChangeListener(state -> {
                            if (state == AudioManager.AUDIOFOCUS_LOSS) {
                                // Stop recording if audio focus is lost
                                carAudioRecord.stopRecording();
                            }
                        })
                        .build();

        if (getCarContext().getSystemService(AudioManager.class).requestAudioFocus(audioFocusRequest)
                != AUDIOFOCUS_REQUEST_GRANTED) {
            // Don't record if the focus isn't granted
            return;
        }

        carAudioRecord.startRecording();
        // Process the audio and abandon the AudioFocusRequest when done
 

टेस्टिंग लाइब्रेरी

कार के लिए Android टेस्टिंग लाइब्रेरी, सहायक ये क्लास, टेस्ट एनवायरमेंट में आपके ऐप्लिकेशन के काम करने के तरीके की पुष्टि करने के लिए इस्तेमाल की जा सकती हैं. उदाहरण के लिए, SessionController की मदद से, होस्ट के साथ एक कनेक्शन सिम्युलेट किया जाता है. साथ ही, यह पुष्टि की जाती है कि वह सही है Screen और Template बनाए जाते हैं और वापस किया गया.

देखें सैंपल देखें.

Android for Cars ऐप्लिकेशन की लाइब्रेरी से जुड़ी समस्या की शिकायत करना

अगर आपको लाइब्रेरी में कोई समस्या मिलती है, तो Google समस्या को ट्रैक करने वाला टूल. समस्या वाले टेंप्लेट में मांगी गई पूरी जानकारी भरना न भूलें.

नई समस्या जोड़ें

नई समस्या दर्ज करने से पहले, कृपया देख लें कि वह लाइब्रेरी की रिलीज़ में शामिल है या नहीं समस्याओं की सूची में शामिल किया गया है या समस्याओं की सूची में शामिल किया गया है. आप इस तरह से सदस्यता ले सकते हैं और समस्याओं के लिए वोट कर सकते हैं ट्रैकर में किसी समस्या के लिए स्टार पर क्लिक करके. ज़्यादा जानकारी के लिए, यह देखें किसी समस्या के लिए सदस्यता लेना.