| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- import { permission } from '@/js_sdk/wa-permission/permission.js'
- function isAppPlus() {
- return typeof plus !== 'undefined' && !!plus?.os?.name
- }
- export function isIosApp() {
- if (!isAppPlus()) return false
- const name = String(plus.os.name || '')
- return name === 'iOS' || name.includes('iPhone')
- }
- function normalizeIosStatus(status) {
- if (status === null || status === undefined) return -1
- const num = Number(status)
- return Number.isNaN(num) ? -1 : num
- }
- function getUniAuthorizeSetting() {
- try {
- if (typeof uni.getAppAuthorizeSetting === 'function') {
- return uni.getAppAuthorizeSetting()
- }
- } catch (e) {
- console.error('getUniAuthorizeSetting error', e)
- }
- return null
- }
- function getUniCameraAuth() {
- const setting = getUniAuthorizeSetting()
- return setting?.cameraAuthorized || null
- }
- function getUniAlbumAuth() {
- const setting = getUniAuthorizeSetting()
- return setting?.albumAuthorized || null
- }
- function getIosAuthStatus(type) {
- if (!isIosApp()) return -1
- try {
- if (type === 'camera') {
- const AVCaptureDevice = plus.ios.importClass('AVCaptureDevice')
- const status = AVCaptureDevice.authorizationStatusForMediaType('video')
- return normalizeIosStatus(status)
- }
- if (type === 'album') {
- const PHPhotoLibrary = plus.ios.importClass('PHPhotoLibrary')
- const status = PHPhotoLibrary.authorizationStatus()
- return normalizeIosStatus(status)
- }
- } catch (e) {
- console.error('getIosAuthStatus error', e)
- }
- return -1
- }
- function isIosCameraGranted() {
- const uniAuth = getUniCameraAuth()
- if (uniAuth === 'authorized') return true
- if (uniAuth === 'denied' || uniAuth === 'config error') return false
- const status = getIosAuthStatus('camera')
- if (status === 3) return true
- try {
- return permission.judgeIosPermission('camera') === true
- } catch {
- return false
- }
- }
- function isIosAlbumGranted() {
- const uniAuth = getUniAlbumAuth()
- if (uniAuth === 'authorized' || uniAuth === 'limited') return true
- if (uniAuth === 'denied' || uniAuth === 'config error') return false
- const status = getIosAuthStatus('album')
- return status === 3 || status === 4
- }
- function isIosCameraDenied() {
- const uniAuth = getUniCameraAuth()
- if (uniAuth === 'denied' || uniAuth === 'config error') return true
- const status = getIosAuthStatus('camera')
- return status === 1 || status === 2
- }
- function isIosAlbumDenied() {
- const uniAuth = getUniAlbumAuth()
- if (uniAuth === 'denied' || uniAuth === 'config error') return true
- const status = getIosAuthStatus('album')
- return status === 1 || status === 2
- }
- function requestIosCameraPermission() {
- return new Promise((resolve) => {
- let settled = false
- const done = (granted) => {
- if (settled) return
- settled = true
- resolve(!!granted)
- }
- setTimeout(() => done(false), 15000)
- try {
- const AVCaptureDevice = plus.ios.importClass('AVCaptureDevice')
- AVCaptureDevice.requestAccessForMediaTypecompletionHandler('video', (granted) => {
- done(granted)
- })
- } catch (e) {
- console.error('requestIosCameraPermission error', e)
- done(false)
- }
- })
- }
- function requestIosAlbumPermission() {
- return new Promise((resolve) => {
- let settled = false
- const done = (status) => {
- if (settled) return
- settled = true
- resolve(normalizeIosStatus(status))
- }
- setTimeout(() => done(-1), 15000)
- try {
- const PHPhotoLibrary = plus.ios.importClass('PHPhotoLibrary')
- PHPhotoLibrary.requestAuthorization((status) => {
- done(status)
- })
- } catch (e) {
- console.error('requestIosAlbumPermission error', e)
- done(-1)
- }
- })
- }
- async function ensureIosCameraPermission() {
- if (isIosCameraGranted()) {
- return 'granted'
- }
- if (isIosCameraDenied()) {
- return 'denied'
- }
- const granted = await requestIosCameraPermission()
- if (granted || isIosCameraGranted()) {
- return 'granted'
- }
- return 'denied'
- }
- async function ensureIosAlbumPermission() {
- if (isIosAlbumGranted()) {
- return 'granted'
- }
- if (isIosAlbumDenied()) {
- return 'denied'
- }
- const status = await requestIosAlbumPermission()
- if (status === 3 || status === 4 || isIosAlbumGranted()) {
- return 'granted'
- }
- return 'denied'
- }
- function getAndroidAlbumPermission() {
- const Build = plus.android.importClass('android.os.Build')
- return Build.VERSION.SDK_INT >= 33
- ? 'android.permission.READ_MEDIA_IMAGES'
- : 'android.permission.READ_EXTERNAL_STORAGE'
- }
- async function ensureAndroidPermission(permissionID) {
- const granted = await permission.checkAndroidPermission(permissionID)
- if (granted === 1) return 'granted'
- const result = await permission.requestAndroidPermission(permissionID)
- if (result === 1) return 'granted'
- if (result === -1) return 'denied_always'
- return 'denied'
- }
- export async function ensureScanCameraPermission() {
- if (!isAppPlus()) return 'granted'
- if (isIosApp()) return ensureIosCameraPermission()
- return ensureAndroidPermission('android.permission.CAMERA')
- }
- export async function ensureScanAlbumPermission() {
- if (!isAppPlus()) return 'granted'
- if (isIosApp()) return ensureIosAlbumPermission()
- return ensureAndroidPermission(getAndroidAlbumPermission())
- }
- export function isIosPermissionDenied(type) {
- if (!isIosApp()) return false
- return type === 'camera' ? isIosCameraDenied() : isIosAlbumDenied()
- }
- export function isPermissionError(error) {
- const msg = String(error?.errMsg || error?.message || error).toLowerCase()
- return (
- error?._permissionDenied === true
- || msg.includes('permission')
- || msg.includes('authorize')
- || msg.includes('auth deny')
- || msg.includes('auth')
- || msg.includes('权限')
- || msg.includes('no permission')
- || msg.includes('denied')
- || msg.includes('拒绝')
- || msg.includes('未授权')
- )
- }
- export function shouldGuideToSettings(state) {
- if (state === 'denied_always') return true
- if (state === 'denied' && isIosApp()) return true
- return false
- }
- export function openAppPermissionSetting() {
- if (!isAppPlus()) return
- if (typeof uni.openAppAuthorizeSetting === 'function') {
- uni.openAppAuthorizeSetting({})
- return
- }
- permission.gotoAppPermissionSetting()
- }
|