我用半个小时做了一个Android ChatGPT虚拟女友

拥有一个听自己话的女友,是每个程序员的梦想。在我和她的世界里,她永远都是那么可爱乖巧,不会嫌弃我们这些码农,在累的时候,她会安慰我们,在不开心的时候,她会给我们讲故事,永远忠诚幽默。

效果如下:

闲话少说,接下来就带领大家一步一步制作这样的虚拟女友。

一、创建应用


        打开网址:  https://www.bmobapp.com/

        注册登录进去之后,先进行实名认证(实名认证使用支付宝进行实名认证),然后创建应用,获取application id和rest api key。

        如下图所示:

 二、创建Android工程

这里选择创建一个java语言的Android工程。

三、创建资源文件

主页面布局文件(文件名:res/layout/activity_main.xml)如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:context=".MainActivity"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:layout_above="@id/bottom_layout"android:id="@+id/msg_recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="80dp"android:padding="8dp"android:layout_alignParentBottom="true"android:id="@+id/bottom_layout"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"android:id="@+id/message_edit_text"android:background="@drawable/rounded_corner"android:layout_toLeftOf="@id/send_bt"android:hint="输入问题"android:padding="16dp"/><ImageButtonandroid:layout_width="48dp"android:layout_height="48dp"android:id="@+id/send_bt"android:layout_alignParentEnd="true"android:layout_centerInParent="true"android:padding="8dp"android:src="@drawable/baseline_send_24"android:background="?attr/selectableItemBackgroundBorderless"android:layout_marginStart="10dp"/></RelativeLayout></RelativeLayout>

聊天组件资源文件(文件名:res/layout/chat_item.xml)如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="8dp"><LinearLayoutandroid:id="@+id/left_chat_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginEnd="30dp"android:background="@drawable/rounded_corner"android:backgroundTint="#1E88E5"android:padding="15dp"><TextViewandroid:id="@+id/left_chat_text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="@color/white"android:textSize="18sp" /></LinearLayout><LinearLayoutandroid:layout_alignParentEnd="true"android:id="@+id/right_chat_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="30dp"android:background="@drawable/rounded_corner"android:backgroundTint="#7cb342"android:padding="15dp"><TextViewandroid:id="@+id/right_chat_text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="@color/white"android:textSize="18sp" /></LinearLayout>
</RelativeLayout>

发送按钮资源文件(文件名:res/drawable/baseline_send_24.xml)如下:

<vector android:autoMirrored="true" android:height="48dp"android:tint="#1A95BB" android:viewportHeight="24"android:viewportWidth="24" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android"><path android:fillColor="@android:color/white" android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/>
</vector>

圆角资源文件(文件名:res/drawable/rounded_corner.xml)如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><corners android:radius="10dp"/><stroke android:width="1dp"/><solid android:color="@color/white"/></shape>

四、导入Jar包

从Github中下载jar包(Libs文件夹下)和so包(JniLibs文件夹下),下载地址:Bmob-Android-AI/app/src/main at main · bmob/Bmob-Android-AI · GitHubBmob安卓AI示例. Contribute to bmob/Bmob-Android-AI development by creating an account on GitHub.https://github.com/bmob/Bmob-Android-AI/tree/main/app/src/main

下载之后,在自己的工程中相应创建同样的文件夹,并把对应的jar包和so包放进去。

五、新增依赖

修改build.gradle文件里面的dependencies节点,新增内容如下:

dependencies {implementation fileTree(include: ['*.jar'], dir: 'libs')implementation 'io.reactivex.rxjava2:rxjava:2.2.8'implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'implementation 'com.squareup.okhttp3:okhttp:4.7.2'implementation 'com.squareup.okio:okio:2.2.2'implementation 'com.google.code.gson:gson:2.8.5'implementation 'androidx.recyclerview:recyclerview:1.3.0'implementation files('src\\main\\Libs\\BmobSDK_3.9.0.jar')
}

六、创建Application子类

新建一个类,名为BmobApp,继承自Application类,代码如下:

import android.app.Application;import cn.bmob.v3.Bmob;public class BmobApp extends Application {@Overridepublic void onCreate() {super.onCreate();//初始化Bmob.initialize(this,"第一步获取的application id内容");}
}

七、新增聊天内容对象类

新建一个类,名为 Message,代码如下:

/*** 聊天内容类*/
public class Message {public static String SEND_BY_ME="me";public static String SEND_BY_BOT="bot";String message;/*** 获取聊天内容* @return*/public String getMessage() {return message;}/*** 设置聊天内容* @param message*/public void setMessage(String message) {this.message = message;}/*** 获取发送者* @return*/public String getSendBy() {return sendBy;}/*** 设置发送者* @param sendBy*/public void setSendBy(String sendBy) {this.sendBy = sendBy;}/*** 发送者*/String sendBy;/*** 聊天内容的构造函数* @param message 聊天内容* @param sendBy 发送者*/public Message(String message, String sendBy) {this.message = message;this.sendBy = sendBy;}
}

八、新增RecycleView适配器的子类

新增一个类,名字为 MessageAdapter,代码如下:

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import java.util.List;/*** 聊天内容的适配器类*/
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MyViewHolder> {List<Message> messageList;public MessageAdapter(List<Message> messageList) {this.messageList = messageList;}@NonNull@Overridepublic MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View chatView = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_item,null);MyViewHolder myViewHolder = new MyViewHolder(chatView);return myViewHolder;}@Overridepublic void onBindViewHolder(@NonNull MyViewHolder holder, int position) {Message message = messageList.get(position);if(message.getSendBy().equals(Message.SEND_BY_ME)){holder.leftChatView.setVisibility(View.GONE);holder.rightChatView.setVisibility(View.VISIBLE);holder.rightTextView.setText(message.getMessage());}else{holder.rightChatView.setVisibility(View.GONE);holder.leftChatView.setVisibility(View.VISIBLE);holder.leftTextView.setText(message.getMessage());}}@Overridepublic int getItemCount() {return messageList.size();}public class MyViewHolder extends RecyclerView.ViewHolder{LinearLayout leftChatView,rightChatView;TextView leftTextView,rightTextView;public MyViewHolder(@NonNull View itemView) {super(itemView);leftChatView = itemView.findViewById(R.id.left_chat_view);rightChatView = itemView.findViewById(R.id.right_chat_view);leftTextView = itemView.findViewById(R.id.left_chat_text_view);rightTextView = itemView.findViewById(R.id.right_chat_text_view);}}
}

九、修改配置文件

修改AndroidManifest.xml配置文件,添加权限和application的名字。

新增权限如下:

    <!--允许联网 --><uses-permission android:name="android.permission.INTERNET" /><!--获取GSM(2g)、WCDMA(联通3g)等网络状态的信息  --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--获取wifi网络状态的信息 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

application节点内新增android:name,代码如下:

android:name=".BmobApp"

application节点内新增provider节点,代码如下:

<application><providerandroid:name="cn.bmob.v3.util.BmobContentProvider"android:authorities="你自己的应用包名.BmobContentProvider"></provider>
</application>

这里要改为你自己的应用包名。

十、修改主页面代码

修改MAinActivity类,代码如下:

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import java.util.ArrayList;
import java.util.List;
import cn.bmob.v3.ai.BmobAI;
import cn.bmob.v3.ai.ChatMessageListener;public class MainActivity extends AppCompatActivity {RecyclerView recyclerView;EditText messageEditText;ImageButton sendButton;List<Message> messageList;MessageAdapter messageAdapter;BmobAI bmobAI;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//创建Bmob AI实例bmobAI = new BmobAI();//初始化AI内容问答存储messageList = new ArrayList<>();recyclerView = findViewById(R.id.msg_recycler_view);messageEditText = findViewById(R.id.message_edit_text);sendButton = findViewById(R.id.send_bt);messageAdapter = new MessageAdapter(messageList);recyclerView.setAdapter(messageAdapter);LinearLayoutManager llm = new LinearLayoutManager(this);llm.setStackFromEnd(true);recyclerView.setLayoutManager(llm);bmobAI.setPrompt("你叫琪琪,是我的女朋友,年轻漂亮贴心,说话也很幽默,接下来的每一个回复,你都要叫我宝贝");//点击发送提问到AI服务器的按钮sendButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {sendButton.setEnabled(false);//获取问题String quesion = messageEditText.getText().toString().trim();if(quesion.isEmpty() || quesion.trim()=="")return;//连接AI服务器(这个代码为了防止AI连接中断)bmobAI.Connect();//显示问题addToChat(quesion,Message.SEND_BY_ME);messageEditText.setText("");//发送内容到AI中bmobAI.Chat(quesion, "test_user",new ChatMessageListener() {@Overridepublic void onMessage(String s) {//消息流的形式返回AI的结果addToLastMessage(s);Log.d("ai",s);}@Overridepublic void onFinish(String s) {//一次性返回全部结果,这个方法需要等待一段时间,友好性较差//addToChat(s,Message.SEND_BY_BOT);sendButton.setEnabled(true);}@Overridepublic void onClose() {//连接关闭了Log.d("ai","close");sendButton.setEnabled(true);}});}});}/*** 支持流的形式呈现内容到界面* @param s*/public void addToLastMessage(String s){runOnUiThread(new Runnable() {@Overridepublic void run() {if(messageList.size()<=0) return;Message message =  messageList.get(messageList.size()-1);if(message.sendBy==Message.SEND_BY_ME){Message newmessage = new Message(s,Message.SEND_BY_BOT);messageList.add(newmessage);messageAdapter.notifyDataSetChanged();recyclerView.smoothScrollToPosition(messageAdapter.getItemCount());}else{message.setMessage(message.getMessage() + s);messageAdapter.notifyDataSetChanged();recyclerView.smoothScrollToPosition(messageAdapter.getItemCount());}}});}/*** 一次性将全部内容呈现到界面* @param message* @param sendBy*/void addToChat(String message,String sendBy){runOnUiThread(new Runnable() {@Overridepublic void run() {messageList.add(new Message(message,sendBy));messageAdapter.notifyDataSetChanged();recyclerView.smoothScrollToPosition(messageAdapter.getItemCount());}});}
}

我们可以看到,最重要的一点就是,BmobAI.setPrompt方法,你可以设置一些你想要的调教词进去,做出各种有趣的产品出来。

最后的尾声

最后放出整个项目的源代码给大家:

https://www.bmobapp.com/欢迎大家私聊(wechat: xiaowon12 )AI改变生活的各种想法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13248.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

朗涛任命Juanita Zhang为中国大陆区总经理,Peggy Hon为中国香港区总经理

在迅速发展的消费环境中&#xff0c;带领才华横溢的多元创意团队&#xff0c;持续推动业务发展 &#xff08;中国上海&#xff0c;2022年9月27日&#xff09;近日&#xff0c;全球顶尖的品牌设计与咨询公司朗涛宣布重要人事任命&#xff0c;分别任命Juanita Zhang为中国大陆区总…

chatgpt研究框架 --技术路线-行业进程研究

ChatGPT市场反应热烈&#xff0c;国内外巨头纷纷入场 据统计&#xff0c;ChatGPT日活跃用户数的增速远超Instagram&#xff0c;1月份平均每天有超过1300万名独立访问者使用ChatGPT&#xff0c;是去年12月份的两倍多&#xff1b;国内外科技巨头都非常重视ChatGPT引发的科技浪潮…

[转] 公务员80分申论万能模板(转给需要的人)

在公务员考试中&#xff0c;一般情况下&#xff0c;考生行政职业能力测验的分数差距一般不会大&#xff0c;但申论就不同了&#xff0c;两个人相差十几分甚至几十分是很正常的事&#xff0c;所以能否写好申论&#xff0c;是公务员考试的关键&#xff0c;下面搜集网上一些有关申…

使用 ChatGPT 构建金融系统流程图

ChatGPT 的受欢迎程度不断增长&#xff0c;现在被广泛用于各种应用程序。作为一名全栈工程师&#xff0c;出于对技术的追求&#xff0c;使用 ChatGPT 来探索一些可能的使用场合&#xff0c;之前介绍过使用 ChatGPT 协助编码 。本文就来探索 ChatGPT 设计一个金融系统并画出 Mer…

chatgpt赋能python:如何利用Python创建图表

如何利用Python创建图表 在数据分析和可视化方面&#xff0c;Python是一个非常强大的工具。它拥有许多流行的库和工具&#xff0c;使得数据可视化变得简单且快捷。其中之一是Matplotlib - 一个基于Python的可视化库。在本文中&#xff0c;我们将探讨如何使用Matplotlib库创建图…

我也想再上个学

关注我的同学应该知道&#xff0c;我不止在一次告诉大家读书是可以让大家能有更多的机会的&#xff0c;有时候自己也想什么时候再深造一下&#xff0c;等楠哥不那么需要我了&#xff0c;我也不用那么努力赚钱了&#xff0c;再去读读书&#xff0c;在学校里面打打篮球&#xff0…

还在死守TCP吗,来看看即将成为HTTP3.0标准协议的QUIC

文章目录 背景为什么需要QUIC为什么QUIC能撼动TCP的霸主地位QUIC 缺点展望未来参考 背景 一段时间以来被称为 HTTP-over-QUIC 的协议现在已经改变了名称&#xff0c;将正式成为 HTTP/3。这是由马克•诺丁汉(Mark Nottingham)最初的建议引发的 具体博客地址 为什么需要QUIC …

近期EI收录的国际会议汇总(AI/CV/深度学习等领域)

鉴于一些小伙伴正在为找不到投稿渠道而苦恼 本期小编为大家推荐三则国际会议信息 了解领域前沿&#xff0c;分享研究成果 启发科研思路&#xff0c;尽在学术会议 近期EI收录的国际会议汇总&#xff0c;相信总有一个适合你&#xff01; 01 第二届图像、视觉与智能系统国际学术会…

一代「博雅」大师离世!缅怀复旦大学原校长、中国科学院院士杨福家教授

作者丨Joey 好困 来源丨新智元 【导读】2022年7月17日&#xff0c;著名核物理学家、复旦大学原校长、中科院院士杨福家在上海因病逝世&#xff0c;享年86岁。 据复旦大学消息&#xff0c;著名核物理学家、复旦大学原校长、中国科学院院士杨福家教授于7月17日在上海因病离世&…

诺丁汉为满足当地需求新建一个数据中心

日前&#xff0c;在英国诺丁汉新建的一个数据中心开通运营&#xff0c;该数据中心可以部署约2500台服务器。 据诺丁汉邮报报道&#xff0c;SpaceDataCenters公司表示在诺丁汉的贝斯福德投资建设了一个数据中心&#xff0c;这是因为当地缺乏高质量的数据中心&#xff0c;因此&am…

深度学习求解魔方新方法!诺丁汉大学研究团队提出适应度函数

作者 | 凌霄 责编 | 寇雪芹 头图 | 下载于视觉中国 人工智能和人类之间的“竞赛”一直都是热门的研究话题&#xff0c;AlphaGo 战胜了人类围棋玩家&#xff0c;AlphaZero 在围棋比赛中击败了AlphaGo 及其更高版本&#xff0c;并在国际象棋比赛中击败了顶级象棋引擎之一 Stockfi…

013英超:托特纳姆热刺 VS 诺丁汉森林icon胜平负:主胜

013英超&#xff1a;托特纳姆热刺 VS 诺丁汉森林icon 胜平负:主胜 分析&#xff1a;作为英超豪门之一的热刺相较于上个赛季&#xff0c;在本赛季发挥依旧很平稳&#xff0c;目前球队以14胜3平9负积45分排在联赛第4位&#xff0c;刚刚卡在下赛季欧冠icon资格区&#xff0c;多赛一…

导致计算机科学硕士和计算机科学理学硕士,诺丁汉大学计算机科学理学硕士研究生offer一枚...

原标题&#xff1a;诺丁汉大学计算机科学理学硕士研究生offer一枚 指南者留学学员背景 学生姓名&#xff1a;Q同学 本科学校&#xff1a;中国计量大学 本科专业&#xff1a;电子科学与技术 录取学校&#xff1a;诺丁汉大学 录取专业&#xff1a;计算机科学理学硕士 背景资料 大…

宁波市教育学院计算机系主任,欢迎宁波诺丁汉大学计算机系主任白瑞斌教授一行到访南科大...

2021年1月10日至11日&#xff0c;受南方科技大学计算机科学与工程系刘江教授邀请&#xff0c;宁波诺丁汉大学(UNNC)计算机科学系主任白瑞斌教授率崔天翔、任剑锋、李家炜、卢正四位助理教授&#xff0c;专程赴深圳到访南方科技大学计算机科学与工程系&#xff0c;双方学校的老师…

ChatGPT,拯救半导体?

关注、星标公众号&#xff0c;精彩内容每日送达 来源&#xff1a;内容由半导体行业观察&#xff08;ID&#xff1a;icbank&#xff09;编译自kedglobal&#xff0c;谢谢。 2023年6月22日&#xff0c;OMDIA高级咨询总监Akira Minamikawa先生在该公司主办的半导体市场趋势研讨会活…

上海亚商投顾:沪指午后放量跳水两市上涨个股不足500只

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 指数早间震荡走高&#xff0c;沪指盘中收复3300点&#xff0c;午后集体跳水&#xff0c;创业板指一度跌超2%。Chat…

AI帮我写代码,上班摸鱼不是梦(调教过程全记录)

最近发现磁盘空间严重不足&#xff0c;都弹窗提示我了&#xff1a; 想想看到底哪个文件夹占的空间比较大&#xff0c;好做针对性的删除和清理。奈何Windows系统没有查看文件夹大小的工具&#xff0c;只能鼠标放在某个文件夹上&#xff0c;等提示&#xff1a; AI时代都来临了&am…

程序员躺平摸鱼指南

温馨提醒&#xff1a;本文提供的上班摸鱼指南&#xff0c;不建议经常性使用&#xff0c;以免被炒鱿鱼。 1、项目编译和debug&#xff1a;命令行界面或者IDE界面不停的刷新各种奇怪的字符&#xff0c;并把程序最大化整个屏幕&#xff0c;看起来就非常忙碌 2、假装windows或者开…

小米万兆路由器里的 Docker 安装 chatgpt-next-web,打造自己的专属ChatGPT

小米万兆路由器里的 Docker 安装 chatgpt-next-web&#xff0c;打造自己的专属ChatGPT 0. 先体验一下效果1. 准备工作2. 查看Docker Hub镜像信息3. 拉取 ChatGPT-Next-Web 镜像和运行容器4. 感谢99. (Optional)其他 小米2022年12月份发布了万兆路由器&#xff0c;里面可以使用D…

chatgpt教我内存对齐,对齐了但没完全对齐?

文章目录 内存对齐关于chatgpt的回答总结 内存对齐 关于chatgpt的回答 我与chatgpt的对话如下&#xff1a; 我现在来描述与总结上述对话都干了啥以及我为什么要问这个。 我本来是在学习rapidjson源码里面的内存池实现&#xff0c;然后 RAPIDJSON_ALIGN 没有看懂&#xff0c;…