কাঁচা তথ্য পড়ুন

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে সাধারণ ওয়ার্কফ্লোর অংশ হিসেবে র ডেটা পড়তে হয়।

ডেটা পড়ুন

হেলথ কানেক্ট অ্যাপগুলিকে ফোরগ্রাউন্ড এবং ব্যাকগ্রাউন্ড উভয় অবস্থাতেই ডেটাস্টোর থেকে ডেটা পড়ার অনুমতি দেয়:

  • ফোরগ্রাউন্ড রিড : সাধারণত আপনার অ্যাপ ফোরগ্রাউন্ডে থাকলেই আপনি হেলথ কানেক্ট থেকে ডেটা পড়তে পারেন। এই ক্ষেত্রে, যদি কোনো রিড অপারেশনের সময় ব্যবহারকারী বা সিস্টেম আপনার অ্যাপটিকে ব্যাকগ্রাউন্ডে পাঠিয়ে দেয়, তবে এই অপারেশনটি চালানোর জন্য আপনি একটি ফোরগ্রাউন্ড সার্ভিস ব্যবহার করার কথা ভাবতে পারেন।

  • ব্যাকগ্রাউন্ড রিড : ব্যবহারকারীর কাছ থেকে একটি অতিরিক্ত অনুমতি চেয়ে, ব্যবহারকারী বা সিস্টেম আপনার অ্যাপটিকে ব্যাকগ্রাউন্ডে রাখার পরেও আপনি ডেটা পড়তে পারেন। সম্পূর্ণ ব্যাকগ্রাউন্ড রিড উদাহরণটি দেখুন।

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

রেকর্ড পড়ার জন্য, একটি ReadRecordsRequest তৈরি করুন এবং readRecords কল করার সময় সেটি সরবরাহ করুন।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি নির্দিষ্ট সময়ের মধ্যে একজন ব্যবহারকারীর পদক্ষেপ গণনার ডেটা পড়তে হয়। SensorManager এর একটি বিশদ উদাহরণের জন্য, পদক্ষেপ গণনার ডেটা নির্দেশিকাটি দেখুন।

val response = healthConnectClient.readRecords(
    ReadRecordsRequest(
        HeartRateRecord::class,
        timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
    )
)
response.records.forEach { record ->
    /* Process records */
}

আপনি aggregate ব্যবহার করে আপনার ডেটা সমষ্টিগতভাবেও পড়তে পারেন।

suspend fun readStepsAggregate(startTime: Instant, endTime: Instant): Long {
    val response = healthConnectClient.aggregate(
        AggregateRequest(
            metrics = setOf(StepsRecord.COUNT_TOTAL),
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )
    return response[StepsRecord.COUNT_TOTAL] ?: 0L
}

মোবাইলের ধাপগুলো পড়ুন

অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) এবং এসডিকে এক্সটেনশন ভার্সন ২০ বা তার উচ্চতর সংস্করণের সাথে, হেলথ কানেক্ট ডিভাইসেই পদক্ষেপ গণনার সুবিধা প্রদান করে। যদি কোনো অ্যাপকে READ_STEPS পারমিশন দেওয়া থাকে, তাহলে হেলথ কানেক্ট অ্যান্ড্রয়েড-চালিত ডিভাইস থেকে পদক্ষেপ গণনা শুরু করে এবং ব্যবহারকারীরা হেলথ কানেক্ট স্টেপস এন্ট্রিতে পদক্ষেপের ডেটা স্বয়ংক্রিয়ভাবে যুক্ত হতে দেখেন।

ডিভাইসে স্টেপ কাউন্টিং উপলব্ধ আছে কিনা তা পরীক্ষা করতে, যাচাই করুন যে ডিভাইসটিতে অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) চলছে এবং এতে অন্তত এসডিকে এক্সটেনশন ভার্সন ২০ রয়েছে:

val isStepTrackingAvailable =
    Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE &&
        SdkExtensions.getExtensionVersion(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) >= 20

যদি আপনার অ্যাপ aggregate ব্যবহার করে মোট পদক্ষেপের সংখ্যা পড়ে এবং DataOrigin দ্বারা ফিল্টার না করে, তাহলে ডিভাইসে থাকা পদক্ষেপগুলো স্বয়ংক্রিয়ভাবে মোট সংখ্যার মধ্যে অন্তর্ভুক্ত হয়ে যাবে, এবং জুন ২০২৬ আপডেটের জন্য কোনো পরিবর্তনের প্রয়োজন নেই।

ডিভাইসে থাকা ধাপগুলির জন্য অ্যাট্রিবিউশন পরিবর্তন

জুন ২০২৬-এর আপডেট থেকে শুরু করে, হেলথ কানেক্ট দ্বারা স্বাভাবিকভাবে ট্র্যাক করা পদক্ষেপগুলো একটি সিন্থেটিক প্যাকেজ নেম (SPN)- এর অধীনে যুক্ত করা হবে, যেমন com.android.healthconnect.phone.jd5bdd37e1a8d3667a05d0abebfc4a89e

পূর্বে, অন্তর্নির্মিত পদক্ষেপগুলো android প্যাকেজ নামের অধীনে ছিল। জুন ২০২৬-এর আগে রেকর্ড করা ঐতিহাসিক পদক্ষেপের ডেটাতেও android প্যাকেজ নামটিই বজায় থাকে।

ব্যবহারকারীর গোপনীয়তা রক্ষার জন্য এসপিএন (SPN) ডিভাইস-ভিত্তিক এবং অ্যাপ্লিকেশন-প্রতি এর পরিধি নির্ধারণ করা হয়:

  • স্থিতিশীল: বর্তমান ডিভাইসটির SPN আপনার অ্যাপ্লিকেশনের জন্য স্থিতিশীল।
  • অ্যাপ্লিকেশন-ভিত্তিক: একই ডিভাইসের বিভিন্ন অ্যাপ্লিকেশন অন-ডিভাইস স্টেপ ডেটার জন্য ভিন্ন ভিন্ন SPN দেখতে পায়।

ডিভাইসের ধাপগুলির জন্য অনুসন্ধান করুন

যেহেতু SPN-গুলো নির্দিষ্ট পরিসরের এবং ডিভাইস-ভিত্তিক, তাই SPN-এর মান হার্ডকোড করা উচিত নয় । এর পরিবর্তে, বর্তমান ডিভাইসের SPN পাওয়ার জন্য getCurrentDeviceDataSource() API ব্যবহার করুন।

ডিভাইসে স্টেপ কাউন্টিংয়ের জন্য এসডিকে এক্সটেনশন ভার্সন ২০ বা তার বেশি প্রয়োজন হলেও, getCurrentDeviceDataSource() এপিআইটি অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪)-এ এসডিকে এক্সটেনশন ভার্সন ১১ বা তার বেশি সংস্করণেই পাওয়া যায়।

হেলথ কানেক্ট জেটপ্যাক লাইব্রেরিতে getCurrentDeviceDataSource() API-টি এখনও উপলব্ধ নয়। এর পরিবর্তে, নিম্নলিখিত উদাহরণগুলিতে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক API ব্যবহার করা হয়েছে:

import android.content.Context
import android.health.connect.HealthConnectManager

val healthConnectManager = context.getSystemService(HealthConnectManager::class.java)
val deviceDataSource = healthConnectManager?.getCurrentDeviceDataSource()
val currentDeviceSpn = deviceDataSource?.deviceDataOrigin?.packageName

আপনার অ্যাপকে যদি ডিভাইসের স্টেপ সংখ্যা পড়তে হয়, অথবা যদি এটি উৎস অ্যাপ্লিকেশন বা ডিভাইস অনুযায়ী স্টেপ ডেটা ভাগ করে দেখায়, তাহলে আপনাকে অবশ্যই সেই রেকর্ডগুলো কোয়েরি করতে হবে যেখানে DataOrigin হলো android অথবা যা ডিভাইসের SPN-এর সাথে মেলে। আপনার অ্যাপ যদি স্টেপ ডেটার জন্য অ্যাট্রিবিউশন দেখায়, তাহলে প্রতিটি রেকর্ডের জন্য উৎস ডিভাইস শনাক্ত করতে metadata.device ব্যবহার করুন। একত্রিত ডেটাতে SPN দ্বারা শনাক্ত করা ডিভাইসের স্টেপ সংখ্যার জন্য, আপনি অ্যাট্রিবিউশনের জন্য DeviceDataSource থেকে model বা manufacturer মতো ডিভাইসের মেটাডেটা ব্যবহার করতে পারেন, অথবা ডিভাইসের স্টেপ সংখ্যার জন্য "আপনার ফোন"-এর মতো একটি সাধারণ লেবেল ব্যবহার করতে পারেন।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে android এবং বর্তমান ডিভাইসের SPN উভয়কে ফিল্টার করে ডিভাইসের একত্রিত পদক্ষেপ গণনার ডেটা পড়তে হয়:

import android.content.Context
import android.health.connect.HealthConnectManager
import android.os.Build
import android.os.ext.SdkExtensions
import androidx.health.connect.client.HealthConnectClient
import androidx.health.connect.client.records.StepsRecord
import androidx.health.connect.client.records.metadata.DataOrigin
import androidx.health.connect.client.request.AggregateRequest
import androidx.health.connect.client.time.TimeRangeFilter
import java.time.Instant

suspend fun readDeviceStepsByTimeRange(
    healthConnectClient: HealthConnectClient,
    context: Context,
    startTime: Instant,
    endTime: Instant
) {
    // 1. Check if SDK Extension 11+ is available for getCurrentDeviceDataSource()
    val isDataSourceApiAvailable = Build.VERSION.SDK_INT >= Build.VERSION_CODES.U &&
            SdkExtensions.getExtensionVersion(Build.VERSION_CODES.U) >= 11

    try {
        val healthConnectManager = context.getSystemService(HealthConnectManager::class.java)

        // 2. Safely fetch the package name only if API is available and data exists
        val currentDeviceSpn = if (isDataSourceApiAvailable) {
            healthConnectManager?.getCurrentDeviceDataSource()?.deviceDataOrigin?.packageName
        } else {
            null
        }

        val dataOriginFilters = mutableSetOf(DataOrigin("android"))

        // 3. Explicit null-safety check using .let
        currentDeviceSpn?.let {
            dataOriginFilters.add(DataOrigin(it))
        }

        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(StepsRecord.COUNT_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
                dataOriginFilter = dataOriginFilters
            )
        )

        val stepCount = response[StepsRecord.COUNT_TOTAL]

    } catch (e: Exception) {
        // Now this catch block only handles actual runtime exceptions, 
        // rather than Errors from missing methods.
    }
}

ডিভাইসে পদক্ষেপ গণনা

  • সেন্সরের ব্যবহার : হেলথ কানেক্ট, SensorManager থেকে TYPE_STEP_COUNTER সেন্সরটি ব্যবহার করে। এই সেন্সরটি কম বিদ্যুৎ খরচের জন্য অপ্টিমাইজ করা হয়েছে, যা এটিকে অবিচ্ছিন্ন ব্যাকগ্রাউন্ড স্টেপ ট্র্যাকিংয়ের জন্য আদর্শ করে তোলে।
  • ডেটার সূক্ষ্মতা : ব্যাটারির আয়ু বাঁচাতে, পদক্ষেপের ডেটা সাধারণত ব্যাচ করে প্রতি মিনিটে একবারের বেশি হেলথ কানেক্ট ডেটাবেসে লেখা হয় না।
  • অ্যাট্রিবিউশন : জুন ২০২৬-এর আগে এই ফিচার দ্বারা রেকর্ড করা স্টেপগুলো DataOriginandroid প্যাকেজ নামের অধীনে অ্যাট্রিবিউট করা হয়। এই তারিখের পরে, এগুলো একটি ডিভাইস-নির্দিষ্ট SPN-এর অধীনে অ্যাট্রিবিউট করা হয়। অন-ডিভাইস স্টেপগুলোর জন্য অ্যাট্রিবিউশন পরিবর্তন দেখুন।
  • সক্রিয়করণ : ডিভাইসের স্টেপ গণনার প্রক্রিয়াটি তখনই সক্রিয় হয়, যখন হেলথ কানেক্ট-এর মধ্যে ডিভাইসের অন্তত একটি অ্যাপ্লিকেশনকে READ_STEPS পারমিশন দেওয়া হয়।

পটভূমি পড়ার উদাহরণ

ব্যাকগ্রাউন্ডে ডেটা পড়ার জন্য, আপনার ম্যানিফেস্ট ফাইলে নিম্নলিখিত অনুমতিটি ঘোষণা করুন:

<application>
  <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
...
</application>

নিম্নলিখিত উদাহরণে দেখানো হয়েছে কিভাবে WorkManager ব্যবহার করে একটি নির্দিষ্ট সময়ের মধ্যে ব্যাকগ্রাউন্ডে কোনো ব্যবহারকারীর পদক্ষেপ গণনার ডেটা পড়া যায়:

class ScheduleWorker(appContext: Context, workerParams: WorkerParameters) :
    CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        val healthConnectClient = HealthConnectClient.getOrCreate(applicationContext)
        // Perform background read logic here
        return Result.success()
    }
}
@OptIn(ExperimentalFeatureAvailabilityApi::class)
fun enqueueBackgroundReadWorker(context: Context, healthConnectClient: HealthConnectClient) {
    if (healthConnectClient
            .features
            .getFeatureStatus(
                HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
            ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE
    ) {

        val periodicWorkRequest = PeriodicWorkRequestBuilder<ScheduleWorker>(1, TimeUnit.HOURS)
            .build()

        WorkManager.getInstance(context).enqueueUniquePeriodicWork(
            "read_health_connect",
            ExistingPeriodicWorkPolicy.KEEP,
            periodicWorkRequest
        )
    }
}

ReadRecordsRequest প্যারামিটারটির ডিফল্ট pageSize মান হলো 1000। যদি একটি readResponse এ রেকর্ডের সংখ্যা অনুরোধের pageSize অতিক্রম করে, তাহলে pageToken ব্যবহার করে সমস্ত রেকর্ড পুনরুদ্ধার করার জন্য আপনাকে রেসপন্সের সমস্ত পৃষ্ঠা জুড়ে পুনরাবৃত্তি করতে হবে। তবে, রেট-লিমিটিং সংক্রান্ত সমস্যা এড়াতে সতর্ক থাকুন।

পেজটোকেন পড়ার উদাহরণ

অনুরোধকৃত সময়কালের সমস্ত উপলব্ধ ডেটা পুনরুদ্ধার করার জন্য রেকর্ড পড়ার ক্ষেত্রে pageToken ব্যবহার করার পরামর্শ দেওয়া হয়।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে সমস্ত পেজ টোকেন শেষ না হওয়া পর্যন্ত সমস্ত রেকর্ড পড়তে হয়:

val type = HeartRateRecord::class
val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofDays(7))

try {
    var pageToken: String? = null
    do {
        val readResponse =
            healthConnectClient.readRecords(
                ReadRecordsRequest(
                    recordType = type,
                    timeRangeFilter = TimeRangeFilter.between(
                        startTime,
                        endTime
                    ),
                    pageToken = pageToken
                )
            )
        val records = readResponse.records
        // Do something with records
        pageToken = readResponse.pageToken
    } while (pageToken != null)
} catch (quotaError: IllegalStateException) {
    // Backoff
}
বৃহৎ ডেটাসেট পড়ার সর্বোত্তম পদ্ধতি সম্পর্কে জানতে, ‘রেট লিমিটিং এড়ানোর পরিকল্পনা’ দেখুন।

পূর্বে লেখা তথ্য পড়ুন

যদি কোনো অ্যাপ আগে হেলথ কানেক্ট-এ রেকর্ড লিখে থাকে, তবে সেই অ্যাপটির পক্ষে পুরোনো ডেটা পড়া সম্ভব। এটি সেইসব ক্ষেত্রে প্রযোজ্য, যেখানে ব্যবহারকারী অ্যাপটি পুনরায় ইনস্টল করার পর হেলথ কানেক্ট-এর সাথে সেটিকে পুনরায় সিঙ্ক করার প্রয়োজন হয়।

কিছু পঠন সীমাবদ্ধতা প্রযোজ্য:

  • অ্যান্ড্রয়েড ১৪ এবং তার উপরের সংস্করণের জন্য

    • কোনো অ্যাপের নিজের ডেটা পড়ার ক্ষেত্রে ঐতিহাসিকভাবে কোনো সীমাবদ্ধতা নেই।
    • কোনো অ্যাপের অন্য ডেটা পড়ার ক্ষেত্রে ৩০ দিনের সময়সীমা।
  • অ্যান্ড্রয়েড ১৩ এবং তার নিচের সংস্করণের জন্য

    • অ্যাপের মাধ্যমে যেকোনো ডেটা পড়ার সময়সীমা ৩০ দিন।

পড়ার অনুমতি চেয়ে বিধিনিষেধগুলো অপসারণ করা যেতে পারে।

ঐতিহাসিক ডেটা পড়ার জন্য, আপনাকে আপনার ReadRecordsRequest এর dataOriginFilter প্যারামিটারে প্যাকেজের নামটি একটি DataOrigin অবজেক্ট হিসেবে উল্লেখ করতে হবে।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে হৃদস্পন্দনের রেকর্ড পড়ার সময় একটি প্যাকেজের নাম নির্দেশ করতে হয়:

try {
    val response =  healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = HeartRateRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
            dataOriginFilter = setOf(DataOrigin("com.my.package.name"))
        )
    )
    for (record in response.records) {
        // Process each record
    }
} catch (e: Exception) {
    // Run error handling here
}

৩০ দিনের বেশি পুরানো ডেটা পড়ুন

ডিফল্টরূপে, সমস্ত অ্যাপ্লিকেশন প্রথমবার কোনো অনুমতি দেওয়ার ৩০ দিন পূর্ব পর্যন্ত হেলথ কানেক্ট থেকে ডেটা পড়তে পারে।

ডিফল্ট সীমাবদ্ধতার বাইরে পড়ার অনুমতি বাড়ানোর প্রয়োজন হলে, PERMISSION_READ_HEALTH_DATA_HISTORY অনুমতির জন্য অনুরোধ করুন। অন্যথায়, এই অনুমতি ছাড়া, ৩০ দিনের বেশি পুরোনো রেকর্ড পড়ার চেষ্টা করলে একটি ত্রুটি দেখা দেবে।

মুছে ফেলা অ্যাপের অনুমতির ইতিহাস

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

উদাহরণস্বরূপ, ধরুন ব্যবহারকারী ১০ই মে, ২০২৩ তারিখে আপনার অ্যাপটি ডিলিট করে দিলেন এবং তারপর ১৫ই মে, ২০২৩ তারিখে অ্যাপটি পুনরায় ইনস্টল করে রিড পারমিশন দিলেন। এখন থেকে আপনার অ্যাপটি ডিফল্টভাবে সর্বনিম্ন যে তারিখ থেকে ডেটা রিড করতে পারবে, তা হলো ১৫ই এপ্রিল, ২০২৩

ব্যতিক্রমগুলি পরিচালনা করুন

কোনো সমস্যা দেখা দিলে হেলথ কানেক্ট CRUD অপারেশনের জন্য সাধারণ এক্সেপশন থ্রো করে। আপনার অ্যাপের উচিত এই প্রতিটি এক্সেপশন যথাযথভাবে ক্যাচ ও হ্যান্ডেল করা।

HealthConnectClient এর প্রতিটি মেথড সম্ভাব্য এক্সেপশনগুলোর একটি তালিকা প্রদান করে। সাধারণভাবে, আপনার অ্যাপের নিম্নলিখিত এক্সেপশনগুলো হ্যান্ডেল করা উচিত:

সারণি ১: হেলথ কানেক্ট-এর ব্যতিক্রমসমূহ এবং প্রস্তাবিত সর্বোত্তম অনুশীলনসমূহ
ব্যতিক্রম বর্ণনা সুপারিশকৃত সর্বোত্তম অনুশীলন
IllegalStateException নিম্নলিখিত পরিস্থিতিগুলোর মধ্যে একটি ঘটেছে:

  • হেলথ কানেক্ট পরিষেবাটি উপলব্ধ নেই।
  • অনুরোধটি একটি বৈধ গঠন নয়। উদাহরণস্বরূপ, পিরিয়ডিক বাকেটগুলিতে একটি অ্যাগ্রিগেট অনুরোধ, যেখানে timeRangeFilter এর জন্য একটি Instant অবজেক্ট ব্যবহার করা হয়।

অনুরোধ করার আগে ইনপুটগুলোর সম্ভাব্য সমস্যাগুলো প্রথমে সমাধান করুন। অনুরোধে সরাসরি ব্যবহার না করে, ভেরিয়েবলে মান নির্ধারণ করুন অথবা সেগুলোকে একটি কাস্টম ফাংশনের প্যারামিটার হিসেবে ব্যবহার করুন, যাতে আপনি ত্রুটি ব্যবস্থাপনার কৌশলগুলো প্রয়োগ করতে পারেন।
IOException ডিস্ক থেকে ডেটা পড়া এবং লেখার সময় সমস্যা দেখা দেয়। এই সমস্যাটি এড়ানোর জন্য এখানে কিছু পরামর্শ দেওয়া হলো:

  • ব্যবহারকারীর দেওয়া যেকোনো ইনপুটের ব্যাকআপ নিন।
  • বাল্ক রাইট অপারেশন চলাকালীন উদ্ভূত যেকোনো সমস্যা সামলাতে সক্ষম হতে হবে। উদাহরণস্বরূপ, প্রক্রিয়াটি যাতে সমস্যাটি অতিক্রম করে অবশিষ্ট অপারেশনগুলো সম্পন্ন করতে পারে, তা নিশ্চিত করতে হবে।
  • অনুরোধ সংক্রান্ত সমস্যা সমাধানে রিট্রাই এবং ব্যাকঅফ কৌশল প্রয়োগ করুন।

RemoteException এসডিকে যে অন্তর্নিহিত পরিষেবার সাথে সংযুক্ত হয়, তার অভ্যন্তরে অথবা তার সাথে যোগাযোগ করার ক্ষেত্রে ত্রুটি ঘটেছে।

উদাহরণস্বরূপ, আপনার অ্যাপ একটি নির্দিষ্ট uid সহ একটি রেকর্ড মুছে ফেলার চেষ্টা করছে। কিন্তু, অ্যাপটি যখন অন্তর্নিহিত পরিষেবাতে পরীক্ষা করে জানতে পারে যে রেকর্ডটির অস্তিত্ব নেই, তখন একটি ব্যতিক্রম (exception) দেখা দেয়।
এই সমস্যাটি এড়ানোর জন্য এখানে কিছু পরামর্শ দেওয়া হলো:

  • আপনার অ্যাপের ডেটাস্টোর এবং হেলথ কানেক্ট-এর মধ্যে নিয়মিত সিঙ্ক করুন।
  • অনুরোধ সংক্রান্ত সমস্যা সমাধানে রিট্রাই এবং ব্যাকঅফ কৌশল প্রয়োগ করুন।

SecurityException যখন অনুরোধগুলোর জন্য এমন অনুমতির প্রয়োজন হয় যা দেওয়া নেই, তখন সমস্যা দেখা দেয়। এটি এড়ানোর জন্য, নিশ্চিত করুন যে আপনি আপনার প্রকাশিত অ্যাপের জন্য হেলথ কানেক্ট ডেটা টাইপ ব্যবহারের ঘোষণা দিয়েছেন । এছাড়াও, আপনাকে অবশ্যই ম্যানিফেস্ট ফাইলে এবং আপনার অ্যাক্টিভিটিতে হেলথ কানেক্ট পারমিশন ঘোষণা করতে হবে।