目录
一、引言
二、前期准备
三、详细设计与实现
1.启动页
2.登陆注册页面
3.聊天页面
4.还需创建一个类:ChatBean
到此为止一个简单的聊天机器人就完成了让我们看下最终效果视频:
四、源码获取
五、结束语
在当今快速发展的科技时代中,人工智能成为了一个炙手可热的话题。随着人工智能技术的不断发展,越来越多的应用场景被开发者们所关注,而智能聊天机器人就是其中之一。
本文将介绍如何使用Android Studio开发一个智能聊天机器人项目。我们将使用Android Studio,JAVA语言,JDK1.8,数据库Sqlite。
视频效果放在结尾。
本设计一共包含四个页面:启动页、登陆页面、注册页面、聊天页面。效果图如下所示:
1.需要自己寻找一个机器人的api接口
2.自己准备图像素材
(1)使用 `handler.postDelayed()` 方法延迟三秒执行一个 `runnable` ,这个 `runnable` 目的是在三秒后启动 `LoginActivity`。
(2)使用 `CountDownTimer` 类创建一个计时器 `timeCount` ,其总时长为 4 秒,每秒执行一次,其作用是为了在 `onFinish()` 方法中移除 `handler` 中等待执行的 `runnable` ,以避免出现不必要的错误。
需要注意的是,在 `onPause()` 方法中应当取消所有等待执行的操作,以避免在程序关闭或后台运行时导致未知的问题。
代码如下所示:
// 进入主页面
private void tomainActive() {
startActivity(new Intent(this, LoginActivity.class));
// 跳转完成后注销
finish();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
// 1.延迟三秒执行 runnable
handler.postDelayed(runnable, 3000);
// 2.初始化,共执行四秒,一秒执行一次
timeCount = new TimeCount(4000, 1000);
timeCount.start();
}
// 计时器
class TimeCount extends CountDownTimer {
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
// 结束之后移除runnable(进入主页)
handler.removeCallbacks(runnable);
}
}
(1) 创建了一个名为 `mDatabaseHelper` 的 `DatabaseHelper` 对象,该对象用于管理应用程序的本地数据库。
(2)使用 `findViewById` 方法找到注册按钮,并设置 `OnClickListener` 监听器以便在用户单击按钮时执行相应的操作。在该监听器中,通过 `mUserNameEditText` 和 `mPasswordEditText` 获取用户输入的账号和密码,将其写入本地数据库。
(3)创建一个名为 `loginRegister` 的控件,并设置 `OnClickListener` 监听器。该监听器用于在用户尚未注册帐户的情况下启动注册活动。
(4)使用 `findViewById` 方法找到登录按钮,并设置 `OnClickListener` 监听器,以便在用户单击按钮时执行相应的操作。在该监听器中,通过输入框获取用户输入的用户名和密码,如果该用户的帐户已在本地数据库注册,则将用户转到 `RobotActivity`。否则,将显示 "账号或密码错误" 的 Toast 提示。
需要注意的是,在代码中使用的 `DatabaseHelper` 肯定是为该应用程序特定定制的,具体细节可能会有所不同。
代码如下所示:
mDatabaseHelper = new DatabaseHelper(this);
Button registerButton = findViewById(R.id.register_button);
registerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = mUserNameEditText.getText().toString().trim();
String password = mPasswordEditText.getText().toString().trim();
if (username.isEmpty() || password.isEmpty()) {
Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
return;
}
boolean result = mDatabaseHelper.insertData(username, password);
if (result) {
Toast.makeText(getApplicationContext(), "注册成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(getApplicationContext(), "注册失败", Toast.LENGTH_SHORT).show();
}
}
});
}
loginRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
mLoginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = user.getText().toString().trim();
String password = pass.getText().toString().trim();
if (username.isEmpty() || password.isEmpty()) {
Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
return;
}
boolean result = mDatabaseHelper.checkUser(username, password);
if (result) {
Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this, RobotActivity.class);
startActivity(intent);
} else {
Toast.makeText(getApplicationContext(), "账号或密码错误", Toast.LENGTH_SHORT).show();
}
}
});
}
(1) 创建了一个名为 `btn_send` 的按钮,设置 `OnClickListener` 监听器以便在用户单击它时执行相应的操作。在该监听器中,获取用户输入的信息并将其添加到一个 `ChatBean` 对象中,接着将该对象添加到 `chatBeanList` 集合中,最后更新列表。
(2)创建了一个名为 `et_send_msg` 的输入框,为其设置 `OnKeyListener` 监听器以便在用户按下 Enter 键时也可以发送信息。
(3)创建了一个 `private void getDataFromServer()` 方法,该方法使用 OkHttp 库向服务器发送 GET 请求,以便从服务器获取机器人发送的回复信息。
(4)在 `getDataFromServer()` 方法内,使用 Callback 回调函数来处理网络请求的响应结果,当请求成功时,将响应结果封装为一个 `Message` 对象,并向 `mHandler` 发送消息以便在 UI 线程中更新聊天内容列表。
需要注意的是,在以上代码实现的聊天机器人应用程序中,其向服务器发送请求并从服务器接收响应的具体细节可能会因不同的实现而有所不同,例如请求地址、请求参数、服务器返回值的格式等,开发者应根据具体需求自行进行修改。
代码如下所示:
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
sendData();//点击发送按钮,发送信息
}
});
et_send_msg.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
if (keyCode == KeyEvent.KEYCODE_ENTER && keyEvent.getAction() ==
KeyEvent.ACTION_DOWN) {
sendData();//点击Enter键也可以发送信息
}
return false;
}
});
int position = (int) (Math.random() * welcome.length - 1); //获取一个随机数
showData(welcome[position]); //用随机数获取机器人的首次聊天信息
}
private void sendData() {
sendMsg = et_send_msg.getText().toString(); //获取你输入的信息
if (TextUtils.isEmpty(sendMsg)) { //判断是否为空
Toast.makeText(this, "您还未输任何信息哦", Toast.LENGTH_LONG).show();
return;
}
et_send_msg.setText("");
//替换空格和换行
sendMsg = sendMsg.replaceAll(" ", "").replaceAll("\n", "").trim();
ChatBean chatBean = new ChatBean();
chatBean.setMessage(sendMsg);
chatBean.setState(chatBean.SEND); //SEND表示自己发送的信息
chatBeanList.add(chatBean); //将发送的信息添加到chatBeanList集合中
adpter.notifyDataSetChanged(); //更新ListView列表
getDataFromServer(); //从服务器获取机器人发送的信息
}
private void getDataFromServer() {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(WEB_SITE + "?key=" + KEY + "&appid=0&msg="
+ sendMsg).build();
Call call = okHttpClient.newCall(request);
// 开启异步线程访问网络
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
String res = response.body().string();
Message msg = new Message();
msg.what = MSG_OK;
msg.obj = res;
mHandler.sendMessage(msg);
}
@Override
public void onFailure(Call call, IOException e) {
}
});
}
这段代码定义了一个名为 `ChatBean` 的 JavaBean 类,用于封装聊天应用程序中发送或接收的每一条消息。
(1)定义了两个静态变量 `SEND` 和 `RECEIVE`,分别表示发送和接收到的消息。
(2)定义了一个名为 `state` 的成员变量,用于标识消息状态(即是发送还是接收)。
(3)定义了一个名为 `message` 的成员变量,用于保存消息的具体内容。
(4)定义了一个名为 `getState()` 的方法,用于获取消息的状态。
(5)定义了一个名为 `setState()` 的方法,用于设置消息的状态。
(6)定义了一个名为 `getMessage()` 的方法,用于获取消息的内容。
(7)定义了一个名为 `setMessage()` 的方法,用于设置消息的内容。
该类作为 `ListView` 中每一行的数据类型,负责将用户发送和接收到的消息进行封装和展示。其中 `state` 属性用于区分是发送还是接收到的消息, `message` 属性用于保存消息的具体内容。
需要注意的是,该类只定义了成员变量和相关方法,并没有对它们进行实际的操作,实际的操作需要在应用程序的其他部分中进行。
代码如下所示:
class ChatBean {
public static final int SEND = 1; //发送消息
public static final int RECEIVE = 2; //接收到的消息
private int state; //消息的状态(是接收还是发送)
private String message; //消息的内容
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
聊天机器人
✨还可以关注我的公众号《编程乐学》,菜单栏,有很多优质的资料等你来学习。
这个简单的聊天机器人应用程序通过使用 OkHttp 库和 GSON 库实现了向服务器发送请求并从服务器接收响应的操作,使用户可以与机器人进行聊天互动。在该应用程序中,封装消息数据的 ChatBean
类充当了消息数据的传递者,负责将用户发送和接收到的消息进行封装和展示,而 DatabaseHelper
类则负责管理本地数据库,保存用户注册的信息。通过这种方式,该应用程序充分体现了面向对象编程的思想,将不同的业务逻辑模块封装到不同的类中进行处理。
除此之外,在该应用程序中还实现了对用户输入的内容进行过滤和替换空格和换行的操作,以保证聊天数据的准确性和整洁性,同时还实现了当用户未填写完整的信息时进行提示的功能,提高了用户体验。
总之,通过这个简单的聊天机器人应用程序的实现,使我们对 Android 应用程序的开发生命周期有了更深入的了解,并且对于使用 OkHttp 库和 GSON 库进行网络请求和数据处理有了更加丰富的实践经验。在今后的开发中,我们将以这个应用程序为基础,进一步扩展和完善它,使它更加实用和用户友好。