১. শুরু করার আগে
আপনি যা তৈরি করবেন
এই কোডল্যাবে, আপনি স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরি ব্যবহার করে একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করতে শিখবেন। আপনার অ্যাপটি FHIR প্রশ্নাবলী এবং তার উত্তরগুলো রেন্ডার ও প্রসেস করার জন্য স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরি ব্যবহার করবে।
আপনি যা শিখবেন
- আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনে স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরি কীভাবে যুক্ত করবেন
- প্রশ্নাবলী কীভাবে প্রদর্শন করবেন
-
QuestionnaireResponseহিসেবে কীভাবে উত্তর পাওয়া যায় - একটি
QuestionnaireResponseথেকে কীভাবে FHIR রিসোর্স বের করবেন
আপনার যা যা লাগবে
- অ্যান্ড্রয়েড স্টুডিওর একটি সাম্প্রতিক সংস্করণ (v4.1.2+)
- অ্যান্ড্রয়েড এমুলেটর বা একটি বাস্তব অ্যান্ড্রয়েড ডিভাইস
- নমুনা কোড
- কোটলিনে অ্যান্ড্রয়েড ডেভেলপমেন্টের প্রাথমিক জ্ঞান
এই কোডল্যাবটি স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরির উপর কেন্দ্র করে তৈরি। অপ্রাসঙ্গিক ধারণা এবং কোড ব্লকগুলো সংক্ষেপে আলোচনা করা হয়েছে এবং সেগুলো শুধু কপি-পেস্ট করার জন্য দেওয়া হয়েছে। আপনি যদি আগে অ্যান্ড্রয়েড অ্যাপ তৈরি না করে থাকেন, তবে আপনার প্রথম অ্যাপটি তৈরি করার মাধ্যমে শুরু করতে পারেন।
২. প্রস্তুত হন
কোডটি ডাউনলোড করুন
এই কোডল্যাবের কোড ডাউনলোড করতে, অ্যান্ড্রয়েড FHIR SDK রিপোটি ক্লোন করুন: git clone https://github.com/ohs-foundation/android-fhir.git
এই কোডল্যাবের স্টার্টার প্রজেক্টটি codelabs/datacapture এ অবস্থিত।
অ্যান্ড্রয়েড স্টুডিওতে অ্যাপটি ইম্পোর্ট করুন
প্রথমে অ্যান্ড্রয়েড স্টুডিওতে স্টার্টার অ্যাপটি ইম্পোর্ট করে নেওয়া যাক।
অ্যান্ড্রয়েড স্টুডিও খুলুন, ‘Import Project (Gradle, Eclipse ADT, etc.)’ নির্বাচন করুন এবং আপনার পূর্বে ডাউনলোড করা সোর্স কোড থেকে codelabs/datacapture ফোল্ডারটি বেছে নিন।

স্টার্টার অ্যাপটি চালান
এখন যেহেতু আপনি অ্যান্ড্রয়েড স্টুডিওতে প্রজেক্টটি ইম্পোর্ট করেছেন, আপনি প্রথমবারের মতো অ্যাপটি চালানোর জন্য প্রস্তুত।
আপনার অ্যান্ড্রয়েড ডিভাইসটি ইউএসবি-র মাধ্যমে আপনার হোস্টের সাথে সংযুক্ত করুন, অথবা অ্যান্ড্রয়েড স্টুডিও এমুলেটরটি চালু করুন এবং রান-এ ক্লিক করুন (
অ্যান্ড্রয়েড স্টুডিও টুলবারে।

আপনি দেখতেই পাচ্ছেন, এখানে এখনও তেমন কিছু নেই, তাই চলুন সরাসরি আপনার অ্যাপে একটি প্রশ্নমালা প্রদর্শন করা শুরু করা যাক!
৩. প্রজেক্টে স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরি যোগ করুন
স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরির জন্য নির্ভরতাগুলি যোগ করুন
স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরির ডিপেন্ডেন্সিগুলো আপনাকে আপনার অ্যাপে এই লাইব্রেরিটি ইন্টিগ্রেট করার সুযোগ দেয়। আপনার প্রোজেক্টের app/build.gradle.kts ফাইলের শেষে নিম্নলিখিত লাইনগুলো যোগ করুন:
dependencies {
// ...
implementation("com.google.android.fhir:data-capture:1.2.0")
implementation("androidx.fragment:fragment-ktx:1.6.0")
}
আপনার প্রজেক্টটি গ্রেডল ফাইলের সাথে সিঙ্ক করুন।
আপনার অ্যাপে সমস্ত ডিপেন্ডেন্সি উপলব্ধ আছে কিনা তা নিশ্চিত করতে, এই পর্যায়ে আপনার প্রজেক্টটিকে গ্রেডল ফাইলের সাথে সিঙ্ক করা উচিত।
গ্রেডল ফাইলের সাথে প্রজেক্ট সিঙ্ক করুন নির্বাচন করুন (
অ্যান্ড্রয়েড স্টুডিও টুলবার থেকে। ডিপেন্ডেন্সিগুলো সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করার জন্য আপনি অ্যাপটি আবার রানও করতে পারেন।
৪. একটি প্রশ্নপত্র প্রদর্শন করুন
এই ধাপে, আপনি স্টার্টার অ্যাপে একটি FragmentContainerView এর মধ্যে প্রশ্নমালা রেন্ডার করার কার্যকারিতা যোগ করবেন।
এই প্রক্রিয়ার মধ্যে, অ্যান্ড্রয়েড স্টুডিও আপনাকে প্রয়োজনীয় ইম্পোর্টগুলো যোগ করতে বলবে:
-
androidx.core.os.bundleOf -
androidx.fragment.app.add -
androidx.fragment.app.commit -
android.util.Log -
com.google.android.fhir.datacapture.QuestionnaireFragment
ধাপ ১: একটি FragmentContainerView যোগ করুন
অ্যাপ্লিকেশনটির লেআউটে একটি FragmentContainerView যোগ করুন। আপনি পরবর্তীতে যে QuestionnaireFragment তৈরি করবেন, সেটি এখানেই প্রদর্শিত হবে।
-
activity_main.xmlখুলুন ( res > layout > activity_main.xml )। - লেআউট এডিটরের উপরের ডানদিকে কোড, স্প্লিট এবং ডিজাইন ভিউ-এর অপশনগুলো খুঁজুন।
- কোড ভিউ নির্বাচন করুন।

- আপনার
TextViewটির প্রয়োজন নেই, তাই এটি মুছে ফেলুন।<TextViewথেকে শুরু করে ক্লোজিং/>পর্যন্ত সবকিছু মুছে ফেলতে ভুলবেন না। -
ConstraintLayoutভিতরে একটিFragmentContainerViewযোগ করুন। আপনারactivity_main.xmlফাইলটি দেখতে অনেকটা এইরকম হবে:<?xml version="1.0" encoding="utf-8" ?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <androidx.fragment.app.FragmentContainerView android:id="@+id/fragment_container_view" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
ধাপ ২: একটি QuestionnaireFragment কনফিগার করুন
QuestionnaireFragment রেন্ডার করার জন্য একটি JSON এনকোডেড FHIR প্রশ্নাবলী প্রয়োজন। যেহেতু প্রশ্নাবলীটি ছোট (<৫১২ KB), তাই ফ্র্যাগমেন্টটি তৈরি করতে ব্যবহৃত আর্গুমেন্টের Bundle এটিকে একটি String হিসেবে অন্তর্ভুক্ত করতে হবে। পারফরম্যান্সের কারণে, বড় প্রশ্নাবলী URI হিসেবে প্রদান করা উচিত।
আপনি চাইলে questionnaire.json ফাইলটি দেখতে পারেন, কিন্তু স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরির একটি সুবিধা হলো, এটিকে রেন্ডার করার জন্য আপনার FHIR প্রশ্নাবলীর গঠন (বা FHIR সম্পর্কে কিছুই) জানার প্রয়োজন নেই! কোডল্যাবের পরবর্তী অংশে আপনি এই ফাইলটি আরও ভালোভাবে দেখবেন।
এর বিল্ডার ব্যবহার করে একটি QuestionnaireFragment তৈরি করুন এবং সেটার ফাংশন ব্যবহার করে প্রশ্নমালাটি সেট করুন। লেআউট কন্টেইনারের মধ্যে QuestionnaireFragment টি প্রদর্শন করতে, FragmentManager ব্যবহার করে একটি FragmentTransaction তৈরি করুন।
MainActivity.kt খুলুন এবং MainActivity ক্লাসে নিম্নলিখিত কোডটি যোগ করুন:
// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")
val questionnaireFragment =
QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
ধাপ ৩: FragmentContainerView-তে QuestionnaireFragment-টি যোগ করুন।
লেআউট কন্টেইনারের মধ্যে QuestionnaireFragment প্রদর্শন করতে, FragmentManager ব্যবহার করে একটি FragmentTransaction তৈরি করুন। FragmentManager পূর্বে তৈরি করা questionnaireParams ব্যবহার করে ইনস্ট্যানসিয়েশন পরিচালনা করে।
MainActivity ক্লাসে নিম্নলিখিত কোডটি যোগ করুন:
// Step 3: Add the QuestionnaireFragment to the FragmentContainerView
if (savedInstanceState == null) {
supportFragmentManager.commit {
setReorderingAllowed(true)
add(R.id.fragment_container_view, questionnaireFragment)
}
}
// Submit button callback
supportFragmentManager.setFragmentResultListener(
QuestionnaireFragment.SUBMIT_REQUEST_KEY,
this,
) { _, _ ->
submitQuestionnaire()
}
ফ্র্যাগমেন্ট কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আরও জানুন।
রান-এ ক্লিক করে কোডল্যাবটি চালানো যাক।
অ্যান্ড্রয়েড স্টুডিও টুলবারে ) । আপনি এইরকম কিছু দেখতে পাবেন:

প্রশ্নমালাটি নেভিগেট করুন এবং কিছু উত্তর দেওয়ার চেষ্টা করুন। এখানে কয়েকটি ভিন্ন উত্তর উইজেট ব্যবহার করা হয়েছে, যার মধ্যে রয়েছে বুলিয়ান, টেক্সট এবং তারিখ, যেগুলো মূল FHIR প্রশ্নমালার অন্তর্নিহিত ধরনের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে রেন্ডার করা হয়েছিল।
প্রযুক্তিগতভাবে, একটি প্রশ্নমালা তৈরি করতে আপনার শুধু এটুকুই করা প্রয়োজন! অভিনন্দন!
তবে, ব্যবহারকারীরা যে উত্তরগুলো দেন তা যদি দেখা না যায়, তাহলে একটি প্রশ্নমালা খুব একটা সহায়ক হয় না। চলুন, প্রশ্নমালার উত্তর পাওয়ার পরবর্তী ধাপে যাওয়া যাক!
৫. প্রশ্নাবলীর উত্তর নিন
পূর্ববর্তী ধাপগুলোতে, আপনি আপনার অ্যাপে একটি FHIR প্রশ্নাবলী রেন্ডার করেছেন।
এই বিভাগে, আপনি প্রশ্নাবলীর উত্তরগুলো QuestionnaireResponse হিসেবে পাবেন।
submitQuestionnaire() ` মেথডটি খুঁজুন এবং নিম্নলিখিত কোডটি যোগ করুন:
// Get a questionnaire response
val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container_view)
as QuestionnaireFragment
val questionnaireResponse = fragment.getQuestionnaireResponse()
// Print the response to the log
val jsonParser = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser()
val questionnaireResponseString =
jsonParser.encodeResourceToString(questionnaireResponse)
Log.d("response", questionnaireResponseString)
প্রশ্নাবলীর উত্তর পেতে, পূর্বে তৈরি করা প্রশ্নাবলীর অংশটি পুনরুদ্ধার করুন এবং তারপর getQuestionnaireResponse() পদ্ধতিটি ব্যবহার করুন। এটি একটি HAPI FHIR QuestionnaireResponse রিটার্ন করে, যা আপনি সরাসরি অথবা Android FHIR SDK-এর অন্যান্য অংশের সাথে ব্যবহার করতে পারেন। এই কোডল্যাবটি লগে দেখার জন্য এটিকে একটি JSON স্ট্রিং-এ রূপান্তর করতে অন্যান্য HAPI FHIR লাইব্রেরি ব্যবহার করে।
আপনার সর্বশেষ পরিবর্তনগুলো দিয়ে অ্যাপটি পুনর্নির্মাণ করতে এটি আবার চালান। এটি চালু হয়ে গেলে, প্রশ্নাবলীতে কিছু তথ্য প্রবেশ করান এবং 'জমা দিন' (Submit) বোতামে ট্যাপ করুন। লগ-এ, আপনি JSON ফরম্যাটে QuestionnaireResponse সম্বলিত একটি বার্তা দেখতে পাবেন।
D/response: {"resourceType":"QuestionnaireResponse","item":[{"linkId":"PR","text":"Patient information","item":[{"linkId":"PR-name","text":"Name","item":[{"linkId":"PR-name-given","text":"First Name","answer":[{"valueString":"Dani"}]},{"linkId":"PR-name-family","text":"Family Name","answer":[{"valueString":"Lee"}]}]},{"linkId":"PR-birthdate","text":"Date of Birth","answer":[{"valueDate":"1990-02-14"}]},{"linkId":"PR-id","text":"Identifying information","item":[{"linkId":"PR-name-id-url"},{"linkId":"PR-name-id","text":"Patient Id","answer":[{"valueString":"12345"}]}]}]}]}
৬. একটি প্রশ্নাবলীর উত্তর থেকে FHIR রিসোর্সসমূহ নিষ্কাশন করুন
স্টার্টার প্রজেক্টের সাথে অন্তর্ভুক্ত প্রশ্নমালাটি একটি সাধারণ রোগী নিবন্ধন প্রক্রিয়ার জন্য, তাই আপনি হয়তো শেষ পর্যন্ত প্রশ্নমালার উত্তরগুলো ব্যবহার করে সেগুলোর উপর ভিত্তি করে একটি FHIR Patient রিসোর্স তৈরি করতে চাইতে পারেন। প্রশ্নমালার উত্তর থেকে FHIR রিসোর্সে এই রূপান্তরকে ডেটা এক্সট্র্যাকশন বলা হয়। আমরা Structured Data Capture Library-এর ResourceMapper ক্লাস ব্যবহার করে এটি করতে পারি।
ডেটা নিষ্কাশন করার জন্য, আপনার প্রশ্নপত্রে অবশ্যই এই নিষ্কাশন পদ্ধতিটি কীভাবে সম্পাদন করতে হবে সে সম্পর্কিত তথ্য অন্তর্ভুক্ত থাকতে হবে। সৌভাগ্যবশত, নমুনা প্রশ্নপত্রটি ইতোমধ্যেই সংজ্ঞা-ভিত্তিক নিষ্কাশনের জন্য প্রস্তুত করা আছে।
submitQuestionnaire() ` মেথডটি খুঁজুন এবং নিম্নলিখিত কোডটি যোগ করুন:
lifecycleScope.launch {
val questionnaire =
jsonParser.parseResource(questionnaireJsonString) as Questionnaire
val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}
ResourceMapper.extract() এর জন্য একটি HAPI FHIR Questionnaire প্রয়োজন, যা আপনি পূর্বের প্রশ্নাবলীর JSON স্ট্রিংটি পার্স করে তৈরি করতে পারেন, এবং একটি QuestionnaireResponse , যা আমরা আগেই পেয়েছি। এটি একটি HAPI FHIR ট্রানজ্যাকশন বান্ডেল রিটার্ন করে, যাতে এক বা একাধিক এক্সট্র্যাক্ট করা রিসোর্স থাকে—এই ক্ষেত্রে একটিমাত্র Patient রিসোর্স।
আপনার সর্বশেষ পরিবর্তনগুলো দিয়ে অ্যাপটি পুনর্নির্মাণ করতে এটি আবার চালান। এটি চালু হয়ে গেলে, কিছু তথ্য প্রবেশ করান এবং 'সাবমিট' ট্যাপ করুন। লগে, আপনি এখন একটি মেসেজ extraction result দেখতে পাবেন, যেখানে এক্সট্র্যাক্ট করা FHIR বান্ডেলের JSON রিপ্রেজেন্টেশন থাকবে।
D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}
৭. অভিনন্দন!
আপনি আপনার অ্যাপে FHIR প্রশ্নাবলী এবং তার উত্তরগুলো প্রক্রিয়াকরণ করতে স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরি ব্যবহার করেছেন:
- একটি প্রশ্নাবলী প্রদর্শন করুন
- প্রশ্নাবলীর উত্তর পান
- একটি
QuestionnaireResponseথেকে FHIR রিসোর্স নিষ্কাশন করুন
এটি চালু করার জন্য আপনার শুধু এটুকুই প্রয়োজন!
আপনি যখন কাজ এগিয়ে নিয়ে যাবেন, তখন আপনার অ্যাপ্লিকেশন জুড়ে আরও বিভিন্ন উপায়ে FHIR রিসোর্স নিয়ে কাজ করার প্রয়োজন হতে পারে। আপনার অ্যাপ্লিকেশনে স্থানীয়ভাবে FHIR রিসোর্স কীভাবে সংরক্ষণ ও পরিচালনা করতে হয় এবং একটি রিমোট FHIR সার্ভারের সাথে ডেটা সিঙ্ক্রোনাইজ করতে হয়, তা জানতে Android FHIR SDK-এর FHIR ইঞ্জিন লাইব্রেরিটি দেখুন।
আমরা যা আলোচনা করেছি
- আপনার অ্যান্ড্রয়েড অ্যাপে কীভাবে স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরি যুক্ত করবেন
- FHIR প্রশ্নাবলী নিয়ে কাজ করার জন্য
QuestionnaireFragmentএবংResourceMapperকীভাবে ব্যবহার করবেন
পরবর্তী পদক্ষেপ
- স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরির ডকুমেন্টেশন অন্বেষণ করুন।
- রেন্ডার করা প্রশ্নাবলীর চেহারা ও অনুভূতি কাস্টমাইজ করুন
- আপনার নিজের অ্যান্ড্রয়েড অ্যাপে স্ট্রাকচার্ড ডেটা ক্যাপচার লাইব্রেরি প্রয়োগ করুন।