miniprogramme/utils/device.js
2025-09-12 16:08:17 +08:00

475 lines
No EOL
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 设备工具类 - 对应Flutter的device_util.dart
const config = require('../config/config.js');
class DeviceUtil {
constructor() {
this.systemInfo = null;
this.deviceId = null;
this.initialized = false;
}
// 初始化
async init() {
try {
// 获取系统信息
await this.getSystemInfo();
// 生成设备ID
this.generateDeviceId();
this.initialized = true;
console.log('设备工具初始化完成');
console.log('设备信息:', this.getDeviceInfo());
} catch (error) {
console.error('设备工具初始化失败:', error);
}
}
// 获取系统信息
async getSystemInfo() {
return new Promise((resolve, reject) => {
wx.getSystemInfo({
success: (res) => {
this.systemInfo = res;
console.log('系统信息获取成功:', res);
resolve(res);
},
fail: (error) => {
console.error('获取系统信息失败:', error);
reject(error);
}
});
});
}
// 生成设备ID
generateDeviceId() {
// 小程序无法获取真正的设备ID使用时间戳+随机数生成
const timestamp = Date.now();
const random = Math.floor(Math.random() * 1000000);
this.deviceId = `mp_${timestamp}_${random}`;
// 尝试从存储中获取已保存的设备ID
try {
const savedDeviceId = wx.getStorageSync('lanmei_deviceId');
if (savedDeviceId) {
this.deviceId = savedDeviceId;
} else {
// 保存生成的设备ID
wx.setStorageSync('lanmei_deviceId', this.deviceId);
}
} catch (error) {
console.error('设备ID操作失败:', error);
}
}
// 获取设备ID
getDeviceId() {
if (!this.deviceId) {
this.generateDeviceId();
}
return this.deviceId;
}
// 获取设备型号
getDeviceModel() {
if (!this.systemInfo) {
return 'Unknown';
}
return this.systemInfo.model || 'Unknown';
}
// 获取设备类型 - 与Flutter项目保持一致
getDeviceType() {
// 小程序使用android类型后端只接受'android'或'ios'
return 'android';
}
// 获取系统版本
getSystemVersion() {
if (!this.systemInfo) {
return 'Unknown';
}
return this.systemInfo.system || 'Unknown';
}
// 获取微信版本
getWeChatVersion() {
if (!this.systemInfo) {
return 'Unknown';
}
return this.systemInfo.version || 'Unknown';
}
// 获取应用版本
getAppVersion() {
return config.appVersion;
}
// 获取平台信息
getPlatform() {
if (!this.systemInfo) {
return 'unknown';
}
return this.systemInfo.platform || 'unknown';
}
// 获取屏幕信息
getScreenInfo() {
if (!this.systemInfo) {
return {
screenWidth: 375,
screenHeight: 812,
windowWidth: 375,
windowHeight: 812,
pixelRatio: 2
};
}
return {
screenWidth: this.systemInfo.screenWidth,
screenHeight: this.systemInfo.screenHeight,
windowWidth: this.systemInfo.windowWidth,
windowHeight: this.systemInfo.windowHeight,
pixelRatio: this.systemInfo.pixelRatio,
statusBarHeight: this.systemInfo.statusBarHeight
};
}
// 获取网络类型
async getNetworkType() {
return new Promise((resolve) => {
wx.getNetworkType({
success: (res) => {
console.log('网络类型:', res.networkType);
resolve(res.networkType);
},
fail: (error) => {
console.error('获取网络类型失败:', error);
resolve('unknown');
}
});
});
}
// 获取电量信息
async getBatteryInfo() {
return new Promise((resolve) => {
wx.getBatteryInfo({
success: (res) => {
console.log('电量信息:', res);
resolve({
level: res.level,
isCharging: res.isCharging
});
},
fail: (error) => {
console.error('获取电量信息失败:', error);
resolve({
level: 100,
isCharging: false
});
}
});
});
}
// 获取指南针信息
async getCompassInfo() {
return new Promise((resolve) => {
// 先启动指南针
wx.startCompass({
success: () => {
// 监听指南针数据
wx.onCompassChange((res) => {
resolve({
direction: res.direction,
accuracy: res.accuracy
});
// 取消监听
wx.offCompassChange();
});
},
fail: (error) => {
console.error('启动指南针失败:', error);
resolve({
direction: 0,
accuracy: 0
});
}
});
});
}
// 获取加速计信息
async getAccelerometerInfo() {
return new Promise((resolve) => {
wx.startAccelerometer({
interval: 'normal',
success: () => {
wx.onAccelerometerChange((res) => {
resolve({
x: res.x,
y: res.y,
z: res.z
});
// 取消监听
wx.offAccelerometerChange();
wx.stopAccelerometer();
});
},
fail: (error) => {
console.error('启动加速计失败:', error);
resolve({
x: 0,
y: 0,
z: 0
});
}
});
});
}
// 获取陀螺仪信息
async getGyroscopeInfo() {
return new Promise((resolve) => {
wx.startGyroscope({
interval: 'normal',
success: () => {
wx.onGyroscopeChange((res) => {
resolve({
x: res.x,
y: res.y,
z: res.z
});
// 取消监听
wx.offGyroscopeChange();
wx.stopGyroscope();
});
},
fail: (error) => {
console.error('启动陀螺仪失败:', error);
resolve({
x: 0,
y: 0,
z: 0
});
}
});
});
}
// 获取设备方向
async getDeviceOrientation() {
return new Promise((resolve) => {
wx.startDeviceMotionListening({
interval: 'normal',
success: () => {
wx.onDeviceMotionChange((res) => {
resolve({
alpha: res.alpha,
beta: res.beta,
gamma: res.gamma
});
// 取消监听
wx.offDeviceMotionChange();
wx.stopDeviceMotionListening();
});
},
fail: (error) => {
console.error('启动设备方向监听失败:', error);
resolve({
alpha: 0,
beta: 0,
gamma: 0
});
}
});
});
}
// 获取完整设备信息
getDeviceInfo() {
return {
deviceId: this.getDeviceId(),
model: this.getDeviceModel(),
type: this.getDeviceType(),
system: this.getSystemVersion(),
platform: this.getPlatform(),
wechatVersion: this.getWeChatVersion(),
appVersion: this.getAppVersion(),
screen: this.getScreenInfo()
};
}
// 监听电量变化
onBatteryLevelChange(callback) {
if (this.canUseApi('onBatteryLevelChange')) {
wx.onBatteryLevelChange(callback);
} else {
console.warn('当前环境不支持电量变化监听API');
// 提供模拟回调
setTimeout(() => {
callback({
level: 100,
isCharging: false
});
}, 100);
}
}
// 监听指南针变化
onCompassChange(callback) {
wx.startCompass({
success: () => {
wx.onCompassChange(callback);
},
fail: (error) => {
console.error('启动指南针监听失败:', error);
}
});
}
// 监听加速计变化
onAccelerometerChange(callback, interval = 'normal') {
wx.startAccelerometer({
interval: interval,
success: () => {
wx.onAccelerometerChange(callback);
},
fail: (error) => {
console.error('启动加速计监听失败:', error);
}
});
}
// 监听陀螺仪变化
onGyroscopeChange(callback, interval = 'normal') {
wx.startGyroscope({
interval: interval,
success: () => {
wx.onGyroscopeChange(callback);
},
fail: (error) => {
console.error('启动陀螺仪监听失败:', error);
}
});
}
// 监听设备方向变化
onDeviceMotionChange(callback, interval = 'normal') {
wx.startDeviceMotionListening({
interval: interval,
success: () => {
wx.onDeviceMotionChange(callback);
},
fail: (error) => {
console.error('启动设备方向监听失败:', error);
}
});
}
// 停止所有传感器监听
stopAllSensors() {
try {
// 安全地停止传感器
if (this.canUseApi('stopCompass')) wx.stopCompass();
if (this.canUseApi('stopAccelerometer')) wx.stopAccelerometer();
if (this.canUseApi('stopGyroscope')) wx.stopGyroscope();
if (this.canUseApi('stopDeviceMotionListening')) wx.stopDeviceMotionListening();
// 安全地取消监听
if (this.canUseApi('offBatteryLevelChange')) wx.offBatteryLevelChange();
if (this.canUseApi('offCompassChange')) wx.offCompassChange();
if (this.canUseApi('offAccelerometerChange')) wx.offAccelerometerChange();
if (this.canUseApi('offGyroscopeChange')) wx.offGyroscopeChange();
if (this.canUseApi('offDeviceMotionChange')) wx.offDeviceMotionChange();
console.log('所有传感器监听已停止');
} catch (error) {
console.error('停止传感器监听失败:', error);
}
}
// 检查是否支持指定API
canUseApi(apiName) {
return typeof wx[apiName] === 'function';
}
// 获取支持的API列表
getSupportedApis() {
const apis = [
'getBatteryInfo',
'startCompass',
'startAccelerometer',
'startGyroscope',
'startDeviceMotionListening',
'getLocation',
'chooseLocation',
'openLocation'
];
const supportedApis = [];
apis.forEach(api => {
if (this.canUseApi(api)) {
supportedApis.push(api);
}
});
return supportedApis;
}
// 振动反馈
vibrate(type = 'short') {
if (type === 'short') {
wx.vibrateShort({
success: () => console.log('短震动成功'),
fail: (error) => console.error('短震动失败:', error)
});
} else if (type === 'long') {
wx.vibrateLong({
success: () => console.log('长震动成功'),
fail: (error) => console.error('长震动失败:', error)
});
}
}
// 设置屏幕亮度
setScreenBrightness(value) {
wx.setScreenBrightness({
value: value,
success: () => console.log('设置屏幕亮度成功:', value),
fail: (error) => console.error('设置屏幕亮度失败:', error)
});
}
// 获取屏幕亮度
async getScreenBrightness() {
return new Promise((resolve) => {
wx.getScreenBrightness({
success: (res) => {
console.log('屏幕亮度:', res.value);
resolve(res.value);
},
fail: (error) => {
console.error('获取屏幕亮度失败:', error);
resolve(0.5);
}
});
});
}
// 保持屏幕常亮
keepScreenOn(keepOn = true) {
wx.setKeepScreenOn({
keepScreenOn: keepOn,
success: () => console.log('设置屏幕常亮:', keepOn),
fail: (error) => console.error('设置屏幕常亮失败:', error)
});
}
}
// 创建单例
const deviceUtil = new DeviceUtil();
module.exports = deviceUtil;