Hướng dẫn này tương thích với Health Connect phiên bản 1.1.0-beta02.
Để ghi dữ liệu y tế bằng Hồ sơ y tế trong Health Connect, hãy làm theo các bước sau:
- Kiểm tra phạm vi cung cấp của các tính năng
- Yêu cầu quyền ghi
- Tạo nguồn dữ liệu (
MedicalDataSource
) - Viết tài nguyên y tế (
MedicalResource
)
Phạm vi cung cấp tính năng
Để xác định xem thiết bị của người dùng có hỗ trợ Hồ sơ sức khoẻ trên Health Connect hay không, hãy kiểm tra trạng thái cung cấp củaFEATURE_PERSONAL_HEALTH_RECORD
trên ứng dụng:
if (healthConnectClient
.features
.getFeatureStatus(
HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD
) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {
// Feature is available
} else {
// Feature isn't available
}
Hãy xem phần Kiểm tra phạm vi cung cấp của các tính năng để tìm hiểu thêm.
Các quyền bắt buộc
Việc ghi dữ liệu y tế được bảo vệ bằng quyền sau:
android.permission.health.WRITE_MEDICAL_DATA
Khai báo các quyền này trong Play Console cho ứng dụng của bạn, cũng như trong tệp kê khai của ứng dụng:
<application>
<uses-permission
android:name="android.permission.health.WRITE_MEDICAL_DATA" />
</application>
Bạn có trách nhiệm khai báo tất cả các quyền thích hợp mà bạn dự định sử dụng trong thiết bị và ứng dụng của mình. Bạn cũng nên kiểm tra để đảm bảo người dùng đã cấp từng quyền trước khi sử dụng.
Yêu cầu người dùng cấp quyền
Sau khi tạo một phiên bản ứng dụng, ứng dụng của bạn cần yêu cầu người dùng cấp quyền. Người dùng phải được phép cấp hoặc từ chối cấp quyền bất cứ lúc nào.
Để thực hiện việc này, hãy tạo một tập hợp quyền cho các kiểu dữ liệu bắt buộc. Trước tiên, bạn cần khai báo các quyền trong tập hợp này ở tệp kê khai Android.
// Create a set of permissions for required data types
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_WRITE_MEDICAL_DATA
val PERMISSIONS =
setOf(
PERMISSION_WRITE_MEDICAL_DATA
)
Hãy sử dụng getGrantedPermissions
để xem ứng dụng của bạn đã được cấp các quyền cần thiết chưa. Nếu chưa, hãy sử dụng createRequestPermissionResultContract
để yêu cầu các quyền đó. Thao tác này sẽ hiện màn hình các quyền của Health Connect.
// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()
val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
if (granted.containsAll(PERMISSIONS)) {
// Permissions successfully granted
} else {
// Lack of required permissions
}
}
suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
val granted = healthConnectClient.permissionController.getGrantedPermissions()
if (granted.containsAll(PERMISSIONS)) {
// Permissions already granted; proceed with inserting or reading data
} else {
requestPermissions.launch(PERMISSIONS)
}
}
Vì người dùng có thể cấp hoặc thu hồi quyền bất cứ lúc nào, nên ứng dụng của bạn cần kiểm tra định kỳ các quyền đã cấp và xử lý các tình huống khi mất quyền.
Nguồn dữ liệu
MedicalDataSource
trong Health Connect đại diện cho một nguồn dữ liệu mà người dùng có thể thấy, chẳng hạn như một tổ chức chăm sóc sức khoẻ, bệnh viện hoặc API.
Hồ sơ y tế được lưu trữ trong Health Connect được sắp xếp thành một MedicalDataSource
. Điều này cho phép tách biệt hồ sơ y tế của cùng một cá nhân đến từ nhiều nguồn như API hoặc hệ thống chăm sóc sức khoẻ.
Nếu tất cả các bản ghi đều bắt nguồn từ cùng một nguồn, thì ứng dụng viết chỉ cần tạo một MedicalDataSource
. Nếu các bản ghi bắt nguồn từ nhiều nguồn, thì ứng dụng vẫn có thể tạo một MedicalDataSource
duy nhất nếu dữ liệu đó được đối chiếu và tất cả các bản ghi đều có một tổ hợp duy nhất gồm loại tài nguyên FHIR và mã tài nguyên FHIR.
Nếu không, bạn nên tạo một MedicalDataSource
cho mỗi nguồn dữ liệu.
Tất cả hồ sơ y tế phải được liên kết với một MedicalDataSource
, vì vậy, bạn phải tạo hồ sơ này trước khi ghi tài nguyên.
Các thuộc tính của MedicalDataSource
:
- Tên hiển thị (bắt buộc) – Tên hiển thị mà người dùng nhìn thấy cho nguồn dữ liệu, được xác định riêng cho mỗi ứng dụng viết.
URI cơ sở FHIR (bắt buộc) – Đối với dữ liệu đến từ máy chủ FHIR, đây phải là URL cơ sở FHIR (ví dụ:
https://example.com/fhir/
). Bạn có thể liên kết nhiều nguồn dữ liệu với cùng một URL cơ sở FHIR.Nếu dữ liệu do một ứng dụng tạo ra mà không có URL FHIR, thì đây phải là một URI duy nhất và dễ hiểu do ứng dụng xác định (ví dụ:
myapp://..
) trỏ đến nguồn dữ liệu.Ví dụ: nếu một ứng dụng khách hỗ trợ đường liên kết sâu, thì đường liên kết sâu này có thể được dùng làm URI cơ sở FHIR. Độ dài tối đa cho URI là 2.000 ký tự.
Tên gói (được điền tự động) – Ứng dụng ghi dữ liệu.
Phiên bản FHIR (bắt buộc) – Phiên bản FHIR. Phải là một phiên bản được hỗ trợ.
Tạo bản ghi MedicalDataSource
Tạo một bản ghi cho mỗi tổ chức hoặc pháp nhân y tế mà ứng dụng của bạn được liên kết.
// Create a `MedicalDataSource`
// Note that `displayName` must be unique across `MedicalDataSource`s
// Each `MedicalDataSource` is assigned an `id` by the system on creation
val medicalDataSource: MedicalDataSource =
healthConnectClient.createMedicalDataSource(
CreateMedicalDataSourceRequest(
fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
displayName = "Test Data Source",
fhirVersion = FhirVersion(4, 0, 1)
)
)
Xoá bản ghi MedicalDataSource
Ví dụ trước trả về một id
theo hệ thống khi tạo. Nếu bạn cần xoá bản ghi MedicalDataSource
, hãy tham chiếu đến cùng một id
:
// Delete the `MedicalDataSource` that has the specified `id`
healthConnectClient.deleteMedicalDataSourceWithData(medicalDataSource.id)
Tài nguyên y tế
MedicalResource
trong Health Connect đại diện cho một tài nguyên FHIR (chứa hồ sơ y tế), cùng với siêu dữ liệu.
Các thuộc tính của MedicalResource
:
- DataSourceId (bắt buộc) – Nguồn dữ liệu như mô tả cho
MedicalDataSource
. - Phiên bản FHIR (bắt buộc) – Phiên bản FHIR. Phải là một phiên bản được hỗ trợ.
- Tài nguyên FHIR (bắt buộc) Thực thể tài nguyên FHIR được mã hoá bằng JSON.
- Loại tài nguyên y tế (được điền sẵn tự động) – Danh mục dành cho người dùng của tài nguyên, ánh xạ đến các quyền dành cho người dùng.
Chuẩn bị tài nguyên FHIR ở định dạng JSON
Trước khi ghi tài nguyên y tế vào Health Connect, hãy chuẩn bị các bản ghi tài nguyên FHIR ở định dạng JSON. Lưu trữ từng JSON trong biến riêng để chèn dưới dạng tài nguyên y tế.
Nếu bạn cần trợ giúp về định dạng JSON FHIR, hãy tham khảo dữ liệu mẫu do tổ chức HL7 cung cấp.
Chèn hoặc cập nhật bản ghi MedicalResource
Sử dụng UpsertMedicalResourceRequest
để chèn bản ghi MedicalResource
mới hoặc cập nhật bản ghi hiện có cho MedicalDataSource
:
// Insert `MedicalResource`s into the `MedicalDataSource`
val medicalResources: List<MedicalResource> =
healthConnectClient.upsertMedicalResources(
listOf(
UpsertMedicalResourceRequest(
medicalDataSource.id,
medicalDataSource.fhirVersion,
medicationJsonToInsert // a valid FHIR json string
)
)
)
// Update `MedicalResource`s in the `MedicalDataSource`
val updatedMedicalResources: List<MedicalResource> =
healthConnectClient.upsertMedicalResources(
listOf(
UpsertMedicalResourceRequest(
medicalDataSource.id,
medicalDataSource.fhirVersion,
// a valid FHIR json string
// if this resource has the same type and ID as in `medicationJsonToInsert`,
// this `upsertMedicalResources()` call will update the previously inserted
// `MedicalResource`
updatedMedicationJsonToInsert
)
)
)
Ví dụ về tài nguyên FHIR
Trong ví dụ trước, biến medicationJsonToInsert
biểu thị một chuỗi JSON FHIR hợp lệ.
Sau đây là ví dụ về JSON đó, sử dụng AllergyIntolerance làm loại tài nguyên FHIR, sẽ liên kết với Loại tài nguyên y tế FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE
trong Hồ sơ y tế:
{
"resourceType": "AllergyIntolerance",
"id": "allergyintolerance-1",
"criticality": "high",
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "91936005",
"display": "Penicillin allergy"
}
],
"text": "Penicillin allergy"
},
"recordedDate": "2020-10-09T14:58:00+00:00",
"asserter": {
"reference": "Patient/patient-1"
},
"lastOccurrence": "2020-10-09",
"patient": {
"reference": "Patient/patient-1",
"display": "B., Alex"
}
...
}
Xoá bản ghi MedicalResource
MedicalResource
bản ghi có thể bị xoá theo mã nhận dạng:
// Delete `MedicalResource`s matching the specified `dataSourceId`, `type` and `fhirResourceId`
healthConnectClient.deleteMedicalResources(
medicalResources.map { medicalResource: MedicalResource ->
MedicalResourceId(
dataSourceId = medicalDataSource.id,
fhirResourceType = medicalResource.id.fhirResourceType,
fhirResourceId = medicalResource.id.fhirResourceId
)
}
)
Hoặc medicalResourceType
có thể xoá các ảnh/video đó:
// Delete all `MedicalResource`s that are in any pair of provided `dataSourceIds` and
// `medicalResourceTypes`
healthConnectClient.deleteMedicalResources(
DeleteMedicalResourcesRequest(
dataSourceIds = setOf(medicalDataSource.id),
medicalResourceTypes = setOf(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
)
)