Blame view

泰额版/Food Labeling Management App UniApp/src/utils/print/bluetoothPermissions.ts 2.77 KB
59e51671   “wangming”   1
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  export interface BluetoothPermissionResult {
    ok: boolean
    message?: string
  }
  
  function normalizePermissionName (permission: string): string {
    return String(permission || '').split('.').pop() || String(permission || '')
  }
  
  function formatDeniedMessage (permissions: string[]): string {
    if (!permissions.length) return 'Bluetooth permission denied.'
    return 'Please allow Bluetooth permissions: ' + permissions.map(normalizePermissionName).join(', ')
  }
  
  function requestAndroidPermissions (permissions: string[]): Promise<BluetoothPermissionResult> {
    return new Promise((resolve) => {
      // #ifdef APP-PLUS
      try {
        if (typeof plus === 'undefined' || !plus.android || !permissions.length) {
          resolve({ ok: true })
          return
        }
        plus.android.requestPermissions(
          permissions,
          (resultObj: any) => {
            const deniedPresent = Array.isArray(resultObj?.deniedPresent) ? resultObj.deniedPresent : []
            const deniedAlways = Array.isArray(resultObj?.deniedAlways) ? resultObj.deniedAlways : []
            const denied = [...deniedPresent, ...deniedAlways]
            if (denied.length > 0) {
              resolve({
                ok: false,
                message: formatDeniedMessage(denied),
              })
              return
            }
            resolve({ ok: true })
          },
          () => {
            resolve({
              ok: false,
              message: 'Failed to request Bluetooth permissions.',
            })
          }
        )
        return
      } catch (e: any) {
        resolve({
          ok: false,
          message: e?.message || 'Failed to request Bluetooth permissions.',
        })
        return
      }
      // #endif
      resolve({ ok: true })
    })
  }
  
  export async function ensureBluetoothPermissions (options?: {
    scan?: boolean
    connect?: boolean
  }): Promise<BluetoothPermissionResult> {
    const { scan = false, connect = false } = options || {}
  
    // #ifdef APP-PLUS
    try {
      if (typeof plus === 'undefined' || !plus.android) {
        return { ok: true }
      }
      const Build = plus.android.importClass('android.os.Build')
      const sdkInt = Number(Build.VERSION.SDK_INT || 0)
  
      const permissions = new Set<string>()
      if (sdkInt >= 31) {
        if (scan) permissions.add('android.permission.BLUETOOTH_SCAN')
        if (scan || connect) permissions.add('android.permission.BLUETOOTH_CONNECT')
        if (scan) permissions.add('android.permission.ACCESS_FINE_LOCATION')
      } else if (scan) {
        permissions.add('android.permission.ACCESS_FINE_LOCATION')
        permissions.add('android.permission.ACCESS_COARSE_LOCATION')
      }
  
      return await requestAndroidPermissions(Array.from(permissions))
    } catch (e: any) {
      return {
        ok: false,
        message: e?.message || 'Bluetooth permission check failed.',
      }
    }
    // #endif
  
    return { ok: true }
  }