JavaScript bridge API
Health Connect
Чтение и запись шагов, расстояния, калорий, пульса, сна, веса и тренировок через Health Connect в Android — именно для тех типов, которые отмечены в сборке.
AppMint.health помощник#
AppMint.health.isAvailable() / requestPermissions() / read() / write() / openHealthConnect()
Пример
Читает и записывает данные пользователя о здоровье через Health Connect: шаги, расстояние, активные калории, пульс, сон, вес и тренировки. Включите Данные о здоровье (Health Connect) на шаге «Доступ» в мастере и отметьте типы и то, читает ли приложение каждый из них или записывает — запрашивать можно только их.
Возвращает: каждый метод возвращает Promise. isAvailable() → {ok: true, available, status, read, write} (status: available, not_installed, update_required, unsupported = Android ниже 8.0, disabled = опция выключена). Остальные → {ok: true, …} или {ok: false, code, message} с code disabled, unsupported, not_installed, update_required, not_declared (тип не отмечен в мастере), permission (пользователь не дал разрешение), bad-input, blocked (страница с другого сайта), failed. Требуется: опция в мастере, Android 8.0+ и Health Connect (встроен в Android 14+, до этого — приложение из Play).
Типы: steps, distance, calories, heartRate, sleep, weight, exercise. Время указывается в миллисекундах (Date.now()), объектах Date или строках ISO; ответы приходят в виде строк ISO.
Проверьте, затем запросите:
async function connectHealth() {
if (!(window.AppMint && AppMint.health)) return false; // browser or option off
var s = await AppMint.health.isAvailable();
if (s.status === 'not_installed') { await AppMint.health.openHealthConnect(); return false; }
if (!s.available) return false;
var r = await AppMint.health.requestPermissions({ read: ['steps', 'heartRate'], write: ['weight'] });
return r.ok && r.denied.read.length === 0;
}Шаги за сегодня (итоги — с aggregate: true, сами записи — без него):
async function stepsToday() {
var start = new Date(); start.setHours(0, 0, 0, 0);
var r = await AppMint.health.read('steps', { start: start, end: new Date(), aggregate: true });
if (!r.ok) { console.warn(r.code, r.message); return 0; }
return r.aggregate.count;
}
async function lastNightHeartRate() {
var end = Date.now(), start = end - 12 * 3600 * 1000;
var r = await AppMint.health.read('heartRate', { start: start, end: end });
// r.records = [{start, end, id, samples: [{time, bpm}]}]
return r.ok ? r.records.flatMap(function (x) { return x.samples; }) : [];
}Запись — одна запись или массив:
await AppMint.health.write('weight', { time: Date.now(), kilograms: 72.4 });
await AppMint.health.write('exercise', [{
start: Date.now() - 45 * 60000, end: Date.now(), exerciseType: 'running', title: 'Evening run'
}]);
await AppMint.health.write('steps', { start: Date.now() - 3600000, end: Date.now(), count: 4200 });Поля записей: steps {start, end, count} · distance {start, end, meters} · calories {start, end, kilocalories} · heartRate {start, end, samples: [{time, bpm}]} · sleep {start, end, title?, stages?: [{start, end, stage}]} (awake, sleeping, out_of_bed, light, deep, rem) · weight {time, kilograms} · exercise {start, end, exerciseType, title?} (названия Health Connect, например running, walking, biking, swimming_pool, yoga, strength_training, other_workout). Агрегаты: steps {count}, distance {meters}, calories {kilocalories}, heartRate {avg, min, max}, sleep / exercise {minutes}, weight {avg, min, max} (кг).
Примечания: Health Connect показывает вашу политику конфиденциальности на экране разрешений — адрес с шага «Завершение» или сгенерированную политику. Перед публикацией в Google Play заполните в Play Console раздел Контент приложения → Приложения для здоровья с теми же типами данных и объяснением, зачем приложению каждый из них; Play проверяет разрешения для данных о здоровье. Health Connect даёт приложению историю за последние 30 дней до первого предоставления доступа. Низкоуровневые методы моста за ним (healthIsAvailable, healthRequestPermissions, healthRead, healthWrite, healthOpen) принимают текст JSON и идентификатор обратного вызова — используйте вспомогательную функцию.
healthIsAvailable мост#
window.WebToApk.healthIsAvailable(callbackId: String)
Состояние Health Connect для этого приложения; передаёт в [callbackId] `{available, status, read, write}`.
Пример
Описано вместе с AppMint.health — пример там показывает и этот.
Читает и записывает данные пользователя о здоровье через Health Connect: шаги, расстояние, активные калории, пульс, сон, вес и тренировки. Включите Данные о здоровье (Health Connect) на шаге «Доступ» в мастере и отметьте типы и то, читает ли приложение каждый из них или записывает — запрашивать можно только их.
Возвращает: каждый метод возвращает Promise. isAvailable() → {ok: true, available, status, read, write} (status: available, not_installed, update_required, unsupported = Android ниже 8.0, disabled = опция выключена). Остальные → {ok: true, …} или {ok: false, code, message} с code disabled, unsupported, not_installed, update_required, not_declared (тип не отмечен в мастере), permission (пользователь не дал разрешение), bad-input, blocked (страница с другого сайта), failed. Требуется: опция в мастере, Android 8.0+ и Health Connect (встроен в Android 14+, до этого — приложение из Play).
Типы: steps, distance, calories, heartRate, sleep, weight, exercise. Время указывается в миллисекундах (Date.now()), объектах Date или строках ISO; ответы приходят в виде строк ISO.
Проверьте, затем запросите:
async function connectHealth() {
if (!(window.AppMint && AppMint.health)) return false; // browser or option off
var s = await AppMint.health.isAvailable();
if (s.status === 'not_installed') { await AppMint.health.openHealthConnect(); return false; }
if (!s.available) return false;
var r = await AppMint.health.requestPermissions({ read: ['steps', 'heartRate'], write: ['weight'] });
return r.ok && r.denied.read.length === 0;
}Шаги за сегодня (итоги — с aggregate: true, сами записи — без него):
async function stepsToday() {
var start = new Date(); start.setHours(0, 0, 0, 0);
var r = await AppMint.health.read('steps', { start: start, end: new Date(), aggregate: true });
if (!r.ok) { console.warn(r.code, r.message); return 0; }
return r.aggregate.count;
}
async function lastNightHeartRate() {
var end = Date.now(), start = end - 12 * 3600 * 1000;
var r = await AppMint.health.read('heartRate', { start: start, end: end });
// r.records = [{start, end, id, samples: [{time, bpm}]}]
return r.ok ? r.records.flatMap(function (x) { return x.samples; }) : [];
}Запись — одна запись или массив:
await AppMint.health.write('weight', { time: Date.now(), kilograms: 72.4 });
await AppMint.health.write('exercise', [{
start: Date.now() - 45 * 60000, end: Date.now(), exerciseType: 'running', title: 'Evening run'
}]);
await AppMint.health.write('steps', { start: Date.now() - 3600000, end: Date.now(), count: 4200 });Поля записей: steps {start, end, count} · distance {start, end, meters} · calories {start, end, kilocalories} · heartRate {start, end, samples: [{time, bpm}]} · sleep {start, end, title?, stages?: [{start, end, stage}]} (awake, sleeping, out_of_bed, light, deep, rem) · weight {time, kilograms} · exercise {start, end, exerciseType, title?} (названия Health Connect, например running, walking, biking, swimming_pool, yoga, strength_training, other_workout). Агрегаты: steps {count}, distance {meters}, calories {kilocalories}, heartRate {avg, min, max}, sleep / exercise {minutes}, weight {avg, min, max} (кг).
Примечания: Health Connect показывает вашу политику конфиденциальности на экране разрешений — адрес с шага «Завершение» или сгенерированную политику. Перед публикацией в Google Play заполните в Play Console раздел Контент приложения → Приложения для здоровья с теми же типами данных и объяснением, зачем приложению каждый из них; Play проверяет разрешения для данных о здоровье. Health Connect даёт приложению историю за последние 30 дней до первого предоставления доступа. Низкоуровневые методы моста за ним (healthIsAvailable, healthRequestPermissions, healthRead, healthWrite, healthOpen) принимают текст JSON и идентификатор обратного вызова — используйте вспомогательную функцию.
healthOpen мост#
window.WebToApk.healthOpen(callbackId: String)
Открывает Health Connect или его страницу в Play Store, если он не установлен.
Пример
Описано вместе с AppMint.health — пример там показывает и этот.
Читает и записывает данные пользователя о здоровье через Health Connect: шаги, расстояние, активные калории, пульс, сон, вес и тренировки. Включите Данные о здоровье (Health Connect) на шаге «Доступ» в мастере и отметьте типы и то, читает ли приложение каждый из них или записывает — запрашивать можно только их.
Возвращает: каждый метод возвращает Promise. isAvailable() → {ok: true, available, status, read, write} (status: available, not_installed, update_required, unsupported = Android ниже 8.0, disabled = опция выключена). Остальные → {ok: true, …} или {ok: false, code, message} с code disabled, unsupported, not_installed, update_required, not_declared (тип не отмечен в мастере), permission (пользователь не дал разрешение), bad-input, blocked (страница с другого сайта), failed. Требуется: опция в мастере, Android 8.0+ и Health Connect (встроен в Android 14+, до этого — приложение из Play).
Типы: steps, distance, calories, heartRate, sleep, weight, exercise. Время указывается в миллисекундах (Date.now()), объектах Date или строках ISO; ответы приходят в виде строк ISO.
Проверьте, затем запросите:
async function connectHealth() {
if (!(window.AppMint && AppMint.health)) return false; // browser or option off
var s = await AppMint.health.isAvailable();
if (s.status === 'not_installed') { await AppMint.health.openHealthConnect(); return false; }
if (!s.available) return false;
var r = await AppMint.health.requestPermissions({ read: ['steps', 'heartRate'], write: ['weight'] });
return r.ok && r.denied.read.length === 0;
}Шаги за сегодня (итоги — с aggregate: true, сами записи — без него):
async function stepsToday() {
var start = new Date(); start.setHours(0, 0, 0, 0);
var r = await AppMint.health.read('steps', { start: start, end: new Date(), aggregate: true });
if (!r.ok) { console.warn(r.code, r.message); return 0; }
return r.aggregate.count;
}
async function lastNightHeartRate() {
var end = Date.now(), start = end - 12 * 3600 * 1000;
var r = await AppMint.health.read('heartRate', { start: start, end: end });
// r.records = [{start, end, id, samples: [{time, bpm}]}]
return r.ok ? r.records.flatMap(function (x) { return x.samples; }) : [];
}Запись — одна запись или массив:
await AppMint.health.write('weight', { time: Date.now(), kilograms: 72.4 });
await AppMint.health.write('exercise', [{
start: Date.now() - 45 * 60000, end: Date.now(), exerciseType: 'running', title: 'Evening run'
}]);
await AppMint.health.write('steps', { start: Date.now() - 3600000, end: Date.now(), count: 4200 });Поля записей: steps {start, end, count} · distance {start, end, meters} · calories {start, end, kilocalories} · heartRate {start, end, samples: [{time, bpm}]} · sleep {start, end, title?, stages?: [{start, end, stage}]} (awake, sleeping, out_of_bed, light, deep, rem) · weight {time, kilograms} · exercise {start, end, exerciseType, title?} (названия Health Connect, например running, walking, biking, swimming_pool, yoga, strength_training, other_workout). Агрегаты: steps {count}, distance {meters}, calories {kilocalories}, heartRate {avg, min, max}, sleep / exercise {minutes}, weight {avg, min, max} (кг).
Примечания: Health Connect показывает вашу политику конфиденциальности на экране разрешений — адрес с шага «Завершение» или сгенерированную политику. Перед публикацией в Google Play заполните в Play Console раздел Контент приложения → Приложения для здоровья с теми же типами данных и объяснением, зачем приложению каждый из них; Play проверяет разрешения для данных о здоровье. Health Connect даёт приложению историю за последние 30 дней до первого предоставления доступа. Низкоуровневые методы моста за ним (healthIsAvailable, healthRequestPermissions, healthRead, healthWrite, healthOpen) принимают текст JSON и идентификатор обратного вызова — используйте вспомогательную функцию.
healthRead мост#
window.WebToApk.healthRead(type: String, optionsJson: String, callbackId: String)
Читает записи [type] (или итоги с `aggregate:true`) между `start` и `end` из [optionsJson].
Пример
Описано вместе с AppMint.health — пример там показывает и этот.
Читает и записывает данные пользователя о здоровье через Health Connect: шаги, расстояние, активные калории, пульс, сон, вес и тренировки. Включите Данные о здоровье (Health Connect) на шаге «Доступ» в мастере и отметьте типы и то, читает ли приложение каждый из них или записывает — запрашивать можно только их.
Возвращает: каждый метод возвращает Promise. isAvailable() → {ok: true, available, status, read, write} (status: available, not_installed, update_required, unsupported = Android ниже 8.0, disabled = опция выключена). Остальные → {ok: true, …} или {ok: false, code, message} с code disabled, unsupported, not_installed, update_required, not_declared (тип не отмечен в мастере), permission (пользователь не дал разрешение), bad-input, blocked (страница с другого сайта), failed. Требуется: опция в мастере, Android 8.0+ и Health Connect (встроен в Android 14+, до этого — приложение из Play).
Типы: steps, distance, calories, heartRate, sleep, weight, exercise. Время указывается в миллисекундах (Date.now()), объектах Date или строках ISO; ответы приходят в виде строк ISO.
Проверьте, затем запросите:
async function connectHealth() {
if (!(window.AppMint && AppMint.health)) return false; // browser or option off
var s = await AppMint.health.isAvailable();
if (s.status === 'not_installed') { await AppMint.health.openHealthConnect(); return false; }
if (!s.available) return false;
var r = await AppMint.health.requestPermissions({ read: ['steps', 'heartRate'], write: ['weight'] });
return r.ok && r.denied.read.length === 0;
}Шаги за сегодня (итоги — с aggregate: true, сами записи — без него):
async function stepsToday() {
var start = new Date(); start.setHours(0, 0, 0, 0);
var r = await AppMint.health.read('steps', { start: start, end: new Date(), aggregate: true });
if (!r.ok) { console.warn(r.code, r.message); return 0; }
return r.aggregate.count;
}
async function lastNightHeartRate() {
var end = Date.now(), start = end - 12 * 3600 * 1000;
var r = await AppMint.health.read('heartRate', { start: start, end: end });
// r.records = [{start, end, id, samples: [{time, bpm}]}]
return r.ok ? r.records.flatMap(function (x) { return x.samples; }) : [];
}Запись — одна запись или массив:
await AppMint.health.write('weight', { time: Date.now(), kilograms: 72.4 });
await AppMint.health.write('exercise', [{
start: Date.now() - 45 * 60000, end: Date.now(), exerciseType: 'running', title: 'Evening run'
}]);
await AppMint.health.write('steps', { start: Date.now() - 3600000, end: Date.now(), count: 4200 });Поля записей: steps {start, end, count} · distance {start, end, meters} · calories {start, end, kilocalories} · heartRate {start, end, samples: [{time, bpm}]} · sleep {start, end, title?, stages?: [{start, end, stage}]} (awake, sleeping, out_of_bed, light, deep, rem) · weight {time, kilograms} · exercise {start, end, exerciseType, title?} (названия Health Connect, например running, walking, biking, swimming_pool, yoga, strength_training, other_workout). Агрегаты: steps {count}, distance {meters}, calories {kilocalories}, heartRate {avg, min, max}, sleep / exercise {minutes}, weight {avg, min, max} (кг).
Примечания: Health Connect показывает вашу политику конфиденциальности на экране разрешений — адрес с шага «Завершение» или сгенерированную политику. Перед публикацией в Google Play заполните в Play Console раздел Контент приложения → Приложения для здоровья с теми же типами данных и объяснением, зачем приложению каждый из них; Play проверяет разрешения для данных о здоровье. Health Connect даёт приложению историю за последние 30 дней до первого предоставления доступа. Низкоуровневые методы моста за ним (healthIsAvailable, healthRequestPermissions, healthRead, healthWrite, healthOpen) принимают текст JSON и идентификатор обратного вызова — используйте вспомогательную функцию.
healthRequestPermissions мост#
window.WebToApk.healthRequestPermissions(requestJson: String, callbackId: String)
Открывает экран разрешений Health Connect для [requestJson] `{read:[…], write:[…]}`; возвращает `{granted, denied}`.
Пример
Описано вместе с AppMint.health — пример там показывает и этот.
Читает и записывает данные пользователя о здоровье через Health Connect: шаги, расстояние, активные калории, пульс, сон, вес и тренировки. Включите Данные о здоровье (Health Connect) на шаге «Доступ» в мастере и отметьте типы и то, читает ли приложение каждый из них или записывает — запрашивать можно только их.
Возвращает: каждый метод возвращает Promise. isAvailable() → {ok: true, available, status, read, write} (status: available, not_installed, update_required, unsupported = Android ниже 8.0, disabled = опция выключена). Остальные → {ok: true, …} или {ok: false, code, message} с code disabled, unsupported, not_installed, update_required, not_declared (тип не отмечен в мастере), permission (пользователь не дал разрешение), bad-input, blocked (страница с другого сайта), failed. Требуется: опция в мастере, Android 8.0+ и Health Connect (встроен в Android 14+, до этого — приложение из Play).
Типы: steps, distance, calories, heartRate, sleep, weight, exercise. Время указывается в миллисекундах (Date.now()), объектах Date или строках ISO; ответы приходят в виде строк ISO.
Проверьте, затем запросите:
async function connectHealth() {
if (!(window.AppMint && AppMint.health)) return false; // browser or option off
var s = await AppMint.health.isAvailable();
if (s.status === 'not_installed') { await AppMint.health.openHealthConnect(); return false; }
if (!s.available) return false;
var r = await AppMint.health.requestPermissions({ read: ['steps', 'heartRate'], write: ['weight'] });
return r.ok && r.denied.read.length === 0;
}Шаги за сегодня (итоги — с aggregate: true, сами записи — без него):
async function stepsToday() {
var start = new Date(); start.setHours(0, 0, 0, 0);
var r = await AppMint.health.read('steps', { start: start, end: new Date(), aggregate: true });
if (!r.ok) { console.warn(r.code, r.message); return 0; }
return r.aggregate.count;
}
async function lastNightHeartRate() {
var end = Date.now(), start = end - 12 * 3600 * 1000;
var r = await AppMint.health.read('heartRate', { start: start, end: end });
// r.records = [{start, end, id, samples: [{time, bpm}]}]
return r.ok ? r.records.flatMap(function (x) { return x.samples; }) : [];
}Запись — одна запись или массив:
await AppMint.health.write('weight', { time: Date.now(), kilograms: 72.4 });
await AppMint.health.write('exercise', [{
start: Date.now() - 45 * 60000, end: Date.now(), exerciseType: 'running', title: 'Evening run'
}]);
await AppMint.health.write('steps', { start: Date.now() - 3600000, end: Date.now(), count: 4200 });Поля записей: steps {start, end, count} · distance {start, end, meters} · calories {start, end, kilocalories} · heartRate {start, end, samples: [{time, bpm}]} · sleep {start, end, title?, stages?: [{start, end, stage}]} (awake, sleeping, out_of_bed, light, deep, rem) · weight {time, kilograms} · exercise {start, end, exerciseType, title?} (названия Health Connect, например running, walking, biking, swimming_pool, yoga, strength_training, other_workout). Агрегаты: steps {count}, distance {meters}, calories {kilocalories}, heartRate {avg, min, max}, sleep / exercise {minutes}, weight {avg, min, max} (кг).
Примечания: Health Connect показывает вашу политику конфиденциальности на экране разрешений — адрес с шага «Завершение» или сгенерированную политику. Перед публикацией в Google Play заполните в Play Console раздел Контент приложения → Приложения для здоровья с теми же типами данных и объяснением, зачем приложению каждый из них; Play проверяет разрешения для данных о здоровье. Health Connect даёт приложению историю за последние 30 дней до первого предоставления доступа. Низкоуровневые методы моста за ним (healthIsAvailable, healthRequestPermissions, healthRead, healthWrite, healthOpen) принимают текст JSON и идентификатор обратного вызова — используйте вспомогательную функцию.
healthWrite мост#
window.WebToApk.healthWrite(type: String, recordsJson: String, callbackId: String)
Записывает записи из [recordsJson] (массив) как [type]; возвращает их идентификаторы.
Пример
Описано вместе с AppMint.health — пример там показывает и этот.
Читает и записывает данные пользователя о здоровье через Health Connect: шаги, расстояние, активные калории, пульс, сон, вес и тренировки. Включите Данные о здоровье (Health Connect) на шаге «Доступ» в мастере и отметьте типы и то, читает ли приложение каждый из них или записывает — запрашивать можно только их.
Возвращает: каждый метод возвращает Promise. isAvailable() → {ok: true, available, status, read, write} (status: available, not_installed, update_required, unsupported = Android ниже 8.0, disabled = опция выключена). Остальные → {ok: true, …} или {ok: false, code, message} с code disabled, unsupported, not_installed, update_required, not_declared (тип не отмечен в мастере), permission (пользователь не дал разрешение), bad-input, blocked (страница с другого сайта), failed. Требуется: опция в мастере, Android 8.0+ и Health Connect (встроен в Android 14+, до этого — приложение из Play).
Типы: steps, distance, calories, heartRate, sleep, weight, exercise. Время указывается в миллисекундах (Date.now()), объектах Date или строках ISO; ответы приходят в виде строк ISO.
Проверьте, затем запросите:
async function connectHealth() {
if (!(window.AppMint && AppMint.health)) return false; // browser or option off
var s = await AppMint.health.isAvailable();
if (s.status === 'not_installed') { await AppMint.health.openHealthConnect(); return false; }
if (!s.available) return false;
var r = await AppMint.health.requestPermissions({ read: ['steps', 'heartRate'], write: ['weight'] });
return r.ok && r.denied.read.length === 0;
}Шаги за сегодня (итоги — с aggregate: true, сами записи — без него):
async function stepsToday() {
var start = new Date(); start.setHours(0, 0, 0, 0);
var r = await AppMint.health.read('steps', { start: start, end: new Date(), aggregate: true });
if (!r.ok) { console.warn(r.code, r.message); return 0; }
return r.aggregate.count;
}
async function lastNightHeartRate() {
var end = Date.now(), start = end - 12 * 3600 * 1000;
var r = await AppMint.health.read('heartRate', { start: start, end: end });
// r.records = [{start, end, id, samples: [{time, bpm}]}]
return r.ok ? r.records.flatMap(function (x) { return x.samples; }) : [];
}Запись — одна запись или массив:
await AppMint.health.write('weight', { time: Date.now(), kilograms: 72.4 });
await AppMint.health.write('exercise', [{
start: Date.now() - 45 * 60000, end: Date.now(), exerciseType: 'running', title: 'Evening run'
}]);
await AppMint.health.write('steps', { start: Date.now() - 3600000, end: Date.now(), count: 4200 });Поля записей: steps {start, end, count} · distance {start, end, meters} · calories {start, end, kilocalories} · heartRate {start, end, samples: [{time, bpm}]} · sleep {start, end, title?, stages?: [{start, end, stage}]} (awake, sleeping, out_of_bed, light, deep, rem) · weight {time, kilograms} · exercise {start, end, exerciseType, title?} (названия Health Connect, например running, walking, biking, swimming_pool, yoga, strength_training, other_workout). Агрегаты: steps {count}, distance {meters}, calories {kilocalories}, heartRate {avg, min, max}, sleep / exercise {minutes}, weight {avg, min, max} (кг).
Примечания: Health Connect показывает вашу политику конфиденциальности на экране разрешений — адрес с шага «Завершение» или сгенерированную политику. Перед публикацией в Google Play заполните в Play Console раздел Контент приложения → Приложения для здоровья с теми же типами данных и объяснением, зачем приложению каждый из них; Play проверяет разрешения для данных о здоровье. Health Connect даёт приложению историю за последние 30 дней до первого предоставления доступа. Низкоуровневые методы моста за ним (healthIsAvailable, healthRequestPermissions, healthRead, healthWrite, healthOpen) принимают текст JSON и идентификатор обратного вызова — используйте вспомогательную функцию.