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

Android Studio中Java实现Pepper平板按钮触发动作崩溃问题求助

问题分析与解决

你的问题核心在于QiContext的生命周期与可用性:当你在onCreate里设置点击事件时,机器人还未完成连接或Activity未获得机器人焦点,此时QiContext尚未初始化或无效;而onRobotFocusedGained方法触发时,SDK已经确保你拿到了有效的机器人上下文,所以代码能正常执行。

另外看你给出的代码,doAnimation方法需要接收QiContext参数,但点击事件里调用doAnimation()时没有传参,这本身就会导致编译或运行时错误,也是崩溃的直接原因之一。

解决方案

  1. 在Activity中定义全局变量保存QiContext,确保只有在机器人焦点获取后才持有有效实例
  2. 在onRobotFocusedGained中初始化该全局变量,在onRobotFocusedLost中置空避免内存泄漏
  3. 点击事件中调用doAnimation时,先判断全局QiContext是否有效,再传入参数执行

修正后的完整代码示例

public class YourRobotActivity extends AppCompatActivity implements RobotLifecycleCallbacks {
    // 全局保存有效的QiContext
    private QiContext mQiContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout); // 确保你设置了对应布局文件
        QiSDK.register(this, this);
        
        ImageButton button1 = findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 先判断QiContext是否有效,避免空指针
                if (mQiContext != null) {
                    doAnimation(mQiContext);
                }
            }
        });
    }

    private void doAnimation(QiContext qiContext) {
        // 创建动画对象
        Animation myAnimation = AnimationBuilder.with(qiContext)
                .withResources(R.raw.sniffing_b001)
                .build();

        // 构建动画动作并执行
        Animate animate = AnimateBuilder.with(qiContext)
                .withAnimation(myAnimation)
                .build();

        animate.run();
    }

    @Override
    public void onRobotFocusGained(QiContext qiContext) {
        // 机器人焦点获取时,保存有效的QiContext
        mQiContext = qiContext;
    }

    @Override
    public void onRobotFocusLost() {
        // 机器人焦点丢失时,置空QiContext防止内存泄漏
        mQiContext = null;
    }

    @Override
    public void onRobotFocusRefused(String reason) {
        // 处理焦点被拒绝的场景,比如给用户提示
        Toast.makeText(this, "无法获取机器人焦点:" + reason, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        QiSDK.unregister(this, this);
        super.onDestroy();
    }
}

关键说明

  • 必须确保QiContext仅在onRobotFocusGained之后使用,否则会因上下文无效触发空指针或SDK内部异常
  • 在onRobotFocusLost中置空QiContext,可以避免Activity销毁后仍持有机器人上下文导致的内存泄漏
  • 点击事件中增加非空判断,能防止用户在未获取机器人焦点时点击按钮引发崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:40:39