कार ऐप्लिकेशन लाइब्रेरी के टेंप्लेट का इस्तेमाल करने वाले मीडिया ऐप्लिकेशन, मीडिया ब्राउज़ करने और प्लेबैक के अनुभव को अपनी ज़रूरत के मुताबिक बना सकते हैं. साथ ही, यह पक्का कर सकते हैं कि अनुभव, कार की स्क्रीन के लिए ऑप्टिमाइज़ किया गया हो और ड्राइविंग के दौरान कम से कम रुकावटें आएं.
इस गाइड में यह माना गया है कि आपके पास पहले से ही कोई मीडिया ऐप्लिकेशन है, जो फ़ोन पर ऑडियो चलाता है
और यह भी माना गया है कि आपका मीडिया ऐप्लिकेशन, Android के मीडिया ऐप्लिकेशन के आर्किटेक्चर के मुताबिक है. कार ऐप्लिकेशन लाइब्रेरी की मदद से, इन-ऐप्लिकेशन अनुभव को
टेंप्लेट से बदला जा सकता है. इसके लिए, कार के लिए मीडिया ऐप्लिकेशन बनाने के लिए
MediaBrowser डेटा स्ट्रक्चर का इस्तेमाल करने की ज़रूरत नहीं होती. हालांकि, आपको अब भी प्लेबैक कंट्रोल के लिए MediaSession और सुझावों और अन्य स्मार्ट अनुभवों के लिए MediaBrowserService या MediaLibraryService उपलब्ध कराना होगा.
अपने ऐप्लिकेशन के मेनिफ़ेस्ट को कॉन्फ़िगर करना
'कार के लिए Android ऐप्लिकेशन' की लाइब्रेरी का इस्तेमाल करना में बताए गए चरणों के अलावा, टेंप्लेट वाले मीडिया ऐप्लिकेशन के लिए ये चीज़ें ज़रूरी हैं:
अपने मेनिफ़ेस्ट में, कैटगरी के लिए काम करने की सुविधा का एलान करना
आपके ऐप्लिकेशन को अपने CarAppService के इंटेंट
फ़िल्टर में, androidx.car.app.category.MEDIA
कार ऐप्लिकेशन कैटगरी का एलान करना होगा.
<application>
...
<service
...
android:name=".MyCarAppService"
android:exported="true">
<intent-filter>
<action android:name="androidx.car.app.CarAppService" />
<category android:name="androidx.car.app.category.MEDIA"/>
</intent-filter>
</service>
...
<application>
MediaPlaybackTemplate को ऐक्सेस करने के लिए, आपके ऐप्लिकेशन को अपनी मेनिफ़ेस्ट फ़ाइल में, androidx.car.app.MEDIA_TEMPLATES अनुमति का एलान भी करना होगा:
<manifest ...>
...
<uses-permission android:name="androidx.car.app.MEDIA_TEMPLATES"/>
...
</manifest>
कार ऐप्लिकेशन के लिए कम से कम एपीआई लेवल सेट करना
MediaPlaybackTemplate का इस्तेमाल करने वाले मीडिया ऐप्लिकेशन, सिर्फ़ CAL API 8 और
इसके बाद के वर्शन पर काम करते हैं. इसलिए, पक्का करें कि आपके ऐप्लिकेशन के लिए कम से कम Car App API level, 8 पर सेट हो.
<application ...>
...
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="8"/>
...
</application>
एट्रिब्यूशन आइकॉन उपलब्ध कराना
पक्का करें कि कार ऐप्लिकेशन लाइब्रेरी का इस्तेमाल करके बनाए गए मीडिया ऐप्लिकेशन के लिए, एट्रिब्यूशन आइकॉन जोड़ा गया हो.
Android Auto के लिए काम करने की सुविधा का एलान करना
पक्का करें कि आपके ऐप्लिकेशन के मेनिफ़ेस्ट में यह जानकारी शामिल हो:
<application>
...
<meta-data android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc"/>
...
</application>
इसके बाद, अपने एक्सएमएल रिसॉर्स में मौजूद automotive_app_desc.xml में, टेंप्लेट का एलान जोड़ें. यह इस तरह दिखना चाहिए:
<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android">
<uses name="media"/>
<uses name="template"/>
</automotiveApp>
Android Automotive OS के लिए काम करने की सुविधा का एलान करना
Android Automotive OS पर, कार ऐप्लिकेशन लाइब्रेरी की सुविधा वाले मीडिया ऐप्लिकेशन को दो अलग-अलग तरीकों से डिस्ट्रिब्यूट किया जा सकता है: एक APK के तौर पर या दो अलग-अलग APK के तौर पर. अगर एक APK डिस्ट्रिब्यूट किया जाता है, तो यह उन वाहनों के साथ काम करेगा जिनमें कार ऐप्लिकेशन लाइब्रेरी होस्ट की सुविधा है. साथ ही, अगर ऐसा नहीं है, तो यह MediaBrowserService या MediaLibraryService ऐप्लिकेशन पर फ़ॉल बैक करेगा. ऐसा Android के पुराने वर्शन (Android 10 - Android 13) के लिए भी होगा. अगर दो अलग-अलग APK डिस्ट्रिब्यूट करने का विकल्प चुना जाता है, तो कार ऐप्लिकेशन लाइब्रेरी के वर्शन में जोड़े गए नए कॉम्पोनेंट को आसानी से अपडेट किया जा सकता है. इससे आपके ऐप्लिकेशन के MediaBrowserService या MediaLibraryService वर्शन पर कोई असर नहीं पड़ेगा.
एक APK डिस्ट्रिब्यूट करना
अपने ऐप्लिकेशन के कार ऐप्लिकेशन लाइब्रेरी और MediaBrowserService
या MediaLibraryService वर्शन के लिए एक APK डिस्ट्रिब्यूट करते समय,
"android:required="false" पर सेट करना ज़रूरी है.
<uses-feature android:name="android.software.car.templates_host.media" android:required="false"/>
इसके बाद, AAOS के लिए कार ऐप्लिकेशन लाइब्रेरी के दिशा-निर्देशों का पालन करें और
लॉन्च किए जा सकने वाले CarAppActivity (या ट्रैम्पोलिन गतिविधि) को शामिल करें. आपको मेनिफ़ेस्ट में, गतिविधि को android:enabled="false" पर सेट करना होगा. इसके बाद, MediaBrowserService के एलान में एक मेटाडेटा टैग जोड़ें. इससे यह पता चलता है कि CarAppActivity कॉम्पोनेंट को बदला गया है. यहां मेनिफ़ेस्ट का उदाहरण दिया गया है:
<service android:name=".media.MyMediaService"
android:exported="true"
android:label="@string/app_name">
<intent-filter>
<action android:name="androidx.media3.session.MediaLibraryService"/>
</intent-filter>
<!-- Link to Car App Library Activity -->
<meta-data
android:name="androidx.car.app.media.CalMediaActivityComponent"
android:value="com.example.mediaapp.LaunchableTrampoline"/>
</service>
<activity
android:name=".LaunchableTrampoline"
android:exported="true"
android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
android:launchMode="singleTask"
android:label="@string/app_name_cal"
android:enabled="false"> <!-- Set to false -->
<meta-data android:name="distractionOptimized" android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
Play पर डिस्ट्रिब्यूशन
कार ऐप्लिकेशन लाइब्रेरी और MediaBrowserService या MediaLibraryService वाला आपका APK, Android 14 (34) को टारगेट करने वाले minSdk और ज़्यादा वर्शन कोड के साथ काम करना चाहिए.
दो APK डिस्ट्रिब्यूट करना
दो अलग-अलग APK डिस्ट्रिब्यूट करने के लिए, एक कार ऐप्लिकेशन लाइब्रेरी का इस्तेमाल करने वाला और दूसरा MediaBrowserService या MediaLibraryService का इस्तेमाल करने वाला, इन चरणों को फ़ॉलो करें. इससे यह पक्का किया जा सकेगा कि वाहन की सही क्षमताओं को सही तरीके से टारगेट किया गया हो.
अपने ऐप्लिकेशन के कार ऐप्लिकेशन लाइब्रेरी वर्शन के लिए अलग APK बनाते समय, आपको android.software.car.templates_host.media को android:required=true पर सेट करना होगा. इससे यह पक्का होता है कि ऐप्लिकेशन सिर्फ़ Android Automotive OS के उन बिल्ड पर डिस्ट्रिब्यूट किया जाए जिन्हें कार ऐप्लिकेशन लाइब्रेरी होस्ट के लिए सर्टिफ़िकेट मिला हो.
<uses-feature android:name="android.software.car.templates_host.media" android:required="true"/>
android.software.car.templates_host.media का इस्तेमाल करने और इसे ऊपर बताए गए तरीके से
android:required=true पर सेट करने के अलावा, लॉन्च किए जा सकने वाले कार ऐप्लिकेशन लाइब्रेरी की गतिविधि के लिए Android Automotive OS
को चालू करने के लिए, इन चरणों को फ़ॉलो करें.
Play पर डिस्ट्रिब्यूशन
कार ऐप्लिकेशन लाइब्रेरी का इस्तेमाल करने वाले APK को, Automotive OS के लिए बनाए गए ट्रैक पर डिस्ट्रिब्यूट किया जाना चाहिए.
बोलकर फ़ोन का इस्तेमाल करने की सुविधा उपलब्ध कराना
अपने ऐप्लिकेशन में बोलकर फ़ोन का इस्तेमाल करने की सुविधा चालू करें, ताकि लोग सामान्य कार्रवाइयां बिना हाथ इस्तेमाल किए पूरी कर सकें.
मीडिया के लिए, बोलकर फ़ोन का इस्तेमाल करने की सुविधा उपलब्ध कराने के बारे में ज़्यादा जानकारी के लिए, लागू करने के निर्देशों के बारे में ज़्यादा जानें. टेंप्लेट वाले मीडिया ऐप्लिकेशन के लिए, अगर आपको बोलकर निर्देश मिलता है, तो आपको खोज के नतीजों के साथ अपने MediaBrowserService या MediaLibraryService को अपडेट करने की ज़रूरत नहीं है. इसके बजाय, अपने मीडिया प्लेबैक टेंप्लेट में कोई कार्रवाई जोड़ने पर विचार करें, ताकि उपयोगकर्ता उस प्ले या खोज क्वेरी के आधार पर ज़्यादा कॉन्टेंट ढूंढ सके. VC-1 क्वालिटी
के दिशा-निर्देश को पूरा करने के लिए, बोलकर दिए जाने वाले निर्देशों के लिए काम करने की सुविधा उपलब्ध कराना ज़रूरी है.
अपना प्लेबैक टेंप्लेट बनाना
MediaPlaybackTemplate, आपके कार ऐप्लिकेशन लाइब्रेरी के मीडिया ऐप्लिकेशन में मीडिया प्लेबैक
की जानकारी दिखाता है. इस टेंप्लेट की मदद से,
टाइटल और पसंद के मुताबिक बनाई जा सकने वाली कार्रवाइयों के साथ हेडर सेट किया जा सकता है. वहीं, मीडिया की जानकारी और
प्लेबैक कंट्रोल, आपके ऐप्लिकेशन के `MediaSession` की स्थिति के आधार पर होस्ट से पॉप्युलेट होते हैं.
MediaSession.
पहली इमेज: सबसे ऊपर, कतार खोलने के लिए हेडर ऐक्शन वाला MediaPlaybackTemplate.
इस कोड के उदाहरण में, प्लेबैक टेंप्लेट बनाने का तरीका दिखाया गया है. इसमें हेडर ऐक्शन सेट किया गया है, ताकि उपयोगकर्ता गानों की कतार वाली स्क्रीन पर जा सके.
val playbackTemplate = MediaPlaybackTemplate.Builder()
.setHeader(
Header.Builder()
.setStartHeaderAction(Action.BACK)
.addEndHeaderAction(
Action.Builder()
.setTitle(model.context.getString(R.string.queue_button_title))
.setIcon(
CarIcon.Builder(
IconCompat.createWithResource(
model.context,
R.drawable.gs_queue_music_vd_theme_24,
))
.build())
.setOnClickListener(showQueueScreen())
.build())
.setTitle(model.context.getString(R.string.media_playback_view_title))
.build())
.build()
जब आप MediaPlaybackTemplate का इस्तेमाल करते हैं, तो अपने
CarAppService में MediaPlaybackManager का इस्तेमाल करके, a
MediaSession टोकन रजिस्टर करें. ऐसा न करने पर, होस्ट को MediaPlaybackTemplate भेजे जाने पर गड़बड़ी दिखती है.
import androidx.car.app.media.MediaPlaybackManager
…
override fun onCreateSession(sessionInfo: SessionInfo): Session {
return object : Session() {
…
init {
lifecycle.addObserver(
LifecycleEventObserver { _, event ->
if (event == ON_CREATE) {
val token = ... // MediaSessionCompat.Token
(carContext.getCarService(CarContext.MEDIA_PLAYBACK_SERVICE) as MediaPlaybackManager)
.registerMediaPlaybackToken(token)
}
...
}
)
}
}
}
Android Auto पर मीडिया प्लेबैक की जानकारी और कंट्रोल दिखाने के लिए, .registerMediaPlaybackToken ज़रूरी है. होस्ट के लिए, मीडिया से जुड़ी सूचनाएं बनाना भी ज़रूरी है.
Media3 लाइब्रेरी का इस्तेमाल करने वाले ऐप्लिकेशन के लिए, आपको अपने MediaLibrarySession.Callback में, पसंद के मुताबिक SessionCommand लागू करना होगा. यह ऐप्लिकेशन, स्टैंडर्ड MediaSessionCompat.Token के बजाय PlatformToken का इस्तेमाल करते हैं. यह सेशन के प्लैटफ़ॉर्म टोकन को दिखाता है: session.platformToken. अपने CarAppService में, इस पसंद के मुताबिक बनाए गए कमांड को सेशन में भेजें. प्लैटफ़ॉर्म टोकन मिलने के बाद, इसे MediaSessionCompat.Token.fromToken(platformToken) का इस्तेमाल करके बदलें. इसके बाद, इस कंपैट टोकन को .registerMediaPlaybackToken() में कार ऐप्लिकेशन लाइब्रेरी को पास करें.
टेंप्लेट का इस्तेमाल करके मीडिया व्यवस्थित करना
गाने या एल्बम जैसे मीडिया को ब्राउज़ करने के लिए व्यवस्थित करने के लिए, हमारा सुझाव है कि आप
SectionedItemTemplate का इस्तेमाल करें.
इससे, इमेज
और टेक्स्ट आइटम की सूचियां मिक्स करने वाले लेआउट बनाने के लिए, GridSection और
RowSection का एक साथ इस्तेमाल किया जा सकता है.
दूसरी इमेज: SectionedItemTemplate, जिसमें RowSection के बाद GridSection शामिल है
TabTemplate में SectionedItemTemplate का इस्तेमाल करना
अपने ऐप्लिकेशन में मीडिया को कैटगरी में बांटने का एक आसान तरीका है कि
TabTemplate में
SectionedItemTemplate का इस्तेमाल किया जाए.
val template =
SectionedItemTemplate.Builder()...build();
val tabTemplate =
TabTemplate.Builder(tabCallback)
.setTabContents(TabContents.Builder(template).build)
.setHeaderAction(Action.APP_ICON)
…
.build();
कार ऐप्लिकेशन लाइब्रेरी 1.9 के कॉम्पोनेंट और सुविधाएं
कार ऐप्लिकेशन लाइब्रेरी के एपीआई वर्शन 1.9 में, ब्राउज़ करने की खास क्षमताओं के लिए, पसंद के मुताबिक कॉम्पोनेंट शामिल किए गए हैं. जैसे, चिप, प्रोग्रेस बार, कंडेंस्ड आइटम, इंटरैक्टिव और एक्सपैंडेड हेडर, स्पॉटलाइट सेक्शन, और बैनर.
तीसरी इमेज: SectionedItemTemplate, जिसमें Chips, Condensed Items, Interactive Header, Grid Items, और Minimized Control Panel शामिल हैं
चौथी इमेज: मीडिया ब्राउज़ करने की दो स्क्रीन, जिनमें Expanded Header, Spotlight Sections, और Progress Bars शामिल हैं
इन टेंप्लेट का इस्तेमाल करके, अपने मीडिया ऐप्लिकेशन का यूज़र इंटरफ़ेस डिज़ाइन करने के बारे में ज़्यादा जानकारी के लिए, मीडिया ऐप्लिकेशन देखें.
प्लेबैक कंट्रोल पर नेविगेट करना
मीडिया ब्राउज़ करते समय, यह ज़रूरी है कि उपयोगकर्ता कम से कम रुकावट के साथ, MediaPlaybackTemplate पर तेज़ी से
नेविगेट कर सके.MFT-1 क्वालिटी की ज़रूरत को पूरा करने के लिए, आपके ऐप्लिकेशन में मीडिया ब्राउज़ करने की सभी स्क्रीन से
MediaPlaybackTemplate को ऐक्सेस करने का तरीका होना चाहिए.
अगर SectionedItemTemplate का इस्तेमाल किया जा रहा है, तो कार्रवाई बटन जोड़कर ऐसा किया जा सकता है. इससे उपयोगकर्ता, मीडिया प्लेबैक स्क्रीन पर नेविगेट कर सकता है. कार ऐप्लिकेशन लाइब्रेरी के स्टैंडर्ड Action.MEDIA_PLAYBACK कार्रवाई का इस्तेमाल करें. मीडिया ऐप्लिकेशन, इस कार्रवाई को
मिनिमाइज किए गए कंट्रोल पैनल के तौर पर दिखाएगा.
अगर कार ऐप्लिकेशन लाइब्रेरी के एपीआई वर्शन 1.9 या इसके बाद के वर्शन का इस्तेमाल किया जा रहा है, तो MFT-1 क्वालिटी की ज़रूरत को पूरा करने के लिए यह ज़रूरी है. अन्य टेंप्लेट के लिए, हेडर ऐक्शन भी ऐसा करने का एक तरीका है.
सिस्टम मीडिया प्लेबैक इंटेंट मैनेज करना
जब किसी ऐप्लिकेशन को, मीडिया चलाने वाले सिस्टम की स्क्रीन से लॉन्च किया जाता है, तो उपयोगकर्ता को MediaPlaybackTemplate पर भेजना ज़रूरी है. जैसे, मीडिया कार्ड. हम चाहते हैं कि मीडिया ऐप्लिकेशन, इस Intent Action को मैनेज करें, ताकि लोगों को बेहतर अनुभव मिल सके.
अपने कार ऐप्लिकेशन लाइब्रेरी कॉम्पोनेंट (चाहे CarAppActivity हो या
आपका ट्रैम्पोलिन Activity) के
इंटेंट-फ़िल्टर में, androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK कार्रवाई जोड़ें.
पक्का करें कि आपकी गतिविधि में singleTask या singleTop का launchMode इस्तेमाल किया गया हो, ताकि onNewIntent() को लागू किया जा सके.
<activity
android:name=".LaunchableTrampoline"
android:exported="true"
android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
android:launchMode="singleTask"
android:label="@string/app_name_cal"
android:enabled="false">
<meta-data android:name="distractionOptimized" android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
आने वाले इंटेंट को पार्स करने के लिए, अपनी Session क्लास में onNewIntent() को बदलें.
अगर आने वाले इंटेंट की कार्रवाई, SHOW_MEDIA_PLAYBACK से मेल खाती है, तो उपयोगकर्ता को 'अभी चल रहा है' स्क्रीन पर ले जाएं.
@Override
public void onNewIntent(@NonNull Intent intent) {
super.onNewIntent(intent);
if (SHOW_MEDIA_PLAYBACK.equals(intent.getAction())) {
ScreenManager screenManager = getCarContext().getCarService(ScreenManager.class);
// Avoid redundant navigation if already on the playing screen
if (screenManager.getTop() instanceof MyMediaPlayScreen) {
return;
}
screenManager.push(MyMediaPlayScreen.createScreenFromPlaying(
getCarContext(), mMediaSessionController));
}
}
अगर ट्रैम्पोलिन गतिविधि का इस्तेमाल किया जा रहा है, तो onCreate() में इंटेंट कार्रवाई की जांच करें. finish() को कॉल करने से पहले, इस कार्रवाई को CarAppActivity बनाने के इंटेंट को पास करें.
public class LaunchableTrampoline extends AppCompatActivity {
private static final String SHOW_MEDIA_PLAYBACK = "androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent receivedIntent = getIntent();
String action;
if (SHOW_MEDIA_PLAYBACK.equals(receivedIntent.getAction())) {
action = SHOW_MEDIA_PLAYBACK;
} else {
action = Intent.ACTION_MAIN;
}
Intent intent = new Intent(action);
intent.setClassName(getPackageName(), "androidx.car.app.activity.CarAppActivity");
startActivity(intent);
finish();
}
}