You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unity安卓应用中通过C#脚本调用Termux实现交互

Unity安卓端调用Termux执行命令实现方案

前置要求

  • 已完成Termux侧要求的权限、组件导出相关配置
  • Unity项目已切换至安卓平台,完成基础安卓环境配置

核心实现逻辑

Unity安卓平台下通过内置的AndroidJavaClass/AndroidJavaObject类直接调用原生Android Intent接口,逻辑与给出的Java示例完全对齐,不需要额外编写Java插件。

执行ls命令的完整C#脚本

把脚本挂载到场景内任意GameObject上,将UI按钮的点击事件绑定到ExecuteLsCommand方法即可触发执行。

using UnityEngine;

public class TermuxCommandRunner : MonoBehaviour
{
    public void ExecuteLsCommand()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        // 获取当前安卓Activity上下文
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        
        // 初始化Intent对象
        AndroidJavaObject runCommandIntent = new AndroidJavaObject("android.content.Intent");
        
        // 配置Termux服务组件与Action
        runCommandIntent.Call<AndroidJavaObject>("setClassName", 
            "com.termux", 
            "com.termux.app.RunCommandService");
        runCommandIntent.Call<AndroidJavaObject>("setAction", "com.termux.RUN_COMMAND");
        
        // 配置命令参数:执行home目录下的ls命令
        // ls命令在Termux中的绝对路径
        runCommandIntent.Call<AndroidJavaObject>("putExtra", 
            "com.termux.RUN_COMMAND_PATH", 
            "/data/data/com.termux/files/usr/bin/ls");
        // 命令参数,无额外参数传空数组,需要加-la等参数时写入数组即可
        string[] cmdArgs = new string[] { };
        runCommandIntent.Call<AndroidJavaObject>("putExtra", 
            "com.termux.RUN_COMMAND_ARGUMENTS", 
            cmdArgs);
        // 命令执行工作目录,默认使用Termux家目录
        runCommandIntent.Call<AndroidJavaObject>("putExtra", 
            "com.termux.RUN_COMMAND_WORKDIR", 
            "/data/data/com.termux/files/home");
        // 是否后台运行:false为打开Termux前台会话显示执行结果,true为静默后台执行
        runCommandIntent.Call<AndroidJavaObject>("putExtra", 
            "com.termux.RUN_COMMAND_BACKGROUND", 
            false);
        // 会话行为:0代表新建会话执行命令
        runCommandIntent.Call<AndroidJavaObject>("putExtra", 
            "com.termux.RUN_COMMAND_SESSION_ACTION", 
            "0");
        
        // 适配安卓8.0+的前台服务启动规则
        AndroidJavaClass buildVersion = new AndroidJavaClass("android.os.Build$VERSION");
        int sdkLevel = buildVersion.GetStatic<int>("SDK_INT");
        if (sdkLevel >= 26)
        {
            currentActivity.Call("startForegroundService", runCommandIntent);
        }
        else
        {
            currentActivity.Call("startService", runCommandIntent);
        }
#endif
    }
}

自定义调整说明

  • 要执行其他命令时,只需要替换RUN_COMMAND_PATH为对应命令在Termux环境中的绝对路径,将命令参数按顺序写入cmdArgs字符串数组即可
  • 若需要后台静默执行不弹出Termux窗口,将RUN_COMMAND_BACKGROUND的传值改为true
  • RUN_COMMAND_SESSION_ACTION参数可选值:0新建会话执行、1在现有活动会话执行、2执行完毕后自动结束会话

注意事项

  • 执行前必须确保设备已安装Termux,且Termux已经完成首次启动初始化(解压完基础环境包),否则会出现命令找不到的错误
  • Unity Player Settings中需将Write Permission设置为External,避免权限拦截
  • 仅通过Intent只能实现命令触发,如果需要在自定义Unity UI中实时显示Termux命令输出、向会话输入指令,需要额外建立本地跨进程通信通道(比如本地Socket、ContentProvider)做输入输出流转发

内容的提问来源于stack exchange,提问作者saricden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:21:20