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ơ sức khoẻ cá nhân (PHR) trong Health Connect, hãy làm theo các bước sau:
- Kiểm tra phạm vi cung cấp 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ợ PHR trên Health Connect hay không, hãy kiểm tra tình trạng của FEATURE_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
Quyền 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 rằng 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 nhìn thấy, chẳng hạn như một tổ chức y tế, bệnh viện hoặc một 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 phân tách hồ sơ y tế của cùng một cá nhân đến từ nhiều nguồn, chẳng hạn như API hoặc hệ thống chăm sóc sức khoẻ.
Nếu tất 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ều chỉnh và tất cả các bản ghi đều có tổ hợp duy nhất của loại tài nguyên FHIR và mã nhận dạng tài nguyên FHIR.
Nếu không, bạn phải 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 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 duy nhất 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 được tạo bởi một ứng dụng 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 của dữ liệu.Ví dụ: nếu một ứng dụng khách hỗ trợ 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 của URI là 2000 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à phiên bản được hỗ trợ.
Tạo bản ghi MedicalDataSource
Tạo bản ghi cho từng tổ chức hoặc thực thể chăm sóc sức khoẻ mà ứng dụng của bạn 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
do hệ thống tạo. Nếu bạn cần xoá bản ghi MedicalDataSource
, hãy tham chiếu 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à phiên bản được hỗ trợ.
- Tài nguyên FHIR (bắt buộc) Phiên bản tài nguyên FHIR được mã hoá JSON.
- Loại tài nguyên y tế (được điền tự động) – danh mục dành cho người dùng của tài nguyên, liên kết với 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 tệp JSON trong biến riêng để chèn dưới dạng tài nguyên y tế.
Nếu bạn cần được 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 MedicalResource
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
đại diện cho một chuỗi JSON FHIR hợp lệ.
Dưới đây là ví dụ về nội dung JSON đó, sử dụng AllergyIntolerance làm loại tài nguyên FHIR. Loại tài nguyên này sẽ liên kết với Loại tài nguyên y tế của FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE
trong PHR:
{
"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
Bạn có thể xoá các bản ghi MedicalResource
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 bạn có thể xoá các tệp đó bằng medicalResourceType
:
// 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)
)
)