323 lines
7.5 KiB
JavaScript
323 lines
7.5 KiB
JavaScript
/**
|
|
* 权限检查和引导工具
|
|
* 专门用于检查Android设备的网络和位置权限
|
|
*/
|
|
|
|
/**
|
|
* 检查网络相关权限
|
|
*/
|
|
export async function checkNetworkPermissions() {
|
|
console.log('🔍 开始检查网络权限...')
|
|
|
|
const permissionStatus = {
|
|
location: null,
|
|
wifi: null,
|
|
network: null,
|
|
recommendations: []
|
|
}
|
|
|
|
try {
|
|
// 检查位置权限
|
|
permissionStatus.location = await checkLocationPermission()
|
|
|
|
// 检查WiFi信息获取能力
|
|
permissionStatus.wifi = await checkWifiInfoAccess()
|
|
|
|
// 检查网络连接状态
|
|
permissionStatus.network = await checkNetworkAccess()
|
|
|
|
// 生成权限建议
|
|
permissionStatus.recommendations = generatePermissionRecommendations(permissionStatus)
|
|
|
|
} catch (error) {
|
|
console.error('❌ 权限检查异常:', error)
|
|
permissionStatus.error = error
|
|
}
|
|
|
|
return permissionStatus
|
|
}
|
|
|
|
/**
|
|
* 检查位置权限
|
|
*/
|
|
async function checkLocationPermission() {
|
|
try {
|
|
const result = await new Promise((resolve) => {
|
|
uni.getLocation({
|
|
type: 'wgs84',
|
|
success: (res) => {
|
|
console.log('✅ 位置权限正常')
|
|
resolve({
|
|
granted: true,
|
|
message: '位置权限已授权'
|
|
})
|
|
},
|
|
fail: (err) => {
|
|
console.log('❌ 位置权限被拒绝:', err.errMsg)
|
|
resolve({
|
|
granted: false,
|
|
message: err.errMsg,
|
|
error: err
|
|
})
|
|
}
|
|
})
|
|
})
|
|
|
|
return result
|
|
|
|
} catch (error) {
|
|
return {
|
|
granted: false,
|
|
message: '位置权限检查失败',
|
|
error
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 检查WiFi信息获取能力
|
|
*/
|
|
async function checkWifiInfoAccess() {
|
|
try {
|
|
const result = await new Promise((resolve) => {
|
|
uni.getConnectedWifi({
|
|
success: (res) => {
|
|
console.log('✅ WiFi信息获取正常:', res.SSID)
|
|
resolve({
|
|
accessible: true,
|
|
ssid: res.SSID,
|
|
bssid: res.BSSID,
|
|
message: `已连接WiFi: ${res.SSID}`
|
|
})
|
|
},
|
|
fail: (err) => {
|
|
console.log('❌ WiFi信息获取失败:', err.errMsg)
|
|
resolve({
|
|
accessible: false,
|
|
message: err.errMsg,
|
|
error: err
|
|
})
|
|
}
|
|
})
|
|
})
|
|
|
|
return result
|
|
|
|
} catch (error) {
|
|
return {
|
|
accessible: false,
|
|
message: 'WiFi信息检查失败',
|
|
error
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 检查网络连接状态
|
|
*/
|
|
async function checkNetworkAccess() {
|
|
try {
|
|
const networkType = await uni.getNetworkType()
|
|
|
|
console.log(`📶 网络类型: ${networkType.networkType}`)
|
|
console.log(`🔗 连接状态: ${networkType.isConnected ? '已连接' : '未连接'}`)
|
|
|
|
// 测试实际网络连接
|
|
const internetTest = await testInternetConnection()
|
|
|
|
return {
|
|
type: networkType.networkType,
|
|
connected: networkType.isConnected,
|
|
internetAccess: internetTest.success,
|
|
message: `网络: ${networkType.networkType}, 连接: ${networkType.isConnected ? '是' : '否'}, 互联网: ${internetTest.success ? '正常' : '异常'}`
|
|
}
|
|
|
|
} catch (error) {
|
|
return {
|
|
type: 'unknown',
|
|
connected: false,
|
|
internetAccess: false,
|
|
message: '网络状态检查失败',
|
|
error
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 测试互联网连接
|
|
*/
|
|
async function testInternetConnection() {
|
|
try {
|
|
const result = await new Promise((resolve) => {
|
|
uni.request({
|
|
url: 'https://www.baidu.com',
|
|
method: 'HEAD',
|
|
timeout: 3000,
|
|
success: () => {
|
|
resolve({ success: true })
|
|
},
|
|
fail: (err) => {
|
|
resolve({ success: false, error: err.errMsg })
|
|
}
|
|
})
|
|
})
|
|
|
|
return result
|
|
|
|
} catch (error) {
|
|
return { success: false, error: error.message }
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 生成权限建议
|
|
*/
|
|
function generatePermissionRecommendations(status) {
|
|
const recommendations = []
|
|
|
|
// 位置权限建议
|
|
if (!status.location?.granted) {
|
|
recommendations.push({
|
|
type: 'location',
|
|
priority: 'high',
|
|
title: '需要开启位置权限',
|
|
description: 'Android 13+获取WiFi信息必须有位置权限',
|
|
actions: [
|
|
'打开手机设置 → 应用管理 → StillSense',
|
|
'点击权限管理 → 位置信息',
|
|
'选择"仅在使用中允许"'
|
|
]
|
|
})
|
|
}
|
|
|
|
// WiFi信息访问建议
|
|
if (!status.wifi?.accessible) {
|
|
recommendations.push({
|
|
type: 'wifi',
|
|
priority: 'high',
|
|
title: '无法获取WiFi信息',
|
|
description: '可能被小米手机的隐私保护限制',
|
|
actions: [
|
|
'打开设置 → 隐私保护 → 权限管理',
|
|
'找到局域网访问 → StillSense → 允许',
|
|
'关闭"局域网设备防追踪"功能'
|
|
]
|
|
})
|
|
}
|
|
|
|
// 网络连接建议
|
|
if (!status.network?.internetAccess) {
|
|
recommendations.push({
|
|
type: 'network',
|
|
priority: 'medium',
|
|
title: '网络连接异常',
|
|
description: '无法访问互联网,可能影响局域网功能',
|
|
actions: [
|
|
'检查WiFi连接是否正常',
|
|
'尝试重新连接WiFi',
|
|
'检查是否需要WiFi认证'
|
|
]
|
|
})
|
|
}
|
|
|
|
// 小米手机特殊建议
|
|
const systemInfo = uni.getSystemInfoSync()
|
|
if (systemInfo.brand?.toLowerCase().includes('xiaomi') ||
|
|
systemInfo.brand?.toLowerCase().includes('redmi')) {
|
|
recommendations.push({
|
|
type: 'xiaomi',
|
|
priority: 'high',
|
|
title: '小米手机特殊设置',
|
|
description: '小米MIUI需要额外的权限设置',
|
|
actions: [
|
|
'设置 → 省电与电池 → 关闭省电模式',
|
|
'或将APP添加到省电白名单',
|
|
'设置 → 隐私保护 → 防追踪 → 关闭局域网设备防追踪'
|
|
]
|
|
})
|
|
}
|
|
|
|
return recommendations
|
|
}
|
|
|
|
/**
|
|
* 显示权限设置指南
|
|
*/
|
|
export function showPermissionGuide(recommendations) {
|
|
if (recommendations.length === 0) {
|
|
uni.showToast({
|
|
title: '权限检查通过',
|
|
icon: 'success'
|
|
})
|
|
return
|
|
}
|
|
|
|
// 构建指南内容
|
|
let guideContent = '📱 权限设置指南:\n\n'
|
|
|
|
recommendations.forEach((rec, index) => {
|
|
guideContent += `${index + 1}. ${rec.title}\n`
|
|
guideContent += `${rec.description}\n`
|
|
if (rec.actions.length > 0) {
|
|
guideContent += '操作步骤:\n'
|
|
rec.actions.forEach(action => {
|
|
guideContent += `• ${action}\n`
|
|
})
|
|
}
|
|
guideContent += '\n'
|
|
})
|
|
|
|
uni.showModal({
|
|
title: '权限设置指南',
|
|
content: guideContent,
|
|
confirmText: '我知道了',
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
console.log('📋 权限设置指南已显示')
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 一键权限检查和指导
|
|
*/
|
|
export async function runPermissionDiagnosis() {
|
|
console.log('🔍 开始权限诊断...')
|
|
|
|
uni.showLoading({ title: '检查权限中...' })
|
|
|
|
try {
|
|
const status = await checkNetworkPermissions()
|
|
uni.hideLoading()
|
|
|
|
console.log('📋 权限检查结果:', status)
|
|
|
|
if (status.recommendations.length > 0) {
|
|
showPermissionGuide(status.recommendations)
|
|
} else {
|
|
uni.showToast({
|
|
title: '权限设置正常',
|
|
icon: 'success'
|
|
})
|
|
}
|
|
|
|
return status
|
|
|
|
} catch (error) {
|
|
uni.hideLoading()
|
|
console.error('❌ 权限诊断异常:', error)
|
|
uni.showToast({
|
|
title: '权限检查失败',
|
|
icon: 'none'
|
|
})
|
|
return null
|
|
}
|
|
}
|
|
|
|
export default {
|
|
checkNetworkPermissions,
|
|
showPermissionGuide,
|
|
runPermissionDiagnosis
|
|
}
|