在Termux中通过纯Node.js检测Android深色模式的方案咨询
Termux Node.js环境检测安卓深色模式实现方案
可行性结论
需求完全可以实现,无需依赖electron、phantom.js等任何渲染类库,仅通过调用安卓系统原生接口即可完成检测。
可用实现方案
方案1:读取系统设置数据库(适配Root/非Root环境)
安卓系统的深色模式状态存储在系统Settings数据库的ui_night_mode字段中,直接调用系统自带的content命令即可读取:
- 执行命令:
content query --uri content://settings/system --projection name:value --where "name='ui_night_mode'" - 返回结果对应状态:
- 包含
value=2:已开启深色模式 - 包含
value=1:已开启浅色模式 - 包含
value=0:跟随省电模式自动切换
非Root设备需先通过adb给Termux授予读取系统设置权限:adb shell pm grant com.termux android.permission.READ_SETTINGS
- 包含
方案2:通过Termux API读取(解析更简单)
如果已安装Termux API组件,可直接调用termux-settings命令读取,返回结果为纯数值更易解析:
- 执行命令:
termux-settings --get system ui_night_mode
Node.js调用示例
直接通过Node.js内置的child_process模块执行上述命令解析结果即可:
const { exec } = require('child_process'); /** * 检测当前系统是否开启深色模式 * @returns {Promise<boolean>} 深色模式返回true,浅色返回false */ function isDarkModeEnabled() { return new Promise((resolve, reject) => { // 优先调用Termux API接口 exec('termux-settings --get system ui_night_mode', (apiErr, apiStdout) => { if (!apiErr) { return resolve(apiStdout.trim() === '2'); } // Fallback到系统content命令 exec('content query --uri content://settings/system --projection name:value --where "name=\'ui_night_mode\'"', (cmdErr, cmdStdout) => { if (cmdErr) return reject(cmdErr); const modeMatch = cmdStdout.match(/value=(\d)/); resolve(modeMatch ? modeMatch[1] === '2' : false); }); }); }); } // 调用示例 isDarkModeEnabled().then(isDark => { console.log('系统深色模式状态:', isDark ? '开启' : '关闭'); });
内容的提问来源于stack exchange,提问作者dev_null
相关产品推荐
相关产品推荐

