let listener const callbackIds = [] export function startAccelerometer (options, callbackId) { const { invokeCallbackHandler: invoke } = UniServiceJSBridge if (!window.DeviceMotionEvent) { return { errMsg: 'startAccelerometer:fail' } } function addEventListener () { listener = function (event) { const acceleration = event.acceleration || event.accelerationIncludingGravity callbackIds.forEach(callbackId => { invoke(callbackId, { x: acceleration.x || 0, y: acceleration.y || 0, z: acceleration.z || 0 }) }) } window.addEventListener('devicemotion', listener, false) } if (!listener) { if (DeviceMotionEvent.requestPermission) { DeviceMotionEvent.requestPermission().then((res) => { if (res === 'granted') { addEventListener() invoke(callbackId, { errMsg: 'startAccelerometer:ok' }) } else { invoke(callbackId, { errMsg: `startAccelerometer:fail ${res}` }) } }).catch(error => { invoke(callbackId, { errMsg: `startAccelerometer:fail ${error}` }) }) return } addEventListener() } return {} } export function stopAccelerometer () { if (listener) { window.removeEventListener('devicemotion', listener, false) listener = null } return {} } export function onAccelerometerChange (callbackId) { if (!callbackIds.length) { startAccelerometer() } callbackIds.push(callbackId) } export function offAccelerometerChange (callbackId) { // 暂不支持移除所有监听 if (callbackId) { const index = callbackIds.indexOf(callbackId) if (index >= 0) { callbackIds.splice(index, 1) } } if (!callbackIds.length) { stopAccelerometer() } }