'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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()
  }
}