miniprogramme/utils/device.js

475 lines
12 KiB
JavaScript
Raw Normal View History

2025-09-12 16:08:17 +08:00
// 设备工具类 - 对应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;