版权说明:本文是基于开源LumaQQ下,开发者不直接参与QQ协议的分析工作,移植到Android平台纯粹是为了方便学习和研究之用,并且没有产生任何直接的经济效益,并且纯粹是个人的技术学习研究行为,与本人所在单位没有任何关系。此文的读者在使用过程产生的效益和涉及的法律责任与本人没有直接关系。如果影响到您或您的公司利益,敬请谅解并且与我联系,本人会第一时间作出处理。
你打开QQ首先要做的第一件事是什么?当然是登录,除非你选择了自动登录。今天让我们先实现一个简单的登录界面吧。
Lumaqq提供了一个QQClient类,QQ的客户端类,这个类为用户提供一个方便的接口,比如发送消息之类的,只需要调用一个 方法便可以完成了。我们的程序就是调用这个类来做相应的处理。
现在google提供的插件暂不提供拖拉控件来进行界面的设计,但提供了一个预览的界面来供你查看一下大概的样子,一切都在xml做界面的设计工作。我们的登陆界面大概是这个样子
丑是丑了点,但关键是能用,xml相应为
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="@string/qqname" />
- <EditText android:id="@+id/qqID" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="" android:numeric="integer" />
- <TextView android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="@string/qqpwd" />
- <EditText android:id="@+id/qqPwd" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="" android:password="true" />
- <Button android:id="@+id/submit" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="@string/lumaqq_button_submit_text" />
- <TextView android:id="@+id/suggest" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="" />
- </LinearLayout>
界面设计好之后,登录的实现
- package com.android.lumaqqMe;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Message;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
- import android.os.Handler;
- import edu.tsinghua.lumaqq.qq.QQ;
- import edu.tsinghua.lumaqq.qq.QQClient;
- import edu.tsinghua.lumaqq.qq.Util;
- import edu.tsinghua.lumaqq.qq.beans.QQUser;
- import edu.tsinghua.lumaqq.qq.events.QQEvent;
- import edu.tsinghua.lumaqq.qq.events.IQQListener;
- import edu.tsinghua.lumaqq.qq.net.PortGateFactory;
- public class lumaqqMe extends Activity implements IQQListener {
- private static String message_box_wrong_qq = null;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- findViews();
- setListeners();
- }
- private Button button_test;
- private EditText field_qqID;
- private EditText field_qqPwd;
- private TextView text_suggest;
- private QQClient client;
- private String resultStr;
- private void findViews() {
- button_test = (Button) findViewById(R.id.submit);
- field_qqID = (EditText) findViewById(R.id.qqID);
- field_qqPwd = (EditText) findViewById(R.id.qqPwd);
- text_suggest = (TextView) findViewById(R.id.suggest);
- message_box_wrong_qq = (String) getText(R.string.message_box_wrong_qq);
- }
- private void setListeners() {
- button_test.setOnClickListener(testLumaQQ);
- }
- private String validate() {
- if (Util.getInt(field_qqID.getText().toString(), -1) == -1)
- return message_box_wrong_qq;
- else
- return null;
- }
- private OnClickListener testLumaQQ = new OnClickListener() {
- @Override
- public void onClick(View v) {
- doOk();
- }
- };
- private void doOk() {
- String msg = validate();
- if (msg != null) {
- text_suggest.setText(message_box_wrong_qq);
- return;
- }
- int qqnum = Util.getInt(field_qqID.getText().toString(), -1);
- if (qqnum == -1)
- return;
- String qqpwd = field_qqPwd.getText().toString();
- client = new QQClient();
- client.setConnectionPoolFactory(new PortGateFactory());
- QQUser user = new QQUser(qqnum, qqpwd);
- // 设置参数
- client.addQQListener(this);
- user.setUdp(true);
- client.setUser(user);
- client.setLoginServer("sz.tencent.com");
- try {
- // 登录
- text_suggest.setText(R.string.message_box_submit_start);
- client.login();
- } catch (Exception e1) {
- text_suggest.setText(e1.getMessage());
- }
- }
- @Override
- public void qqEvent(QQEvent e) {
- // TODO Auto-generated method stub
- switch (e.type) {
- case QQEvent.LOGIN_OK:
- processLoginSuccess();
- break;
- case QQEvent.LOGIN_FAIL:
- processLoginFail(e);
- break;
- case QQEvent.LOGIN_UNKNOWN_ERROR:
- processLoginUnknownError();
- break;
- case QQEvent.IM_SEND_OK:
- processSendIMSuccess();
- break;
- case QQEvent.USER_STATUS_CHANGE_OK:
- processChangeStatusSuccess();
- break;
- case QQEvent.USER_STATUS_CHANGE_FAIL:
- processChangeStatusFail();
- break;
- case QQEvent.SYS_TIMEOUT:
- if (e.operation == QQ.QQ_CMD_SEND_IM)
- processSendIMFail();
- break;
- }
- }
- /**
- * 初始改变状态失败事件
- */
- private void processChangeStatusFail() {
- resultStr = getText(R.string.message_box_status_change_fail).toString();
- handler.sendEmptyMessage(0);
- client.logout();
- client.release();
- }
- /**
- * 处理改变状态成功事件
- */
- private void processChangeStatusSuccess() {
- resultStr = getText(R.string.message_box_status_change_ok).toString();
- handler.sendEmptyMessage(0);
- client.im_Send(3698107, Util.getBytes("hello,wo shi robot"));
- }
- /**
- * 处理发送消息失败事件
- */
- private void processSendIMFail() {
- resultStr = getText(R.string.message_box_sys_timeout).toString();
- handler.sendEmptyMessage(0);
- client.logout();
- client.release();
- }
- /**
- * 处理发送消息成功事件
- */
- private void processSendIMSuccess() {
- resultStr = getText(R.string.message_box_send_ok).toString();
- handler.sendEmptyMessage(0);
- client.logout();
- client.release();
- }
- /**
- * 处理登陆成功事件
- */
- private void processLoginSuccess() {
- if (!client.getUser().isLoggedIn()) {
- resultStr = getText(R.string.message_box_login_success).toString();
- handler.sendEmptyMessage(0);
- }
- }
- /**
- * 处理登陆密码错误事件
- *
- * @param e
- */
- private void processLoginFail(QQEvent e) {
- resultStr = getText(R.string.message_box_login_fail).toString();
- handler.sendEmptyMessage(0);
- }
- /**
- * 处理登陆未知错误事件
- */
- private void processLoginUnknownError() {
- resultStr = getText(R.string.message_box_unknown_error).toString();
- handler.sendEmptyMessage(0);
- }
- private Handler handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- text_suggest.setText(resultStr);
- super.handleMessage(msg);
- }
- };
- }
在Android中非UI线程,是不能触碰UI类的。解决方式是另起一个Handler,将改变UI的代码封装到里面,子线程来调用这个handler,完成工作之后发送一个消息到消息队列中,主线程在空闲的时候来更新UI的状态(大部分时间应该是即时的).
好了运行一下吧,输入QQ号和密码之后,点登录按钮就会看到登陆成功和发送消息成功的信息!