Termux 终端显示功能实现。

This commit is contained in:
2026-01-19 14:51:24 +08:00
parent 61ca0d2672
commit df2e91d390
3 changed files with 43 additions and 61 deletions

View File

@@ -13,6 +13,9 @@ WinBoLL 网站浏览器。
阶段版编译命令 bash .winboll/bashPublishAPKAddTag.sh winboll
#### 使用说明
3. Termux应用配置
- 已安装Termux包名 com.termux 
- 执行  echo "allow-external-apps = true" > ~/.termux/termux.properties
#### 参与贡献

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Mon Jan 19 06:42:29 GMT 2026
#Mon Jan 19 06:49:40 GMT 2026
stageCount=11
libraryProject=
baseVersion=15.11
publishVersion=15.11.10
buildCount=25
buildCount=26
baseBetaVersion=15.11.11

View File

@@ -146,70 +146,49 @@ public class TermuxEnvTestActivity extends BaseWinBoLLActivity {
/**
* 测试执行Termux命令按钮点击事件
*/
public void onTestTermuxCMD(View view) {
LogUtils.d(TAG, "onTestTermuxCMD() 按钮点击开始执行Termux命令");
tvMessage.append("\n【测试执行Termux命令】\n");
/**
* 测试执行Termux命令按钮点击事件唤起Termux窗口并直接显示输出
*/
public void onTestTermuxCMD(View view) {
LogUtils.d(TAG, "onTestTermuxCMD() 按钮点击开始执行Termux命令终端会话模式");
tvMessage.append("\n【测试执行Termux命令唤起窗口\n");
// 1. 校验Termux是否安装
if (!TermuxCommandExecutor.isTermuxInstalled(this)) {
LogUtils.e(TAG, "onTestTermuxCMD() 错误未安装Termux应用");
tvMessage.append("错误未安装Termux应用包名com.termux\n");
return;
}
// 1. 校验Termux是否安装
if (!TermuxCommandExecutor.isTermuxInstalled(this)) {
LogUtils.e(TAG, "onTestTermuxCMD() 错误未安装Termux应用");
tvMessage.append("错误未安装Termux应用包名com.termux\n");
return;
}
// 2. 校验目录是否存在
File termuxDir = new File(TERMUX_HOME_PATH);
if (!termuxDir.exists()) {
LogUtils.e(TAG, "onTestTermuxCMD() 错误Termux目录不存在路径" + TERMUX_HOME_PATH);
tvMessage.append("错误Termux目录不存在无法执行命令\n");
return;
}
// 2. 校验目录是否存在
File termuxDir = new File(TERMUX_HOME_PATH);
if (!termuxDir.exists()) {
LogUtils.e(TAG, "onTestTermuxCMD() 错误Termux目录不存在路径" + TERMUX_HOME_PATH);
tvMessage.append("错误Termux目录不存在无法执行命令\n");
return;
}
// 3. 构造并执行命令修复用bash -c包裹多命令确保输出统一重定向
tvMessage.append("正在执行命令...\n");
String targetCmd = "ls -al " + TERMUX_HOME_PATH + " && echo '\\n系统信息' && uname -a && echo '\\n当前用户' && whoami";
// 关键修复用bash -c包裹命令确保所有输出被重定向
String cmdWithRedirect = "bash -c \"" + targetCmd + "\" > " + CMD_RESULT_FILE + " 2>&1";
LogUtils.d(TAG, "onTestTermuxCMD() 执行命令:" + cmdWithRedirect);
// 3. 构造命令无重定向直接在Termux窗口执行
tvMessage.append("正在唤起Termux窗口并执行命令...\n");
//String targetCmd = "ls -la " + TERMUX_HOME_PATH + " && echo '\n系统信息' && uname -a && echo '\n当前用户' && whoami";
// 命令末尾添加read执行完后等待用户按回车
String targetCmd = "ls -la " + TERMUX_HOME_PATH + " && echo '\n系统信息' && uname -a && echo '\n当前用户' && whoami && read -p '按回车键关闭终端...'";
LogUtils.d(TAG, "onTestTermuxCMD() 执行命令:" + targetCmd);
boolean cmdSuccess = TermuxCommandExecutor.executeTerminalCommand(this, cmdWithRedirect);
if (!cmdSuccess) {
LogUtils.e(TAG, "onTestTermuxCMD() 错误:命令发送失败");
tvMessage.append("命令发送失败!\n可能原因\n1.Termux未开启外部应用调用权限\n2.sharedUserId配置不一致\n3.TermuxCommandExecutor类路径错误\n");
return;
}
// 4. 延迟读取结果调整延迟为2.5秒,适配命令执行耗时)
new Thread(new Runnable() {
@Override
public void run() {
LogUtils.d(TAG, "onTestTermuxCMD() 结果读取线程启动延迟2.5秒");
try {
Thread.sleep(2500);
final String result = readCmdResultDirectly();
mainHandler.post(new Runnable() {
@Override
public void run() {
tvMessage.append("命令执行结果:\n");
tvMessage.append(result);
tvMessage.append("\n-------------------------\n");
deleteCmdResultFile();
}
});
} catch (InterruptedException e) {
LogUtils.e(TAG, "onTestTermuxCMD() 错误:结果读取线程中断", e);
mainHandler.post(new Runnable() {
@Override
public void run() {
tvMessage.append("错误:读取结果失败,线程被中断\n");
}
});
}
}
}).start();
}
// 关键修改调用executeTerminalCommand默认终端会话模式唤起Termux窗口
// 移除输出重定向让命令直接在Termux窗口中显示
boolean cmdSuccess = TermuxCommandExecutor.executeTerminalCommand(this, targetCmd);
if (!cmdSuccess) {
LogUtils.e(TAG, "onTestTermuxCMD() 错误:命令发送失败");
tvMessage.append("命令发送失败!\n可能原因\n1.Termux未开启外部应用调用权限\n2.sharedUserId配置不一致\n");
return;
}
// 提示用户查看Termux窗口
tvMessage.append("已唤起Termux窗口命令输出将直接显示在Termux中\n");
tvMessage.append("-------------------------\n");
}
/**
* 跨包读取Termux命令结果文件
* @return 命令执行结果字符串