475 lines
12 KiB
JavaScript
475 lines
12 KiB
JavaScript
|
|
// 设备工具类 - 对应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;
|