android之仿qq
仿qq
1、环境准备
开发环境:
1.1、前端:Android Studio3.5.3、spark客户端
1.2、后台:IDEA2019.2.4、openfire
- Android Studio :qq页面;
- spark :与qq进行聊天的另一客户端;
- IDEA2019.2.4,采用springboot框架;
- openfire :实现即时聊天的服务器;
2、功能
2.1 应用功能
登录
手机号短信验证+账号进行注册
手机号短信验证+密码找回
与图灵机器人聊天
在线即时聊天
qq页面设计(Navigation、Drawerable、Toolbar、Adapter、switch button…)
动态栏页面列表的选择展示
意见反馈
2.2 采用的接口
图灵机器人
mob短信验证
openfire的xmpp协议
okhttp–基于websocket
3、项目结构
- 表user:
- 表friend:
- 表feedback:
- 表collect:
4、gradle准备环境+其他准备
4.1. 短信验证
AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
app:
classpath 'com.mob.sdk:MobSDK:+'// 注册MobSDK
apply plugin: 'com.mob.sdk'
MobSDK {
appKey "xxxxx"
appSecret "xxxxxx"
SMSSDK {
}
}
4.2. okhttp
- 我们一直使用的http协议只能由客户端发起,服务端无法直接进行推送,这就导致了如果服务端有持续的变化客户端想要获知就比较麻烦。WebSocket协议就是为了解决这个问题应运而生。
- WebSocket协议,客户端和服务端都可以主动的推送消息,可以是文本也可以是二进制数据。而且没有同源策略的限制,不存在跨域问题。协议的标识符就是
ws
。像https一样如果加密的话就是wxs
AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
dependencies :
implementation "com.squareup.okhttp:okhttp:2.7.5"
implementation 'com.squareup.okio:okio:2.4.1'
implementation 'com.alibaba:fastjson:1.2.62'
4.3、openfire和smack
3.1【 openfire的安装和准备 】
3.2 smack配置:
5、适配器+listview(此处以fragment为例)
private ArrayList<String> qqpic;//头像
private ArrayList<Object> qqname;//昵称
private ArrayList<Object> qqqm;//个性签名
private ListView friendList;
private View root;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
root = inflater.inflate(R.layout.fragment_dashboard, container, false);
friendList = (ListView)root.findViewById(R.id.friendList);
dataInit();
ArrayAdapter<Object> tt = newMyAdapter(getActivity(),R.drawable.qq1,qqname,qqqm);
friendList.setAdapter(tt);
tt.notifyDataSetChanged();
return root;
}
private void dataInit(){
qqname = new ArrayList<Object>();
qqname.add("qly");
qqname.add("ljx");
qqname.add("lucy");
qqname.add("lily");
qqname.add("lolo");
qqname.add("fancy");
qqname.add("koko");
qqname.add("wwa");
qqname.add("polo");
qqqm = new ArrayList<Object>();
qqqm.add("哗啦啦");
qqqm.add("1111");
qqqm.add("呜呜呜呜");
qqqm.add("啊啊啊啊啊");
qqqm.add("热热热热热热");
qqqm.add("嗷嗷嗷啊啊");
qqqm.add("踩踩踩从");
qqqm.add("吱吱吱吱在");
qqqm.add("十四说四十是");
qqpic = new ArrayList<String>();
qqpic.add(String.valueOf(R.drawable.qq1));
qqpic.add(String.valueOf(R.drawable.qq2));
qqpic.add(String.valueOf(R.drawable.qq3));
qqpic.add(String.valueOf(R.drawable.qq4));
qqpic.add(String.valueOf(R.drawable.qq5));
qqpic.add(String.valueOf(R.drawable.qq6));
qqpic.add(String.valueOf(R.drawable.qq7));
qqpic.add(String.valueOf(R.drawable.qq8));
qqpic.add(String.valueOf(R.drawable.qq9));
}
public class MyAdapter extends ArrayAdapter<Object> {
//自定义适配器
private Context context;
private int resource;
List<Object> object1;
List<Object> object2;
public MyAdapter(Context context, int resource, List<Object> object1, List<Object> object2) {
super(con