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() }