«Отказано в доступе» Ошибка веб-приложения Tizen при доступе к монитору сердечного ритма на границе Samsung Gear S3 - PullRequest
2 голосов
/ 26 апреля 2019

Я пытаюсь создать веб-приложение в tizen для своей границы Samsung Gear S3.Но я получаю ошибку безопасности «Отказано в доступе».

У меня есть:

<tizen:privilege name="http://developer.samsung.com/privilege/healthinfo"/>

и

<tizen:privilege name="http://tizen.org/privilege/healthinfo"/>

в моем config.xml.

Я могу получить показания пульса, если в настройках включаю разрешения датчиков для приложения, но он сбрасывается каждый раз, когда я компилирую и загружаю новую версию, что довольно утомительно.

Этомой код JS, вроде как Получение данных с монитора сердечного ритма GEAR S3 на мобильный или сервер :

window.onload = function () {
    // add eventListener for tizenhwkey
    document.addEventListener('tizenhwkey', function(e) {
        if(e.keyName === "back") {
            try {
                tizen.application.getCurrentApplication().exit();
            } catch (ignore) {
            }
        }
    });

    // Sample code
    var textbox = document.querySelector('.contents');
    var box = document.querySelector('#textbox');

    textbox.addEventListener("click", function(){
        console.log('have box');

        if (fetch === undefined) {
            box.innerHTML = 'No such thing as fetch';
        } else {
            box.innerHTML = "We have fetch";            
        }
    });

    var sensors = tizen.sensorservice.getAvailableSensors();
    console.log('Available sensors: ' + sensors.toString());

    var heartRateData=0;

    function onsuccessCB(hrmInfo) {

        box.innerHTML = 'Heart rate: ' + hrmInfo.heartRate;
        heartRateData = hrmInfo.heartRate;
        // holding 15 seconds as HRM sensor needs some time 
    }

    function onerrorCB(error) {
        tizen.humanactivitymonitor.stop('HRM');
        console.log('Error occurred: ' + error.message);
    }

    function onchangedCB(hrmInfo) {
        //alert("onChanged...");
        tizen.humanactivitymonitor.getHumanActivityData('HRM', onsuccessCB, onerrorCB);

    }

    tizen.humanactivitymonitor.start('HRM', onchangedCB);
};

Я ожидаю, что настройки config.xml позаботятсяразрешений, но, очевидно, это не так.Часы работают под управлением Tizen 4.0.0.2 и оснащены датчиком «HRM_RAW», к которому я также не могу получить доступ без ручной настройки разрешения.

Как мне решить эту проблему?

1 Ответ

1 голос
/ 04 мая 2019

Я думаю, что нашел ответ сам, после более творческого поиска в сети.Это делается с помощью tizen.ppm.requestPermission() (после https://developer.tizen.org/forums/web-application-development/security-exception-while-accessing-hrm

. Это приводит к ожидаемому поведению. При установке через носимый пользовательский интерфейс приложение запрашивает, должно ли быть предоставлено разрешение, и должно ли это решение использоваться по умолчанию..

Тем не менее, я провел некоторый рефакторинг, поскольку вам часто требуется несколько разрешений в вашем приложении, и адбэк обратного вызова ждет вас прямо за углом. Поэтому я написал оболочку Promise вокруг вызова tizen:

function requestPermit(uri) {
  return new Promise(function(resolve, reject) {
    tizen.ppm.requestPermission(uri,
      function(success) => { resolve(success); },
      function(error) => { reject(error); });
  });
}

, что позволяет мне

function main() {
  return permitRequester('http://tizen.org/privilege/healthinfo')
    .then(function() { return permitRequester('http://developer.samsung.com/privilege/healthinfo'); })
    .then(function() { return permitRequester('http://developer.samsung.com/privilege/medicalinfo'); })
    .then(function() { return displayHeartRate(); })
    .catch(function(err) { return console.log(err); });
}

window.onload = main();

Надеюсь, что это кому-нибудь поможет. Я создал из него проект nsm / webpack ES2016, если вам нужна дополнительная информация, на https://github.com/reinvantveer/Axyll

...