এই পৃষ্ঠায় একটি অ্যাপকার্ড কীভাবে প্রয়োগ করতে হয় তা বর্ণনা করা হয়েছে।
ধাপ ১: সমস্ত ইম্পোর্ট যোগ করুন
আমদানি যোগ করতে:
static_libs: [ … "car-app-card", ],
ধাপ ২: আপনার ম্যানিফেস্টে SimpleAppCardContentProvider যোগ করুন।
অবশ্যই
android:authorities(যা বোল্ড করা আছে) এর জায়গায় আপনার প্যাকেজ নেমটি বসিয়ে নেবেন।<!-- App Card Content Provider that is required to communicate relevant App Cards with the system android.car.permission.BIND_APP_CARD_PROVIDER is an essential permission that will only allow the system to communicate with the AppCardContentProvider The content provider must also be exported and enabled --> <provider android:name=".SimpleAppCardContentProvider" android:authorities="com.example.appcard.sample" android:permission="@string/host_permission" android:exported="true" android:enabled="true"> <intent-filter> <!-- This intent filter will allow the system to find and connect with the application's AppCardContentProvider --> <action android:name="com.android.car.appcard.APP_CARD_PROVIDER" /> </intent-filter> </provider>
ধাপ ৩: ম্যানিফেস্টে SimpleAppCardContentProvider যোগ করুন
ম্যানিফেস্টে
SimpleAppCardContentProviderযোগ করতে:class SimpleAppCardContentProvider : AppCardContentProvider() { /** Must return same authority as defined in manifest */ override val authority: String = AUTHORITY /** Setup [AppCardContentProvider] and its constituents */ override fun onCreate(): Boolean { return super.onCreate() } /** Setup an [AppCard] that is being requested */ override fun onAppCardAdded(id: String, ctx: AppCardContext): AppCard { return when (id) { APPCARD_ID -> //TODO: create app card else -> throw IllegalStateException("Unidentified app card ID: $id") } } /** List of supported [AppCard] IDs */ override val appCardIds: List<String> = listOf(APPCARD_ID).toMutableList() /** Clean up when an [AppCard] is removed */ override fun onAppCardRemoved(id: String) { when (id) { APPCARD_ID -> //TODO: create app card } } /** Handle an [AppCardContext] change for a particular [AppCard] ID */ override fun onAppCardContextChanged( id: String, appCardContext: AppCardContext ) { when (id) { APPCARD_ID -> //TODO: update AppCardContext } } companion object { private const val AUTHORITY = "com.example.appcard.sample" private const val APPCARD_ID = "sampleAppCard" } }
ধাপ ৪: একটি অ্যাপকার্ড তৈরি করুন
একটি অ্যাপকার্ড তৈরি করতে:
override fun onAppCardAdded(id: String, ctx: AppCardContext): AppCard { return when (id) { APPCARD_ID -> createAppCard(ctx) else -> throw IllegalStateException("Unidentified app card ID: $id") } } private fun createAppCard(appCardContext: AppCardContext): ImageAppCard { return ImageAppCard.newBuilder(APPCARD_ID) .setPrimaryText("Hello") .setSecondaryText("World") .setHeader( Header.newBuilder("header") .setTitle("Code Lab") .build() ) .addButton( Button.newBuilder( "button", Button.ButtonType.PRIMARY, object : OnClickListener { override fun onClick() { //no-op } } ) .setText("Click me!") .build() ) .build() }
উদাহরণস্বরূপ:

চিত্র ১। একটি অ্যাপকার্ড তৈরি করুন।
ধাপ ৫: বাটন ক্লিকারটি সক্রিয় করুন
ক্লিকারটি সক্রিয় করতে:
private var clickCounter = 0
private fun createAppCard(appCardContext: AppCardContext): ImageAppCard {
...
.addButton(
Button.newBuilder(
"button",
Button.ButtonType.PRIMARY,
object : OnClickListener {
override fun onClick() {
clickCounter++
sendAppCardUpdate(createAppCard(appCardContext))
}
}
)
.setText(
if (clickCounter == 0) "Click me!" else "Clicked: $clickCounter"
)
.build()
)
...
}
override fun onAppCardRemoved(id: String) {
when (id) {
APPCARD_ID -> clickCounter = 0
}
}
উদাহরণস্বরূপ:

চিত্র ২. বাটন ক্লিকারটি সক্রিয় করুন।
ধাপ ৬: হেডার ইমেজ আপডেট করুন
হেডারে ছবিটি আপডেট করতে:
private fun createAppCard(appCardContext: AppCardContext): ImageAppCard { val headerImageSize = appCardContext.imageAppCardContext.getMaxImageSize(Header::class.java) val logo = resToBitmap( android.R.drawable.ic_menu_compass, headerImageSize.width, headerImageSize.height ) ... .setHeader( Header.newBuilder("header") .setTitle("Code Lab") .setImage( Image.newBuilder("image") .setContentScale(Image.ContentScale.FILL_BOUNDS) .setColorFilter(Image.ColorFilter.TINT) .setImageData(logo) .build() ) .build() ) ... } private fun resToBitmap(res: Int, width: Int, height: Int): Bitmap { val drawable = context?.getDrawable(res) return drawableToBitmap(drawable!!, width, height) } private fun drawableToBitmap(d: Drawable, width: Int, height: Int): Bitmap { val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) val canvas = Canvas(bitmap) val left = 0 val top = 0 d.setBounds(left, top, canvas.width, canvas.height) d.draw(canvas) return bitmap } ``` For example:  **Figure 3.** Change the name to the header.যেসব কম্পোনেন্ট ছবি সমর্থন করে, সেগুলোতে ছবি যোগ করতে এই প্রক্রিয়াটি পুনরাবৃত্তি করুন।
ধাপ ৭: আরও ইন্টারঅ্যাকশন যোগ করুন
কন্ট্রোল সহ একটি প্রোগ্রেস বার তৈরি করতে:
private var progressOn = false private var progressTimer: Timer? = null private var progressCounter = 0 override fun onAppCardRemoved(id: String) { when (id) { APPCARD_ID -> { clickCounter = 0 progressCounter = 0 progressTimer?.cancel() } } } private fun createAppCard(appCardContext: AppCardContext): ImageAppCard { val buttonImageSize = appCardContext.imageAppCardContext.getMaxImageSize(Button::class.java) val progressPlayPauseImage = resToBitmap( if (progressOn) { android.R.drawable.ic_media_pause } else { android.R.drawable.ic_media_play }, buttonImageSize.width, buttonImageSize.height ) ... .setProgressBar( createProgressBar() ) .addButton( Button.newBuilder( "progressButton", Button.ButtonType.NO_BACKGROUND, object : OnClickListener { override fun onClick() { progressOn = !progressOn if (progressOn) { progressTimer = Timer() progressTimer?.scheduleAtFixedRate(object : TimerTask() { override fun run() { progressCounter++ if (progressCounter > 60) progressCounter = 0 sendAppCardComponentUpdate(APPCARD_ID, createProgressBar()) } }, SECONDS_TO_MS, SECONDS_TO_MS) } else { progressTimer?.cancel() progressTimer = null } sendAppCardUpdate(createAppCard(appCardContext)) } } ) .setImage( Image.newBuilder("buttonImage") .setContentScale(Image.ContentScale.FILL_BOUNDS) .setColorFilter(Image.ColorFilter.TINT) .setImageData(progressPlayPauseImage) .build() ) .build() ) ... } private fun createProgressBar(): ProgressBar { return ProgressBar.newBuilder(PROGRESS_BAR_ID, 0, 60) .setProgress(progressCounter) .build() } companion object { ... private const val PROGRESS_BAR_ID = "progress" private const val SECONDS_TO_MS = 1000L }
আমরা প্রোগ্রেস বারে একটি প্লে বা পজ বাটন যোগ করেছি যা প্রতি সেকেন্ডে আপডেট করা যাবে। আকারের সীমাবদ্ধতার কারণে, ক্লিক সংখ্যা দেখানোর জন্য ক্লিকার বাটনে setText .setText("$clickCounter") যোগ করা হয়েছে।
![]() চিত্র ৪। একটি বাটন যোগ করুন। | ![]() চিত্র ৫. রেন্ডার করা বাটন। |
ধাপ ৮: কার্যক্রমটি চালু করুন
আপনার অ্যাপ যদি [
background-starts#exceptions][1] মেনে চলে, তাহলে আপনি বাটনেরonClickListenerথেকে একটি অ্যাক্টিভিটি চালু করতে পারেন।class SampleRoutingActivity : AppCompatActivity() { override fun onStart() { super.onStart() val intent = Intent(ACTION_LOCATION_SOURCE_SETTINGS).apply { setFlags(FLAG_ACTIVITY_CLEAR_TOP) } startActivity(intent) finish() } }অ্যাক্টিভিটিটি শুরু করতে, অ্যাপকার্ডে একটি বাটন যোগ করুন। যদি কোনো বাটন না থাকে, তাহলে আপনার অ্যাপে একটি রাউটিং অ্যাক্টিভিটি যোগ করুন:
override fun onStart() { super.onStart() val intent = Intent(ACTION_LOCATION_SOURCE_SETTINGS).apply { setFlags(FLAG_ACTIVITY_CLEAR_TOP) } startActivity(intent) finish() } }যখন ক্লাসটি কল করা হয়, ব্যবহারকারীকে লোকেশন সেটিংসে রিডাইরেক্ট করা হয়। ব্যবহারকারী যাতে মূল অ্যাক্টিভিটিতে ফিরে যেতে না পারে, তা নিশ্চিত করার জন্য
setFlags(FLAG_ACTIVITY_CLEAR_TOP)প্রয়োগ করা হয়।অ্যাক্টিভিটিটি শুরু করার জন্য অ্যাপকার্ডে একটি বাটন যোগ করুন:
private fun createAppCard(appCardContext: AppCardContext): ImageAppCard { val locationImage = resToBitmap( android.R.drawable.ic_menu_call, buttonImageSize.width, buttonImageSize.height ) ... .addButton( Button.newBuilder( "activityButton", Button.ButtonType.SECONDARY, object : OnClickListener { override fun onClick() { // no-op } } ) .setImage( Image.newBuilder("locationButtonImage") .setContentScale(Image.ContentScale.FILL_BOUNDS) .setColorFilter(Image.ColorFilter.TINT) .setImageData(locationImage) .build() ) .setIntent( RoutingActivityIntent .newBuilder("com.example.appcard.sample.SampleRoutingActivity") .build() ) .build() ) ... }
জায়গার সীমাবদ্ধতার কারণে অ্যাপকার্ড হোস্ট থেকে ক্লিকার বাটনটি সরিয়ে দেওয়া হয়েছে। অ্যাপকার্ডটি দেখতে নিম্নরূপ:

চিত্র ৬. ক্লিকার বাটন ছাড়া অ্যাপকার্ড।
[1]: https://developer.android.com/guide/components/activities/background-starts#exceptions

