创建一个机器人技能

创建第一个机器人应用后就可以开始创建技能了,你可以在技能中使用机器人的各种基础服务来自定义机器人的功能。

下面的例子将实现一个简单报时的技能,它的功能是在被触发时播报当前时间。

配置服务

技能开发除了需要添加依赖库、配置权限之外(参考 创建第一个机器人应用), 还要单独配置技能服务, 用于系统启动技能。

打开app/src/main/AndroidManifest.xml文件,在 <application>标签内添加Bootstrap服务。

<application>
    <service
        android:name="com.ubtrobot.app.Bootstrap"
        android:exported="true" />
</application>

创建技能

在之前创建的机器人应用中的模块包名目录下创建一个TimerSkill类,并继承RobotSkill。

public class TimerSkill extends RobotSkill {

}

同时在app/src/main/res/xml/文件夹下创建robot_manifest.xml文件,并添加以下内容。

<manifest>
    <skill class="com.ubtrobot.demo.TimerSkill" name="timer">
    </skill>
</manifest>

上述代码中配置了一个名称为timer的Skill, 它的路径为com.ubtrobot.demo.TimerSkill。

添加指令接收方法

创建Skill后需要在Skill类中添加指令接收方法,用于接收指令进行处理。这里举例新增timeIndicate方法,使用@OnDirective注解,并为其配置一个action属性

public class TimerSkill extends RobotSkill {

    @OnDirective(action = "timer.indicator")
    public void timeIndicate(Directive directive) {

    }
}

robot_manifest.xml<skill/>标签中添加<directive/>指令标签,其中action需要与上面代码中的action相同。

<manifest>
    <skill class="com.ubtrobot.demo.TimerSkill" name="timer">
        <directive action="timer.indicator" />
    </skill>
</manifest>

实现报时功能

timeIndicate 方法中获取当前时间,并使用语音服务播报。

public class TimerSkill extends RobotSkill {

    @OnDirective(action = "timer.indicator")
    public void timeIndicate(Directive directive) {
        //获取当前时间
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH点mm分");
        String timeStr = "现在是:" + simpleDateFormat.format(new Date());

        //使用语音服播报当前时间
        SpeechManager speechManager = getSystemService(SpeechManager.SERVICE);
        speechManager.synthesize(timeStr);
    }
}

模拟指令发送

Skill已经完成,机器人已经有了报时的功能,那么如何使用这个功能呢? 下面我们将模拟一条指令,发送到Skill 启动它。

MainActivity中添加以下代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //发送指令
        Robot.globalContext().dispatchDirective("timer.indicator");
    }
}

安装并运行应用,你将听到机器人为你播报当前时间。

以上就是实现一个简单的 Skill 的过程,Skill 还有很多功能,具体请查看 skill

更多服务

上面我们使用了语音服务播报时间,同时我们也可以为报时加上其他效果,例如:

使用灯光服务添加灯效

LightManager lightManager = getSystemService(LightManager.SERVICE);
lightManager.displayEffect(lightId, effectUri);

使用表情服务显示表情

EmotionManager emotionManager = getSystemService(EmotionManager.SERVICE);
emotionManager.express(emotionUri);

使用舵机服务添加某些动作

ServoManager servoManager = getSystemService(ServoManager.SERVICE);
servoManager.rotate(rotationOption);

实现一个机器人技能需要调用大量机器人的基础功能。Cruzr实现了许多基础服务,你可以使用这些服务实现各种特效,具体请查看 系统服务 章节。