"Permission denied" Tizen 网络应用程序在访问 Samsung Gear S3 frontier 上的心率监测器时出错
"Permission denied" Tizen web app error accessing the heart rate monitor on a Samsung Gear S3 frontier
我正尝试在 tizen 中为我的 Samsung Gear S3 frontier 创建一个网络应用程序。但是,我遇到了 "Permission denied" 安全错误。
我有:
<tizen:privilege name="http://developer.samsung.com/privilege/healthinfo"/>
和
<tizen:privilege name="http://tizen.org/privilege/healthinfo"/>
在我的 config.xml 中启用。
如果我在设置中为应用程序启用传感器权限,我可以获得心率读数,但每次编译和上传新版本时它都会重置,这相当乏味。
这是我的 JS 代码,排序如下 :
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" 传感器,如果不手动设置权限,我也无法访问它。
如何解决这个问题?
我想我自己找到了答案,经过一些更有创意的网络搜索。它是使用 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();
希望对大家有所帮助。我用它创建了一个 ES2016 npm/webpack 项目,如果你需要更多信息,请访问 https://github.com/reinvantveer/Axyll
我正尝试在 tizen 中为我的 Samsung Gear S3 frontier 创建一个网络应用程序。但是,我遇到了 "Permission denied" 安全错误。
我有:
<tizen:privilege name="http://developer.samsung.com/privilege/healthinfo"/>
和
<tizen:privilege name="http://tizen.org/privilege/healthinfo"/>
在我的 config.xml 中启用。
如果我在设置中为应用程序启用传感器权限,我可以获得心率读数,但每次编译和上传新版本时它都会重置,这相当乏味。
这是我的 JS 代码,排序如下
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" 传感器,如果不手动设置权限,我也无法访问它。
如何解决这个问题?
我想我自己找到了答案,经过一些更有创意的网络搜索。它是使用 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();
希望对大家有所帮助。我用它创建了一个 ES2016 npm/webpack 项目,如果你需要更多信息,请访问 https://github.com/reinvantveer/Axyll