অ্যান্ড্রয়েড ফ্রেমওয়ার্ক APIগুলিতে PHR দিয়ে শুরু করুন, Android ফ্রেমওয়ার্ক APIগুলিতে PHR দিয়ে শুরু করুন, Android ফ্রেমওয়ার্ক APIগুলিতে PHR দিয়ে শুরু করুন, Android ফ্রেমওয়ার্ক APIগুলিতে PHR দিয়ে শুরু করুন

ব্যক্তিগত স্বাস্থ্য রেকর্ড (PHR) এর জন্য Android ফ্রেমওয়ার্ক API ব্যবহার করতে, আপনাকে অবশ্যই:

  1. অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিবেশ কনফিগার করুন
  2. ইনস্ট্যান্টিয়েট HealthConnectManager
  3. অনুমতি হ্যান্ডেল
  4. ডেটা উত্স তৈরি করুন

অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিবেশ কনফিগার করুন

সর্বশেষ এপিআই-এ অ্যাক্সেস পাওয়ার জন্য, আপনাকে সর্বশেষ প্রাসঙ্গিক টুলিং-এও অ্যাক্সেস করতে হবে:

  • অ্যান্ড্রয়েড স্টুডিওর সর্বশেষ সংস্করণটি ইনস্টল করুন।
  • অ্যান্ড্রয়েড স্টুডিওতে, টুলস > SDK ম্যানেজার- এ যান।
    • SDK প্ল্যাটফর্ম ট্যাবে, Android Baklava নির্বাচন করুন।
    • এই সংস্করণে API স্তর 36 এবং PHR API অন্তর্ভুক্ত রয়েছে৷
    • SDK টুলস ট্যাবে, সর্বশেষ উপলব্ধ Android SDK বিল্ড-টুলস নির্বাচন করুন।
    • SDK ইনস্টল করতে ওকে ক্লিক করুন।
  • অ্যান্ড্রয়েড গ্রেডল প্লাগইনের সর্বশেষ উপলব্ধ সংস্করণটি ব্যবহার করুন।

API স্তর ঘোষণা করুন

PHR APIগুলি অ্যাক্সেস করতে, আপনাকে Android এর উপযুক্ত সংস্করণকে লক্ষ্য করতে হবে৷ এটি app/build.gradle এ API স্তর ঘোষণা করে করা হয়।

...
compileSdk = 36

defaultConfig {
  targetSdk = 36
...

use-sdk-element- এ API লেভেল কনফিগার করার বিষয়ে আরও জানুন এবং Android 16 sdk ডকুমেন্টেশন সেট আপ করুন

অনুমতি ঘোষণা করুন

AndroidManifest.xml এ নতুন PHR অনুমতি যোগ করুন। আপনি আপনার অ্যাপ্লিকেশনে ব্যবহার করতে চান এমন ডেটা টাইপের জন্য অনুমতি ঘোষণা করুন। চিকিৎসা সংক্রান্ত অনুমতির সম্পূর্ণ তালিকা কোড ব্লকে দেখানো হয়েছে। স্বাস্থ্য সংযোগের জন্য অ-PHR-সম্পর্কিত অনুমতি অন্তর্ভুক্ত করা হয় না।

...
  <!--  Medical permissions -->
  <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_IMMUNIZATIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
...

যদি একটি অ্যাপ্লিকেশন এমন একটি API ব্যবহার করার চেষ্টা করে যার জন্য একটি অনুমতির প্রয়োজন হয় এবং সেই অনুমতিটি অ্যাপের ম্যানিফেস্টে ঘোষণা করা না হয়, তাহলে একটি SecurityException নিক্ষেপ করা হবে৷

SecurityException টাইপের একটি ব্যতিক্রমের জন্য, exception.localizedMessage এ একটি দরকারী ত্রুটি বার্তা পাওয়া যাবে।

ইনস্ট্যান্টিয়েট হেলথ কানেক্ট ম্যানেজার

HealthConnectManager হল অনুমতির মিথস্ক্রিয়া পরিচালনা করার পাশাপাশি Health Connect স্থানীয় ডেটা রিপোজিটরিতে পড়া এবং লেখার জন্য দায়ী ক্লাস। আমরা পরবর্তী বিভাগে HealthConnectManager এর উদাহরণ পদ্ধতিগুলি অন্বেষণ করব। যেহেতু HealthConnectManager একটি সিস্টেম পরিষেবা প্রকাশ করে, আপনি এই ক্লাসটিকে সরাসরি ইনস্ট্যান্ট করতে পারবেন না এবং অবশ্যই getSystemService ব্যবহার করতে হবে। বিশেষ করে, মনে রাখবেন যে সিস্টেম পরিষেবাটি যে প্রেক্ষাপটের বিরুদ্ধে তাত্ক্ষণিকভাবে যুক্ত হয়েছে তার সাথে শক্তভাবে মিলিত হয়েছে এবং সেই প্রসঙ্গের বাইরে অ্যাক্সেসযোগ্য করা উচিত নয়।

import android.health.connect.HealthConnectManager
...
val healthConnectManager: HealthConnectManager = requireNotNull(applicationContext.getSystemService(HealthConnectManager::class.java))

অনুমতি হ্যান্ডেল

আপনার অ্যাপ্লিকেশনের ব্যবহারকারীকে অবশ্যই আপনার অ্যাপ্লিকেশনটিকে Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিতে হবে। এটি করার জন্য, নির্দিষ্ট অনুমতিগুলির সাথে একটি নতুন কার্যকলাপ চালু করুন এবং প্রদত্ত অনুমতিগুলির ফলাফলের তালিকাটি ব্যবহার করুন। নতুন ক্রিয়াকলাপের UI ব্যবহারকারীকে আপনার অ্যাপটি দেওয়ার জন্য প্রয়োজনীয় অনুমতিগুলি নির্বাচন করার অনুমতি দেবে৷ আপনি আপনার অ্যাপ্লিকেশন ব্যবহার করতে চান শুধুমাত্র সেইসব ডেটা প্রকারের জন্য অনুমতির অনুরোধ করুন৷

val MEDICAL_PERMISSIONS = arrayOf(
            "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES",
            "android.permission.health.READ_MEDICAL_DATA_CONDITIONS",
            "android.permission.health.READ_MEDICAL_DATA_IMMUNIZATIONS",
            "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS",
            "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS",
            "android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS",
            "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS",
            "android.permission.health.READ_MEDICAL_DATA_PREGNANCY",
            "android.permission.health.READ_MEDICAL_DATA_PROCEDURES",
            "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY",
            "android.permission.health.READ_MEDICAL_DATA_VISITS",
            "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS",
            "android.permission.health.WRITE_MEDICAL_DATA",
        )
...
private lateinit var mRequestPermissionLauncher: ActivityResultLauncher<Array<String>>
...
mRequestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
            permissionMap: Map<String, Boolean> ->
            requestPermissionResultHandler(permissionMap)
        }
}
...
private fun requestPermissionResultHandler(permissionMap: Map<String, Boolean>) {
    // Evaluate permissionMap and handle any missing permissions
}
...
mRequestPermissionLauncher.launch(MEDICAL_PERMISSIONS)

প্রয়োজনীয় অনুমতি ছাড়াই পড়তে বা লেখার চেষ্টা করলে একটি HealthConnectException হবে।

HealthConnectException টাইপের একটি ব্যতিক্রমের জন্য, exception.localizedMessage এ একটি দরকারী ত্রুটি বার্তা পাওয়া যাবে।

ডেটা উত্স তৈরি করুন

Health Connect-এ স্বাস্থ্যের ডেটা লিখতে, আপনার অ্যাপ্লিকেশনটিকে প্রথমে তথ্য রাখার জন্য একটি ডেটা উৎস তৈরি করতে হবে। একটি ডেটা উৎস সাধারণত একটি নির্দিষ্ট API বা চিকিৎসা ব্যবস্থার প্রতিনিধিত্ব করে।

উদাহরণে, আমরা My Hospital নামে একটি ডেটা উৎস তৈরি করি এবং FHIR সংস্করণ নির্দিষ্ট করি।

import android.health.connect.CreateMedicalDataSourceRequest
import android.health.connect.HealthConnectManager
import android.health.connect.datatypes.FhirVersion
import android.health.connect.datatypes.MedicalDataSource
import android.net.Uri
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.os.asOutcomeReceiver
import kotlinx.coroutines.suspendCancellableCoroutine
...
private suspend fun createMedicalDataSource(
    fhirBaseUri: Uri,
    displayName: String,
    fhirVersion: FhirVersion,
): String {
    val dataSource =
        suspendCancellableCoroutine<MedicalDataSource> { continuation ->
            healthConnectManager.createMedicalDataSource(
                CreateMedicalDataSourceRequest.Builder(fhirBaseUri,
                                                       displayName,
                                                       fhirVersion).build(),
                Runnable::run,
                continuation.asOutcomeReceiver(),
            )
        }
    Log.d("CREATE_DATA_SOURCE", "Created source: $dataSource")
    return "Created data source: $displayName"
}
...
createMedicalDataSource(
    Uri.parse("example.fhir.com/R4/123"),
    "My Hospital",
    FhirVersion.parseFhirVersion("4.0.1"),
)

রেকর্ড লিখুন

JSON-এ FHIR রেকর্ডের উদাহরণ প্রস্তুত করুন। এফএইচআইআর ফর্ম্যাটে উদাহরণ ডেটা সহ ওয়েবে বিভিন্ন উত্স রয়েছে৷

{
  "resourceType": "Immunization",
  "id": "immunization-1",
  "status": "completed",
  "vaccineCode": {
    "coding": [
      {
        "system": "http://hl7.org/fhir/sid/cvx",
        "code": "115"
      },
      {
        "system": "http://hl7.org/fhir/sid/ndc",
        "code": "58160-842-11"
      }
    ],
    "text": "Tdap"
  },
  "patient": {
    "reference": "Patient/patient_1",
    "display": "Example, Anne"
  },
  "encounter": {
    "reference": "Encounter/encounter_unk",
    "display": "GP Visit"
  },
  "occurrenceDateTime": "2018-05-21",
  "primarySource": true,
  "manufacturer": {
    "display": "Sanofi Pasteur"
  },
  "lotNumber": "1",
  "site": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActSite",
        "code": "LA",
        "display": "Left Arm"
      }
    ],
    "text": "Left Arm"
  },
  "route": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration",
        "code": "IM",
        "display": "Injection, intramuscular"
      }
    ],
    "text": "Injection, intramuscular"
  },
  "doseQuantity": {
    "value": 0.5,
    "unit": "mL"
  },
  "performer": [
    {
      "function": {
        "coding": [
          {
            "system": "http://terminology.hl7.org/CodeSystem/v2-0443",
            "code": "AP",
            "display": "Administering Provider"
          }
        ],
        "text": "Administering Provider"
      },
      "actor": {
        "reference": "Practitioner/practitioner_1",
        "type": "Practitioner",
        "display": "Dr Maria Hernandez"
      }
    }
  ]
}

তথ্য সন্নিবেশ করান:

import android.health.connect.UpsertMedicalResourceRequest
import android.health.connect.datatypes.MedicalResource
...
private suspend fun loadJSONFromAsset(assetName: String): String {
...
private suspend fun upsertMedicalResources(
    requests: List<UpsertMedicalResourceRequest>
): List<MedicalResource> {
    Log.d("UPSERT_RESOURCES", "Writing ${requests.size} resources")
    val resources =
        suspendCancellableCoroutine<List<MedicalResource>> { continuation ->
            healthConnectManager.upsertMedicalResources(
                requests,
                Runnable::run,
                continuation.asOutcomeReceiver(),
            )
        }
    Log.d("UPSERT_RESOURCES", "Wrote ${resources.size} resources")
    return resources
}
...
private suspend fun insertResource(insertedDataSourceId: String, resource: String): String {
    val insertedResources =
        upsertMedicalResources(
            listOf(
                UpsertMedicalResourceRequest.Builder(
                        insertedDataSourceId,
                        FhirVersion.parseFhirVersion("4.0.1"),
                        resource,
                    )
                    .build()
            )
        )
    return insertedResources.joinToString(
        separator = "\n",
        transform = MedicalResource::toString,
    )
}
...
val immunizationResource =
    loadJSONFromAsset("immunization_1.json")
insertResource(dataSource.id, immunizationResource)

upsertMedicalResources যুক্তি হিসাবে UpsertMedicalResourceRequest এর একটি তালিকা নেয়। যদি কলে পাস করা কোনো ব্যক্তিগত UpsertMedicalResourceRequest সন্নিবেশ করাতে ব্যর্থ হয়, তাহলে UpsertMedicalResourceRequest এর সম্পূর্ণ তালিকার জন্য কোনো রিপোজিটরিতে প্রতিশ্রুতিবদ্ধ হবে না।

যদি কোনো অনুরোধে অবৈধ MedicalDataSource আইডি থাকে, তাহলে API একটি IllegalArgumentException নিক্ষেপ করবে। যদি কোনো অনুরোধ অন্য কোনো কারণে অবৈধ বলে গণ্য হয়, কলকারী একটি HealthConnectException পাবেন।

একটি নির্দিষ্ট অনুরোধের জন্য অনন্য কী হল ডেটা সোর্স আইডি, এফএইচআইআর রিসোর্স টাইপ এবং এফএইচআইআর রিসোর্স আইডির সমন্বয়। যদি একটি অনুরোধে এই তিনটি আইটেম বিদ্যমান রেকর্ডের সাথে মেলে, একটি আপডেট ট্রিগার করা হয়। অন্যথায়, একটি নতুন রেকর্ড তৈরি করা হয়।

রেকর্ড পড়ুন

টাইপ দ্বারা রেকর্ড পড়ুন, তারপর আপনি উপযুক্ত দেখতে ফলাফল পরিচালনা করুন.

import android.health.connect.ReadMedicalResourcesInitialRequest
import android.health.connect.ReadMedicalResourcesResponse
import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATIONS
...
private suspend fun readImmunization(): List<MedicalResource> {

    var receiver: OutcomeReceiver<ReadMedicalResourcesResponse, HealthConnectException>
    val request: ReadMedicalResourcesInitialRequest =
        ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATIONS).build()
    val resources =
        suspendCancellableCoroutine<ReadMedicalResourcesResponse> { continuation ->
                receiver = continuation.asOutcomeReceiver()
                healthConnectManager.readMedicalResources(request, Runnable::run, receiver)
            }
            .medicalResources
    Log.d("READ_MEDICAL_RESOURCES", "Read ${resources.size} resources")
    return resources
}
,

ব্যক্তিগত স্বাস্থ্য রেকর্ড (PHR) এর জন্য Android ফ্রেমওয়ার্ক API ব্যবহার করতে, আপনাকে অবশ্যই:

  1. অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিবেশ কনফিগার করুন
  2. ইনস্ট্যান্টিয়েট HealthConnectManager
  3. অনুমতি হ্যান্ডেল
  4. ডেটা উত্স তৈরি করুন

অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিবেশ কনফিগার করুন

সর্বশেষ এপিআই-এ অ্যাক্সেস পাওয়ার জন্য, আপনাকে সর্বশেষ প্রাসঙ্গিক টুলিং-এও অ্যাক্সেস করতে হবে:

  • অ্যান্ড্রয়েড স্টুডিওর সর্বশেষ সংস্করণটি ইনস্টল করুন।
  • অ্যান্ড্রয়েড স্টুডিওতে, টুলস > SDK ম্যানেজার- এ যান।
    • SDK প্ল্যাটফর্ম ট্যাবে, Android Baklava নির্বাচন করুন।
    • এই সংস্করণে API স্তর 36 এবং PHR API অন্তর্ভুক্ত রয়েছে৷
    • SDK টুলস ট্যাবে, সর্বশেষ উপলব্ধ Android SDK বিল্ড-টুলস নির্বাচন করুন।
    • SDK ইনস্টল করতে ওকে ক্লিক করুন।
  • অ্যান্ড্রয়েড গ্রেডল প্লাগইনের সর্বশেষ উপলব্ধ সংস্করণটি ব্যবহার করুন।

API স্তর ঘোষণা করুন

PHR APIগুলি অ্যাক্সেস করতে, আপনাকে Android এর উপযুক্ত সংস্করণকে লক্ষ্য করতে হবে৷ এটি app/build.gradle এ API স্তর ঘোষণা করে করা হয়।

...
compileSdk = 36

defaultConfig {
  targetSdk = 36
...

use-sdk-element- এ API লেভেল কনফিগার করার বিষয়ে আরও জানুন এবং Android 16 sdk ডকুমেন্টেশন সেট আপ করুন

অনুমতি ঘোষণা করুন

AndroidManifest.xml এ নতুন PHR অনুমতি যোগ করুন। আপনি আপনার অ্যাপ্লিকেশনে ব্যবহার করতে চান এমন ডেটা টাইপের জন্য অনুমতি ঘোষণা করুন। চিকিৎসা সংক্রান্ত অনুমতির সম্পূর্ণ তালিকা কোড ব্লকে দেখানো হয়েছে। স্বাস্থ্য সংযোগের জন্য অ-PHR-সম্পর্কিত অনুমতি অন্তর্ভুক্ত করা হয় না।

...
  <!--  Medical permissions -->
  <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_IMMUNIZATIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
...

যদি একটি অ্যাপ্লিকেশন এমন একটি API ব্যবহার করার চেষ্টা করে যার জন্য একটি অনুমতির প্রয়োজন হয় এবং সেই অনুমতিটি অ্যাপের ম্যানিফেস্টে ঘোষণা করা না হয়, তাহলে একটি SecurityException নিক্ষেপ করা হবে৷

SecurityException টাইপের একটি ব্যতিক্রমের জন্য, exception.localizedMessage এ একটি দরকারী ত্রুটি বার্তা পাওয়া যাবে।

ইনস্ট্যান্টিয়েট হেলথ কানেক্ট ম্যানেজার

HealthConnectManager হল অনুমতির মিথস্ক্রিয়া পরিচালনা করার পাশাপাশি Health Connect স্থানীয় ডেটা রিপোজিটরিতে পড়া এবং লেখার জন্য দায়ী ক্লাস। আমরা পরবর্তী বিভাগে HealthConnectManager এর উদাহরণ পদ্ধতিগুলি অন্বেষণ করব। যেহেতু HealthConnectManager একটি সিস্টেম পরিষেবা প্রকাশ করে, আপনি এই ক্লাসটিকে সরাসরি ইনস্ট্যান্ট করতে পারবেন না এবং অবশ্যই getSystemService ব্যবহার করতে হবে। বিশেষ করে, মনে রাখবেন যে সিস্টেম পরিষেবাটি যে প্রেক্ষাপটের বিরুদ্ধে তাত্ক্ষণিকভাবে যুক্ত হয়েছে তার সাথে শক্তভাবে মিলিত হয়েছে এবং সেই প্রসঙ্গের বাইরে অ্যাক্সেসযোগ্য করা উচিত নয়।

import android.health.connect.HealthConnectManager
...
val healthConnectManager: HealthConnectManager = requireNotNull(applicationContext.getSystemService(HealthConnectManager::class.java))

অনুমতি হ্যান্ডেল

আপনার অ্যাপ্লিকেশনের ব্যবহারকারীকে অবশ্যই আপনার অ্যাপ্লিকেশনটিকে Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিতে হবে। এটি করার জন্য, নির্দিষ্ট অনুমতিগুলির সাথে একটি নতুন কার্যকলাপ চালু করুন এবং প্রদত্ত অনুমতিগুলির ফলাফলের তালিকাটি ব্যবহার করুন। নতুন ক্রিয়াকলাপের UI ব্যবহারকারীকে আপনার অ্যাপটি দেওয়ার জন্য প্রয়োজনীয় অনুমতিগুলি নির্বাচন করার অনুমতি দেবে৷ আপনি আপনার অ্যাপ্লিকেশন ব্যবহার করতে চান শুধুমাত্র সেইসব ডেটা প্রকারের জন্য অনুমতির অনুরোধ করুন৷

val MEDICAL_PERMISSIONS = arrayOf(
            "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES",
            "android.permission.health.READ_MEDICAL_DATA_CONDITIONS",
            "android.permission.health.READ_MEDICAL_DATA_IMMUNIZATIONS",
            "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS",
            "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS",
            "android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS",
            "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS",
            "android.permission.health.READ_MEDICAL_DATA_PREGNANCY",
            "android.permission.health.READ_MEDICAL_DATA_PROCEDURES",
            "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY",
            "android.permission.health.READ_MEDICAL_DATA_VISITS",
            "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS",
            "android.permission.health.WRITE_MEDICAL_DATA",
        )
...
private lateinit var mRequestPermissionLauncher: ActivityResultLauncher<Array<String>>
...
mRequestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
            permissionMap: Map<String, Boolean> ->
            requestPermissionResultHandler(permissionMap)
        }
}
...
private fun requestPermissionResultHandler(permissionMap: Map<String, Boolean>) {
    // Evaluate permissionMap and handle any missing permissions
}
...
mRequestPermissionLauncher.launch(MEDICAL_PERMISSIONS)

প্রয়োজনীয় অনুমতি ছাড়াই পড়তে বা লেখার চেষ্টা করলে একটি HealthConnectException হবে।

HealthConnectException টাইপের একটি ব্যতিক্রমের জন্য, exception.localizedMessage এ একটি দরকারী ত্রুটি বার্তা পাওয়া যাবে।

ডেটা উত্স তৈরি করুন

Health Connect-এ স্বাস্থ্যের ডেটা লিখতে, আপনার অ্যাপ্লিকেশনটিকে প্রথমে তথ্য রাখার জন্য একটি ডেটা উৎস তৈরি করতে হবে। একটি ডেটা উৎস সাধারণত একটি নির্দিষ্ট API বা চিকিৎসা ব্যবস্থার প্রতিনিধিত্ব করে।

উদাহরণে, আমরা My Hospital নামে একটি ডেটা উৎস তৈরি করি এবং FHIR সংস্করণ নির্দিষ্ট করি।

import android.health.connect.CreateMedicalDataSourceRequest
import android.health.connect.HealthConnectManager
import android.health.connect.datatypes.FhirVersion
import android.health.connect.datatypes.MedicalDataSource
import android.net.Uri
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.os.asOutcomeReceiver
import kotlinx.coroutines.suspendCancellableCoroutine
...
private suspend fun createMedicalDataSource(
    fhirBaseUri: Uri,
    displayName: String,
    fhirVersion: FhirVersion,
): String {
    val dataSource =
        suspendCancellableCoroutine<MedicalDataSource> { continuation ->
            healthConnectManager.createMedicalDataSource(
                CreateMedicalDataSourceRequest.Builder(fhirBaseUri,
                                                       displayName,
                                                       fhirVersion).build(),
                Runnable::run,
                continuation.asOutcomeReceiver(),
            )
        }
    Log.d("CREATE_DATA_SOURCE", "Created source: $dataSource")
    return "Created data source: $displayName"
}
...
createMedicalDataSource(
    Uri.parse("example.fhir.com/R4/123"),
    "My Hospital",
    FhirVersion.parseFhirVersion("4.0.1"),
)

রেকর্ড লিখুন

JSON-এ FHIR রেকর্ডের উদাহরণ প্রস্তুত করুন। এফএইচআইআর ফর্ম্যাটে উদাহরণ ডেটা সহ ওয়েবে বিভিন্ন উত্স রয়েছে৷

{
  "resourceType": "Immunization",
  "id": "immunization-1",
  "status": "completed",
  "vaccineCode": {
    "coding": [
      {
        "system": "http://hl7.org/fhir/sid/cvx",
        "code": "115"
      },
      {
        "system": "http://hl7.org/fhir/sid/ndc",
        "code": "58160-842-11"
      }
    ],
    "text": "Tdap"
  },
  "patient": {
    "reference": "Patient/patient_1",
    "display": "Example, Anne"
  },
  "encounter": {
    "reference": "Encounter/encounter_unk",
    "display": "GP Visit"
  },
  "occurrenceDateTime": "2018-05-21",
  "primarySource": true,
  "manufacturer": {
    "display": "Sanofi Pasteur"
  },
  "lotNumber": "1",
  "site": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActSite",
        "code": "LA",
        "display": "Left Arm"
      }
    ],
    "text": "Left Arm"
  },
  "route": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration",
        "code": "IM",
        "display": "Injection, intramuscular"
      }
    ],
    "text": "Injection, intramuscular"
  },
  "doseQuantity": {
    "value": 0.5,
    "unit": "mL"
  },
  "performer": [
    {
      "function": {
        "coding": [
          {
            "system": "http://terminology.hl7.org/CodeSystem/v2-0443",
            "code": "AP",
            "display": "Administering Provider"
          }
        ],
        "text": "Administering Provider"
      },
      "actor": {
        "reference": "Practitioner/practitioner_1",
        "type": "Practitioner",
        "display": "Dr Maria Hernandez"
      }
    }
  ]
}

তথ্য সন্নিবেশ করান:

import android.health.connect.UpsertMedicalResourceRequest
import android.health.connect.datatypes.MedicalResource
...
private suspend fun loadJSONFromAsset(assetName: String): String {
...
private suspend fun upsertMedicalResources(
    requests: List<UpsertMedicalResourceRequest>
): List<MedicalResource> {
    Log.d("UPSERT_RESOURCES", "Writing ${requests.size} resources")
    val resources =
        suspendCancellableCoroutine<List<MedicalResource>> { continuation ->
            healthConnectManager.upsertMedicalResources(
                requests,
                Runnable::run,
                continuation.asOutcomeReceiver(),
            )
        }
    Log.d("UPSERT_RESOURCES", "Wrote ${resources.size} resources")
    return resources
}
...
private suspend fun insertResource(insertedDataSourceId: String, resource: String): String {
    val insertedResources =
        upsertMedicalResources(
            listOf(
                UpsertMedicalResourceRequest.Builder(
                        insertedDataSourceId,
                        FhirVersion.parseFhirVersion("4.0.1"),
                        resource,
                    )
                    .build()
            )
        )
    return insertedResources.joinToString(
        separator = "\n",
        transform = MedicalResource::toString,
    )
}
...
val immunizationResource =
    loadJSONFromAsset("immunization_1.json")
insertResource(dataSource.id, immunizationResource)

upsertMedicalResources যুক্তি হিসাবে UpsertMedicalResourceRequest এর একটি তালিকা নেয়। যদি কলে পাস করা কোনো ব্যক্তিগত UpsertMedicalResourceRequest সন্নিবেশ করাতে ব্যর্থ হয়, তাহলে UpsertMedicalResourceRequest এর সম্পূর্ণ তালিকার জন্য কোনো রিপোজিটরিতে প্রতিশ্রুতিবদ্ধ হবে না।

যদি কোনো অনুরোধে অবৈধ MedicalDataSource আইডি থাকে, তাহলে API একটি IllegalArgumentException নিক্ষেপ করবে। যদি কোনো অনুরোধ অন্য কোনো কারণে অবৈধ বলে গণ্য হয়, কলকারী একটি HealthConnectException পাবেন।

একটি নির্দিষ্ট অনুরোধের জন্য অনন্য কী হল ডেটা সোর্স আইডি, এফএইচআইআর রিসোর্স টাইপ এবং এফএইচআইআর রিসোর্স আইডির সমন্বয়। যদি একটি অনুরোধে এই তিনটি আইটেম বিদ্যমান রেকর্ডের সাথে মেলে, একটি আপডেট ট্রিগার করা হয়। অন্যথায়, একটি নতুন রেকর্ড তৈরি করা হয়।

রেকর্ড পড়ুন

টাইপ দ্বারা রেকর্ড পড়ুন, তারপর আপনি উপযুক্ত দেখতে ফলাফল পরিচালনা করুন.

import android.health.connect.ReadMedicalResourcesInitialRequest
import android.health.connect.ReadMedicalResourcesResponse
import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATIONS
...
private suspend fun readImmunization(): List<MedicalResource> {

    var receiver: OutcomeReceiver<ReadMedicalResourcesResponse, HealthConnectException>
    val request: ReadMedicalResourcesInitialRequest =
        ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATIONS).build()
    val resources =
        suspendCancellableCoroutine<ReadMedicalResourcesResponse> { continuation ->
                receiver = continuation.asOutcomeReceiver()
                healthConnectManager.readMedicalResources(request, Runnable::run, receiver)
            }
            .medicalResources
    Log.d("READ_MEDICAL_RESOURCES", "Read ${resources.size} resources")
    return resources
}
,

ব্যক্তিগত স্বাস্থ্য রেকর্ড (PHR) এর জন্য Android ফ্রেমওয়ার্ক API ব্যবহার করতে, আপনাকে অবশ্যই:

  1. অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিবেশ কনফিগার করুন
  2. ইনস্ট্যান্টিয়েট HealthConnectManager
  3. অনুমতি হ্যান্ডেল
  4. ডেটা উত্স তৈরি করুন

অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিবেশ কনফিগার করুন

সর্বশেষ এপিআই-এ অ্যাক্সেস পাওয়ার জন্য, আপনাকে সর্বশেষ প্রাসঙ্গিক টুলিং-এও অ্যাক্সেস করতে হবে:

  • অ্যান্ড্রয়েড স্টুডিওর সর্বশেষ সংস্করণটি ইনস্টল করুন।
  • অ্যান্ড্রয়েড স্টুডিওতে, টুলস > SDK ম্যানেজার- এ যান।
    • SDK প্ল্যাটফর্ম ট্যাবে, Android Baklava নির্বাচন করুন।
    • এই সংস্করণে API স্তর 36 এবং PHR API অন্তর্ভুক্ত রয়েছে৷
    • SDK টুলস ট্যাবে, সর্বশেষ উপলব্ধ Android SDK বিল্ড-টুলস নির্বাচন করুন।
    • SDK ইনস্টল করতে ওকে ক্লিক করুন।
  • অ্যান্ড্রয়েড গ্রেডল প্লাগইনের সর্বশেষ উপলব্ধ সংস্করণটি ব্যবহার করুন।

API স্তর ঘোষণা করুন

PHR APIগুলি অ্যাক্সেস করতে, আপনাকে Android এর উপযুক্ত সংস্করণকে লক্ষ্য করতে হবে৷ এটি app/build.gradle এ API স্তর ঘোষণা করে করা হয়।

...
compileSdk = 36

defaultConfig {
  targetSdk = 36
...

use-sdk-element- এ API লেভেল কনফিগার করার বিষয়ে আরও জানুন এবং Android 16 sdk ডকুমেন্টেশন সেট আপ করুন

অনুমতি ঘোষণা করুন

AndroidManifest.xml এ নতুন PHR অনুমতি যোগ করুন। আপনি আপনার অ্যাপ্লিকেশনে ব্যবহার করতে চান এমন ডেটা টাইপের জন্য অনুমতি ঘোষণা করুন। চিকিৎসা সংক্রান্ত অনুমতির সম্পূর্ণ তালিকা কোড ব্লকে দেখানো হয়েছে। স্বাস্থ্য সংযোগের জন্য অ-PHR-সম্পর্কিত অনুমতি অন্তর্ভুক্ত করা হয় না।

...
  <!--  Medical permissions -->
  <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_IMMUNIZATIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
...

যদি একটি অ্যাপ্লিকেশন এমন একটি API ব্যবহার করার চেষ্টা করে যার জন্য একটি অনুমতির প্রয়োজন হয় এবং সেই অনুমতিটি অ্যাপের ম্যানিফেস্টে ঘোষণা করা না হয়, তাহলে একটি SecurityException নিক্ষেপ করা হবে৷

SecurityException টাইপের একটি ব্যতিক্রমের জন্য, exception.localizedMessage এ একটি দরকারী ত্রুটি বার্তা পাওয়া যাবে।

ইনস্ট্যান্টিয়েট হেলথ কানেক্ট ম্যানেজার

HealthConnectManager হল অনুমতির মিথস্ক্রিয়া পরিচালনা করার পাশাপাশি Health Connect স্থানীয় ডেটা রিপোজিটরিতে পড়া এবং লেখার জন্য দায়ী ক্লাস। আমরা পরবর্তী বিভাগে HealthConnectManager এর উদাহরণ পদ্ধতিগুলি অন্বেষণ করব। যেহেতু HealthConnectManager একটি সিস্টেম পরিষেবা প্রকাশ করে, আপনি এই ক্লাসটিকে সরাসরি ইনস্ট্যান্ট করতে পারবেন না এবং অবশ্যই getSystemService ব্যবহার করতে হবে। বিশেষ করে, মনে রাখবেন যে সিস্টেম পরিষেবাটি যে প্রেক্ষাপটের বিরুদ্ধে তাত্ক্ষণিকভাবে যুক্ত হয়েছে তার সাথে শক্তভাবে মিলিত হয়েছে এবং সেই প্রসঙ্গের বাইরে অ্যাক্সেসযোগ্য করা উচিত নয়।

import android.health.connect.HealthConnectManager
...
val healthConnectManager: HealthConnectManager = requireNotNull(applicationContext.getSystemService(HealthConnectManager::class.java))

অনুমতি হ্যান্ডেল

আপনার অ্যাপ্লিকেশনের ব্যবহারকারীকে অবশ্যই আপনার অ্যাপ্লিকেশনটিকে Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিতে হবে। এটি করার জন্য, নির্দিষ্ট অনুমতিগুলির সাথে একটি নতুন কার্যকলাপ চালু করুন এবং প্রদত্ত অনুমতিগুলির ফলাফলের তালিকাটি ব্যবহার করুন। নতুন ক্রিয়াকলাপের UI ব্যবহারকারীকে আপনার অ্যাপটি দেওয়ার জন্য প্রয়োজনীয় অনুমতিগুলি নির্বাচন করার অনুমতি দেবে৷ আপনি আপনার অ্যাপ্লিকেশন ব্যবহার করতে চান শুধুমাত্র সেইসব ডেটা প্রকারের জন্য অনুমতির অনুরোধ করুন৷

val MEDICAL_PERMISSIONS = arrayOf(
            "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES",
            "android.permission.health.READ_MEDICAL_DATA_CONDITIONS",
            "android.permission.health.READ_MEDICAL_DATA_IMMUNIZATIONS",
            "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS",
            "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS",
            "android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS",
            "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS",
            "android.permission.health.READ_MEDICAL_DATA_PREGNANCY",
            "android.permission.health.READ_MEDICAL_DATA_PROCEDURES",
            "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY",
            "android.permission.health.READ_MEDICAL_DATA_VISITS",
            "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS",
            "android.permission.health.WRITE_MEDICAL_DATA",
        )
...
private lateinit var mRequestPermissionLauncher: ActivityResultLauncher<Array<String>>
...
mRequestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
            permissionMap: Map<String, Boolean> ->
            requestPermissionResultHandler(permissionMap)
        }
}
...
private fun requestPermissionResultHandler(permissionMap: Map<String, Boolean>) {
    // Evaluate permissionMap and handle any missing permissions
}
...
mRequestPermissionLauncher.launch(MEDICAL_PERMISSIONS)

প্রয়োজনীয় অনুমতি ছাড়াই পড়তে বা লেখার চেষ্টা করলে একটি HealthConnectException হবে।

HealthConnectException টাইপের একটি ব্যতিক্রমের জন্য, exception.localizedMessage এ একটি দরকারী ত্রুটি বার্তা পাওয়া যাবে।

ডেটা উত্স তৈরি করুন

Health Connect-এ স্বাস্থ্যের ডেটা লিখতে, আপনার অ্যাপ্লিকেশনটিকে প্রথমে তথ্য রাখার জন্য একটি ডেটা উৎস তৈরি করতে হবে। একটি ডেটা উৎস সাধারণত একটি নির্দিষ্ট API বা চিকিৎসা ব্যবস্থার প্রতিনিধিত্ব করে।

উদাহরণে, আমরা My Hospital নামে একটি ডেটা উৎস তৈরি করি এবং FHIR সংস্করণ নির্দিষ্ট করি।

import android.health.connect.CreateMedicalDataSourceRequest
import android.health.connect.HealthConnectManager
import android.health.connect.datatypes.FhirVersion
import android.health.connect.datatypes.MedicalDataSource
import android.net.Uri
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.os.asOutcomeReceiver
import kotlinx.coroutines.suspendCancellableCoroutine
...
private suspend fun createMedicalDataSource(
    fhirBaseUri: Uri,
    displayName: String,
    fhirVersion: FhirVersion,
): String {
    val dataSource =
        suspendCancellableCoroutine<MedicalDataSource> { continuation ->
            healthConnectManager.createMedicalDataSource(
                CreateMedicalDataSourceRequest.Builder(fhirBaseUri,
                                                       displayName,
                                                       fhirVersion).build(),
                Runnable::run,
                continuation.asOutcomeReceiver(),
            )
        }
    Log.d("CREATE_DATA_SOURCE", "Created source: $dataSource")
    return "Created data source: $displayName"
}
...
createMedicalDataSource(
    Uri.parse("example.fhir.com/R4/123"),
    "My Hospital",
    FhirVersion.parseFhirVersion("4.0.1"),
)

রেকর্ড লিখুন

JSON-এ FHIR রেকর্ডের উদাহরণ প্রস্তুত করুন। এফএইচআইআর ফর্ম্যাটে উদাহরণ ডেটা সহ ওয়েবে বিভিন্ন উত্স রয়েছে৷

{
  "resourceType": "Immunization",
  "id": "immunization-1",
  "status": "completed",
  "vaccineCode": {
    "coding": [
      {
        "system": "http://hl7.org/fhir/sid/cvx",
        "code": "115"
      },
      {
        "system": "http://hl7.org/fhir/sid/ndc",
        "code": "58160-842-11"
      }
    ],
    "text": "Tdap"
  },
  "patient": {
    "reference": "Patient/patient_1",
    "display": "Example, Anne"
  },
  "encounter": {
    "reference": "Encounter/encounter_unk",
    "display": "GP Visit"
  },
  "occurrenceDateTime": "2018-05-21",
  "primarySource": true,
  "manufacturer": {
    "display": "Sanofi Pasteur"
  },
  "lotNumber": "1",
  "site": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActSite",
        "code": "LA",
        "display": "Left Arm"
      }
    ],
    "text": "Left Arm"
  },
  "route": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration",
        "code": "IM",
        "display": "Injection, intramuscular"
      }
    ],
    "text": "Injection, intramuscular"
  },
  "doseQuantity": {
    "value": 0.5,
    "unit": "mL"
  },
  "performer": [
    {
      "function": {
        "coding": [
          {
            "system": "http://terminology.hl7.org/CodeSystem/v2-0443",
            "code": "AP",
            "display": "Administering Provider"
          }
        ],
        "text": "Administering Provider"
      },
      "actor": {
        "reference": "Practitioner/practitioner_1",
        "type": "Practitioner",
        "display": "Dr Maria Hernandez"
      }
    }
  ]
}

তথ্য সন্নিবেশ করান:

import android.health.connect.UpsertMedicalResourceRequest
import android.health.connect.datatypes.MedicalResource
...
private suspend fun loadJSONFromAsset(assetName: String): String {
...
private suspend fun upsertMedicalResources(
    requests: List<UpsertMedicalResourceRequest>
): List<MedicalResource> {
    Log.d("UPSERT_RESOURCES", "Writing ${requests.size} resources")
    val resources =
        suspendCancellableCoroutine<List<MedicalResource>> { continuation ->
            healthConnectManager.upsertMedicalResources(
                requests,
                Runnable::run,
                continuation.asOutcomeReceiver(),
            )
        }
    Log.d("UPSERT_RESOURCES", "Wrote ${resources.size} resources")
    return resources
}
...
private suspend fun insertResource(insertedDataSourceId: String, resource: String): String {
    val insertedResources =
        upsertMedicalResources(
            listOf(
                UpsertMedicalResourceRequest.Builder(
                        insertedDataSourceId,
                        FhirVersion.parseFhirVersion("4.0.1"),
                        resource,
                    )
                    .build()
            )
        )
    return insertedResources.joinToString(
        separator = "\n",
        transform = MedicalResource::toString,
    )
}
...
val immunizationResource =
    loadJSONFromAsset("immunization_1.json")
insertResource(dataSource.id, immunizationResource)

upsertMedicalResources যুক্তি হিসাবে UpsertMedicalResourceRequest এর একটি তালিকা নেয়। যদি কলে পাস করা কোনো ব্যক্তিগত UpsertMedicalResourceRequest সন্নিবেশ করাতে ব্যর্থ হয়, তাহলে UpsertMedicalResourceRequest এর সম্পূর্ণ তালিকার জন্য কোনো রিপোজিটরিতে প্রতিশ্রুতিবদ্ধ হবে না।

যদি কোনো অনুরোধে অবৈধ MedicalDataSource আইডি থাকে, তাহলে API একটি IllegalArgumentException নিক্ষেপ করবে। যদি কোনো অনুরোধ অন্য কোনো কারণে অবৈধ বলে গণ্য হয়, কলকারী একটি HealthConnectException পাবেন।

একটি নির্দিষ্ট অনুরোধের জন্য অনন্য কী হল ডেটা সোর্স আইডি, এফএইচআইআর রিসোর্স টাইপ এবং এফএইচআইআর রিসোর্স আইডির সমন্বয়। যদি একটি অনুরোধে এই তিনটি আইটেম বিদ্যমান রেকর্ডের সাথে মেলে, একটি আপডেট ট্রিগার করা হয়। অন্যথায়, একটি নতুন রেকর্ড তৈরি করা হয়।

রেকর্ড পড়ুন

টাইপ দ্বারা রেকর্ড পড়ুন, তারপর আপনি উপযুক্ত দেখতে ফলাফল পরিচালনা করুন.

import android.health.connect.ReadMedicalResourcesInitialRequest
import android.health.connect.ReadMedicalResourcesResponse
import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATIONS
...
private suspend fun readImmunization(): List<MedicalResource> {

    var receiver: OutcomeReceiver<ReadMedicalResourcesResponse, HealthConnectException>
    val request: ReadMedicalResourcesInitialRequest =
        ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATIONS).build()
    val resources =
        suspendCancellableCoroutine<ReadMedicalResourcesResponse> { continuation ->
                receiver = continuation.asOutcomeReceiver()
                healthConnectManager.readMedicalResources(request, Runnable::run, receiver)
            }
            .medicalResources
    Log.d("READ_MEDICAL_RESOURCES", "Read ${resources.size} resources")
    return resources
}
,

ব্যক্তিগত স্বাস্থ্য রেকর্ড (PHR) এর জন্য Android ফ্রেমওয়ার্ক API ব্যবহার করতে, আপনাকে অবশ্যই:

  1. অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিবেশ কনফিগার করুন
  2. ইনস্ট্যান্টিয়েট HealthConnectManager
  3. অনুমতি হ্যান্ডেল
  4. ডেটা উত্স তৈরি করুন

অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে পরিবেশ কনফিগার করুন

সর্বশেষ এপিআই-এ অ্যাক্সেস পাওয়ার জন্য, আপনাকে সর্বশেষ প্রাসঙ্গিক টুলিং-এও অ্যাক্সেস করতে হবে:

  • অ্যান্ড্রয়েড স্টুডিওর সর্বশেষ সংস্করণটি ইনস্টল করুন।
  • অ্যান্ড্রয়েড স্টুডিওতে, টুলস > SDK ম্যানেজার- এ যান।
    • SDK প্ল্যাটফর্ম ট্যাবে, Android Baklava নির্বাচন করুন।
    • এই সংস্করণে API স্তর 36 এবং PHR API অন্তর্ভুক্ত রয়েছে৷
    • SDK টুলস ট্যাবে, সর্বশেষ উপলব্ধ Android SDK বিল্ড-টুলস নির্বাচন করুন।
    • SDK ইনস্টল করতে ওকে ক্লিক করুন।
  • অ্যান্ড্রয়েড গ্রেডল প্লাগইনের সর্বশেষ উপলব্ধ সংস্করণটি ব্যবহার করুন।

API স্তর ঘোষণা করুন

PHR APIগুলি অ্যাক্সেস করতে, আপনাকে Android এর উপযুক্ত সংস্করণকে লক্ষ্য করতে হবে৷ এটি app/build.gradle এ API স্তর ঘোষণা করে করা হয়।

...
compileSdk = 36

defaultConfig {
  targetSdk = 36
...

use-sdk-element- এ API লেভেল কনফিগার করার বিষয়ে আরও জানুন এবং Android 16 sdk ডকুমেন্টেশন সেট আপ করুন

অনুমতি ঘোষণা করুন

AndroidManifest.xml এ নতুন PHR অনুমতি যোগ করুন। আপনি আপনার অ্যাপ্লিকেশনে ব্যবহার করতে চান এমন ডেটা টাইপের জন্য অনুমতি ঘোষণা করুন। চিকিৎসা সংক্রান্ত অনুমতির সম্পূর্ণ তালিকা কোড ব্লকে দেখানো হয়েছে। স্বাস্থ্য সংযোগের জন্য অ-PHR-সম্পর্কিত অনুমতি অন্তর্ভুক্ত করা হয় না।

...
  <!--  Medical permissions -->
  <uses-permission android:name="android.permission.health.WRITE_MEDICAL_DATA"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_CONDITIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_IMMUNIZATIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_MEDICATIONS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PREGNANCY"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_PROCEDURES"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VISITS"/>
  <uses-permission android:name="android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS"/>
...

যদি একটি অ্যাপ্লিকেশন এমন একটি API ব্যবহার করার চেষ্টা করে যার জন্য একটি অনুমতির প্রয়োজন হয় এবং সেই অনুমতিটি অ্যাপের ম্যানিফেস্টে ঘোষণা করা না হয়, তাহলে একটি SecurityException নিক্ষেপ করা হবে৷

SecurityException টাইপের একটি ব্যতিক্রমের জন্য, exception.localizedMessage এ একটি দরকারী ত্রুটি বার্তা পাওয়া যাবে।

ইনস্ট্যান্টিয়েট হেলথ কানেক্ট ম্যানেজার

HealthConnectManager হল অনুমতির মিথস্ক্রিয়া পরিচালনা করার পাশাপাশি Health Connect স্থানীয় ডেটা রিপোজিটরিতে পড়া এবং লেখার জন্য দায়ী ক্লাস। আমরা পরবর্তী বিভাগে HealthConnectManager এর উদাহরণ পদ্ধতিগুলি অন্বেষণ করব। যেহেতু HealthConnectManager একটি সিস্টেম পরিষেবা প্রকাশ করে, আপনি এই ক্লাসটিকে সরাসরি ইনস্ট্যান্ট করতে পারবেন না এবং অবশ্যই getSystemService ব্যবহার করতে হবে। বিশেষ করে, মনে রাখবেন যে সিস্টেম পরিষেবাটি যে প্রেক্ষাপটের বিরুদ্ধে তাত্ক্ষণিকভাবে যুক্ত হয়েছে তার সাথে শক্তভাবে মিলিত হয়েছে এবং সেই প্রসঙ্গের বাইরে অ্যাক্সেসযোগ্য করা উচিত নয়।

import android.health.connect.HealthConnectManager
...
val healthConnectManager: HealthConnectManager = requireNotNull(applicationContext.getSystemService(HealthConnectManager::class.java))

অনুমতি হ্যান্ডেল

আপনার অ্যাপ্লিকেশনের ব্যবহারকারীকে অবশ্যই আপনার অ্যাপ্লিকেশনটিকে Health Connect ডেটা অ্যাক্সেস করার অনুমতি দিতে হবে। এটি করার জন্য, নির্দিষ্ট অনুমতিগুলির সাথে একটি নতুন কার্যকলাপ চালু করুন এবং প্রদত্ত অনুমতিগুলির ফলাফলের তালিকাটি ব্যবহার করুন। নতুন ক্রিয়াকলাপের UI ব্যবহারকারীকে আপনার অ্যাপটি দেওয়ার জন্য প্রয়োজনীয় অনুমতিগুলি নির্বাচন করার অনুমতি দেবে৷ আপনি আপনার অ্যাপ্লিকেশন ব্যবহার করতে চান শুধুমাত্র সেইসব ডেটা প্রকারের জন্য অনুমতির অনুরোধ করুন৷

val MEDICAL_PERMISSIONS = arrayOf(
            "android.permission.health.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES",
            "android.permission.health.READ_MEDICAL_DATA_CONDITIONS",
            "android.permission.health.READ_MEDICAL_DATA_IMMUNIZATIONS",
            "android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS",
            "android.permission.health.READ_MEDICAL_DATA_MEDICATIONS",
            "android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS",
            "android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS",
            "android.permission.health.READ_MEDICAL_DATA_PREGNANCY",
            "android.permission.health.READ_MEDICAL_DATA_PROCEDURES",
            "android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY",
            "android.permission.health.READ_MEDICAL_DATA_VISITS",
            "android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS",
            "android.permission.health.WRITE_MEDICAL_DATA",
        )
...
private lateinit var mRequestPermissionLauncher: ActivityResultLauncher<Array<String>>
...
mRequestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
            permissionMap: Map<String, Boolean> ->
            requestPermissionResultHandler(permissionMap)
        }
}
...
private fun requestPermissionResultHandler(permissionMap: Map<String, Boolean>) {
    // Evaluate permissionMap and handle any missing permissions
}
...
mRequestPermissionLauncher.launch(MEDICAL_PERMISSIONS)

প্রয়োজনীয় অনুমতি ছাড়াই পড়তে বা লেখার চেষ্টা করলে একটি HealthConnectException হবে।

HealthConnectException টাইপের একটি ব্যতিক্রমের জন্য, exception.localizedMessage এ একটি দরকারী ত্রুটি বার্তা পাওয়া যাবে।

ডেটা উত্স তৈরি করুন

Health Connect-এ স্বাস্থ্যের ডেটা লিখতে, আপনার অ্যাপ্লিকেশনটিকে প্রথমে তথ্য রাখার জন্য একটি ডেটা উৎস তৈরি করতে হবে। একটি ডেটা উৎস সাধারণত একটি নির্দিষ্ট API বা চিকিৎসা ব্যবস্থার প্রতিনিধিত্ব করে।

উদাহরণে, আমরা My Hospital নামে একটি ডেটা উৎস তৈরি করি এবং FHIR সংস্করণ নির্দিষ্ট করি।

import android.health.connect.CreateMedicalDataSourceRequest
import android.health.connect.HealthConnectManager
import android.health.connect.datatypes.FhirVersion
import android.health.connect.datatypes.MedicalDataSource
import android.net.Uri
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.os.asOutcomeReceiver
import kotlinx.coroutines.suspendCancellableCoroutine
...
private suspend fun createMedicalDataSource(
    fhirBaseUri: Uri,
    displayName: String,
    fhirVersion: FhirVersion,
): String {
    val dataSource =
        suspendCancellableCoroutine<MedicalDataSource> { continuation ->
            healthConnectManager.createMedicalDataSource(
                CreateMedicalDataSourceRequest.Builder(fhirBaseUri,
                                                       displayName,
                                                       fhirVersion).build(),
                Runnable::run,
                continuation.asOutcomeReceiver(),
            )
        }
    Log.d("CREATE_DATA_SOURCE", "Created source: $dataSource")
    return "Created data source: $displayName"
}
...
createMedicalDataSource(
    Uri.parse("example.fhir.com/R4/123"),
    "My Hospital",
    FhirVersion.parseFhirVersion("4.0.1"),
)

রেকর্ড লিখুন

JSON-এ FHIR রেকর্ডের উদাহরণ প্রস্তুত করুন। এফএইচআইআর ফর্ম্যাটে উদাহরণ ডেটা সহ ওয়েবে বিভিন্ন উত্স রয়েছে৷

{
  "resourceType": "Immunization",
  "id": "immunization-1",
  "status": "completed",
  "vaccineCode": {
    "coding": [
      {
        "system": "http://hl7.org/fhir/sid/cvx",
        "code": "115"
      },
      {
        "system": "http://hl7.org/fhir/sid/ndc",
        "code": "58160-842-11"
      }
    ],
    "text": "Tdap"
  },
  "patient": {
    "reference": "Patient/patient_1",
    "display": "Example, Anne"
  },
  "encounter": {
    "reference": "Encounter/encounter_unk",
    "display": "GP Visit"
  },
  "occurrenceDateTime": "2018-05-21",
  "primarySource": true,
  "manufacturer": {
    "display": "Sanofi Pasteur"
  },
  "lotNumber": "1",
  "site": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActSite",
        "code": "LA",
        "display": "Left Arm"
      }
    ],
    "text": "Left Arm"
  },
  "route": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration",
        "code": "IM",
        "display": "Injection, intramuscular"
      }
    ],
    "text": "Injection, intramuscular"
  },
  "doseQuantity": {
    "value": 0.5,
    "unit": "mL"
  },
  "performer": [
    {
      "function": {
        "coding": [
          {
            "system": "http://terminology.hl7.org/CodeSystem/v2-0443",
            "code": "AP",
            "display": "Administering Provider"
          }
        ],
        "text": "Administering Provider"
      },
      "actor": {
        "reference": "Practitioner/practitioner_1",
        "type": "Practitioner",
        "display": "Dr Maria Hernandez"
      }
    }
  ]
}

তথ্য সন্নিবেশ করান:

import android.health.connect.UpsertMedicalResourceRequest
import android.health.connect.datatypes.MedicalResource
...
private suspend fun loadJSONFromAsset(assetName: String): String {
...
private suspend fun upsertMedicalResources(
    requests: List<UpsertMedicalResourceRequest>
): List<MedicalResource> {
    Log.d("UPSERT_RESOURCES", "Writing ${requests.size} resources")
    val resources =
        suspendCancellableCoroutine<List<MedicalResource>> { continuation ->
            healthConnectManager.upsertMedicalResources(
                requests,
                Runnable::run,
                continuation.asOutcomeReceiver(),
            )
        }
    Log.d("UPSERT_RESOURCES", "Wrote ${resources.size} resources")
    return resources
}
...
private suspend fun insertResource(insertedDataSourceId: String, resource: String): String {
    val insertedResources =
        upsertMedicalResources(
            listOf(
                UpsertMedicalResourceRequest.Builder(
                        insertedDataSourceId,
                        FhirVersion.parseFhirVersion("4.0.1"),
                        resource,
                    )
                    .build()
            )
        )
    return insertedResources.joinToString(
        separator = "\n",
        transform = MedicalResource::toString,
    )
}
...
val immunizationResource =
    loadJSONFromAsset("immunization_1.json")
insertResource(dataSource.id, immunizationResource)

upsertMedicalResources যুক্তি হিসাবে UpsertMedicalResourceRequest এর একটি তালিকা নেয়। যদি কলে পাস করা কোনো ব্যক্তিগত UpsertMedicalResourceRequest সন্নিবেশ করাতে ব্যর্থ হয়, তাহলে UpsertMedicalResourceRequest এর সম্পূর্ণ তালিকার জন্য কোনো রিপোজিটরিতে প্রতিশ্রুতিবদ্ধ হবে না।

যদি কোনো অনুরোধে অবৈধ MedicalDataSource আইডি থাকে, তাহলে API একটি IllegalArgumentException নিক্ষেপ করবে। যদি কোনো অনুরোধ অন্য কোনো কারণে অবৈধ বলে গণ্য হয়, কলকারী একটি HealthConnectException পাবেন।

একটি নির্দিষ্ট অনুরোধের জন্য অনন্য কী হল ডেটা সোর্স আইডি, এফএইচআইআর রিসোর্স টাইপ এবং এফএইচআইআর রিসোর্স আইডির সমন্বয়। যদি একটি অনুরোধে এই তিনটি আইটেম বিদ্যমান রেকর্ডের সাথে মেলে, একটি আপডেট ট্রিগার করা হয়। অন্যথায়, একটি নতুন রেকর্ড তৈরি করা হয়।

রেকর্ড পড়ুন

টাইপ দ্বারা রেকর্ড পড়ুন, তারপর আপনি উপযুক্ত দেখতে ফলাফল পরিচালনা করুন.

import android.health.connect.ReadMedicalResourcesInitialRequest
import android.health.connect.ReadMedicalResourcesResponse
import android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_IMMUNIZATIONS
...
private suspend fun readImmunization(): List<MedicalResource> {

    var receiver: OutcomeReceiver<ReadMedicalResourcesResponse, HealthConnectException>
    val request: ReadMedicalResourcesInitialRequest =
        ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_IMMUNIZATIONS).build()
    val resources =
        suspendCancellableCoroutine<ReadMedicalResourcesResponse> { continuation ->
                receiver = continuation.asOutcomeReceiver()
                healthConnectManager.readMedicalResources(request, Runnable::run, receiver)
            }
            .medicalResources
    Log.d("READ_MEDICAL_RESOURCES", "Read ${resources.size} resources")
    return resources
}