cadb
Version:
安卓/鸿蒙系统截图/录屏工具
164 lines (152 loc) • 4.48 kB
JavaScript
/**
* Created by Niki on 2024/8/9 13:32.
* Email: m13296644326@163.com
*/
const program = require('commander');
const {execSync, execFileSync} = require('child_process');
const {shellConfigs, ConsoleColors, logRed} = require('../common/constants');
const {
isHarmonyDeviceConnected,
getRightFileName,
getSystemHomePath,
chooseHarmonyRealDeviceId,
isAndroidDeviceConnected,
chooseAndroidRealDeviceId,
isWin,
openFileInFinder,
hdcPath,
adbPath,
} = require('../common/utils');
const fs = require('fs');
const packageInfo = require('./../package.json');
const path = require('path');
const os = require('os');
let destDir = `${getSystemHomePath()}/${packageInfo.name}-screenshot/`;
if (isWin()) {
destDir = path.join(os.homedir(), `${packageInfo.name}-screenshot`);
}
const prefix = 'aScreenshot';
const regRule = `^${prefix}-(\\d+)`;
program
.option('-c --clean', 'clean the screenshot directory')
.action(arg => {
run(arg);
})
.parse(process.argv);
function run(arg) {
const {clean} = arg;
if (clean) {
// todo 实现清除逻辑
}
// 优先检测android设备; todo: 后续可以考虑增加参数, 选择优先端
const consumed = doAndroidScs();
if (!consumed) {
console.log('\r\n尝试连接鸿蒙设备');
doHarmonyScs();
}
}
async function doHarmonyScs() {
let dList = isHarmonyDeviceConnected();
if (!dList) {
return false;
}
if (!fs.existsSync(destDir)) {
fs.mkdirSync(destDir);
}
// 拿到一个文件名
const rightFileName = getRightFileName(prefix, destDir, regRule);
const realDeviceId = await chooseHarmonyRealDeviceId(dList);
// 执行截图
const fullPath = exeHMScs(rightFileName, realDeviceId);
openFileInFinder(fullPath);
if (!isWin()) {
push2Clipboard(fullPath);
}
return true;
}
function doAndroidScs() {
const dList = isAndroidDeviceConnected();
if (!dList) {
return false;
}
if (!fs.existsSync(destDir)) {
fs.mkdirSync(destDir);
}
// 拿到一个文件名
const rightFileName = getRightFileName(prefix, destDir, regRule);
// 执行截图
const fullPath = exeAndroidScs(
rightFileName,
chooseAndroidRealDeviceId(dList),
);
openFileInFinder(fullPath);
if (!isWin()) {
push2Clipboard(fullPath);
}
return true;
}
function exeAndroidScs(imageName, realDeviceCmd = '') {
const fullPath = path.join(destDir, `${imageName}.png`);
const cmdScreenShot = ['exec-out', 'screencap', '-p'];
if (realDeviceCmd) {
cmdScreenShot.unshift(...realDeviceCmd.split(' '));
}
const result = execFileSync(adbPath, cmdScreenShot, {
...shellConfigs,
encoding: 'binary',
maxBuffer: 1024 * 1024 * 15,
});
fs.writeFileSync(fullPath, result, {encoding: 'binary'});
console.log('\r\nexecute:', `adb ${cmdScreenShot.join(' ')}`);
console.log(ConsoleColors.green, '截图文件保存成功:', fullPath);
return fullPath;
}
function exeHMScs(imageName, realDeviceCmd = '') {
const fullPath = path.join(destDir, `${imageName}.jpeg`);
const cmdScreenShot = [
'shell',
'snapshot_display',
'-f',
`/data/local/tmp/${imageName}.jpeg`,
];
if (realDeviceCmd) {
cmdScreenShot.unshift(...realDeviceCmd.split(' '));
}
let resultHM = execFileSync(hdcPath, cmdScreenShot, shellConfigs);
console.log('execute:', `hdc ${cmdScreenShot.join(' ')}`);
console.log(resultHM);
const cmdPull = ['file', 'recv', `/data/local/tmp/${imageName}.jpeg`];
if (realDeviceCmd) {
cmdPull.unshift(...realDeviceCmd.split(' '));
}
const resultPull = execFileSync(
hdcPath,
['file', 'recv', `/data/local/tmp/${imageName}.jpeg`, fullPath],
shellConfigs,
);
console.log('execute:', `hdc ${cmdPull.join(' ')}`);
console.log(resultPull);
console.log('截图文件保存成功:', fullPath);
return fullPath;
}
function push2Clipboard(fullPath) {
const copyQSource = '/Applications/CopyQ.app/Contents/MacOS/CopyQ';
if (!fs.existsSync(copyQSource)) {
// logRed('检测到CopyQ未安装, 请先安装');
return;
}
// 每次都打开copyQ应用
const openResult = execSync('open -a CopyQ', shellConfigs);
console.log(openResult);
try {
execSync(
`${copyQSource} write image/png - < ${fullPath} && ${copyQSource} select 0`,
shellConfigs,
);
console.log(ConsoleColors.green, '文件已推入剪切板');
} catch (err) {
const {stderr = ''} = err || {};
logRed(stderr);
logRed('推入剪切板失败');
}
}