1

我正在尝试为我的三星 Gear S3 前沿在 tizen 中创建一个网络应用程序。但是,我收到“权限被拒绝”安全错误。

我有:

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

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

在我的 config.xml 中启用。

如果我在设置中启用应用程序的传感器权限,我可以获得心率读数,但每次我编译和上传新版本时它都会重置,这相当乏味。

这是我的 JS 代码,类似于从 GEAR S3 心率监视器 (HRM) 检索数据到移动设备或服务器

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”传感器,如果没有手动设置权限,我也无法访问它。

我该如何解决这个问题?

4

1 回答 1

3

我想我自己找到了答案,经过一些更有创意的网络搜索。它是使用tizen.ppm.requestPermission()(遵循https://developer.tizen.org/forums/web-application-development/security-exception-while-accessing-hrm

这导致了预期的行为。该应用程序在安装时通过可穿戴用户界面询问是否应授予权限,以及该决定是否应为默认值。

但是,我进行了一些重构,因为您的应用程序中经常需要多个权限,而回调地狱正等着您。所以我围绕 tizen 调用编写了一个 Promise 包装器:

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();

希望这对任何人都有帮助。如果您需要更多信息,我在https://github.com/reinvantveer/Axyll上创建了一个 ES2016 npm/webpack 项目

于 2019-05-04T14:33:23.603 回答