Termux 终端显示功能实现。
This commit is contained in:
@@ -13,6 +13,9 @@ WinBoLL 网站浏览器。
|
||||
阶段版编译命令 :bash .winboll/bashPublishAPKAddTag.sh winboll
|
||||
|
||||
#### 使用说明
|
||||
3. Termux应用配置:
|
||||
- 已安装Termux(包名 com.termux );
|
||||
- 执行 echo "allow-external-apps = true" > ~/.termux/termux.properties
|
||||
|
||||
#### 参与贡献
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 命令执行结果字符串
|
||||
|
||||
Reference in New Issue
Block a user