五:基于XMPP的smack登录

本文关键字:代码  登录  界面  登陆  成功  下载 


    本篇写基于XMPP的登录。

1、需要准备一个asmack.jar包

      下载地址:

      

2、新建一个Android工程,命名为IMTest,把下载的asmack包导入的项目中,我改了一下包名:org.hkby.lwx.activity和第一个MainActivity的名为LoginActivity.

3、打开上一篇下载的smack文档,看一下ConnectionConfigurationXMPPConnection类,我就不解释了,代码里的注释已经很清楚了,ok,开始写代码。

4、登录界面

五:基于XMPP的smack登录

登录界面的xml代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".LoginActivity" >

    <ImageView
        android:id="@+id/im_headIcon"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="32dp"
        android:contentDescription="@string/description"
        android:src="@drawable/headicon" />

    <TextView
        android:id="@+id/tv_login_account"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/im_headIcon"
        android:layout_marginTop="34dp"
        android:layout_toLeftOf="@+id/im_headIcon"
        android:text="@string/account"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/et_login_account"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/tv_login_account"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@+id/tv_login_account"
        android:ems="10"
        android:hint="@string/et_account"
        android:textSize="14sp" >


        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/tv_login_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_login_account"
        android:layout_below="@+id/tv_login_account"
        android:layout_marginTop="26dp"
        android:text="@string/password"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/et_login_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/tv_login_password"
        android:layout_alignLeft="@+id/et_login_account"
        android:layout_alignParentRight="true"
        android:ems="10"
        android:hint="@string/et_password"
        android:inputType="textPassword"
        android:textSize="12sp" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_login_password"
        android:layout_below="@+id/tv_login_password"
        android:layout_marginTop="40dp"
        android:paddingLeft="30sp"
        android:paddingRight="30sp"
        android:text="@string/login"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/btn_login"
        android:layout_alignBottom="@+id/btn_login"
        android:layout_alignParentRight="true"
        android:layout_marginRight="20dp"
        android:paddingLeft="30sp"
        android:paddingRight="30sp"
        android:text="@string/register"
        android:textSize="20sp" />

</RelativeLayout>

5、values下string.xml的代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">IMTest</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <!-- login -->
    <string name="description">headIcon</string>
    <string name="account">账号:</string>
    <string name="et_account">请输入账号</string>
    <string name="password">密码:</string>
    <string name="et_password">请输入密码</string>
    <string name="login">登录</string>
    <string name="register">注册</string>
    <string name="isEmpty">账号或密码不能为空!</string>
    <string name="fail">登录失败!</string>
    <string name="success">登录成功!</string>

</resources>
6、登录的java代码,LoginActivity.java:

package org.hkby.lwx.activity;

import org.hkby.lwx.task.LoginTask;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/**
 * Login
 * @author liaowuxing
 *
 */
public class LoginActivity extends Activity {
	/**
	 * Called when this activity is first created.
	 */
	private EditText et_acount, et_password;
	private Button btn_login, btn_register;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//Remove the title bar
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_login);
		//Initialize the view
		initView();
		//Initialize the click
		initClick();
	}

	public void initView() {
		et_acount = (EditText) this.findViewById(R.id.et_login_account);
		et_password = (EditText) this.findViewById(R.id.et_login_password);
		btn_login = (Button) this.findViewById(R.id.btn_login);
		btn_register = (Button) this.findViewById(R.id.btn_register);
	}

	public void initClick() {
		//loginButton's ClickListener
		btn_login.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String account = et_acount.getText().toString();
				String password = et_password.getText().toString();
				if (account.equals("") || password.equals("")) {
					Toast.makeText(LoginActivity.this, R.string.isEmpty,
							Toast.LENGTH_SHORT).show();
				} else {
					LoginTask loginTask = new LoginTask(LoginActivity.this);
					boolean isSuccess = loginTask.getExecute(account, password);
					if (isSuccess == true) {
						//save account
						SharedPreferences sp = getSharedPreferences("username",
								Activity.MODE_PRIVATE);
						Editor editor = sp.edit();
						editor.putString("account", account);
						editor.commit();
						//Enter the main interface
						Intent intent = new Intent();
						intent.setClass(LoginActivity.this, MainTabActivity.class);
						startActivity(intent);
					}else {
						Toast.makeText(LoginActivity.this, R.string.fail, Toast.LENGTH_SHORT).show();
					}
				}
			}
		});
		//registerButton's ClickListener
		btn_register.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				//Enter the register interface
				Intent intent = new Intent();
				intent.setClass(LoginActivity.this, RegistActivity.class);
				startActivity(intent);
			}
		});
	}
}
7、新建一个包org.hkby.lwx.task用于放异步任务,LoginTask.java代码:

<pre name="code" class="java">package org.hkby.lwx.task;

import java.util.concurrent.ExecutionException;

import org.hkby.lwx.common.XmppTool;

import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
/**
 * login AsyncTask
 * @author liaowuxing
 *
 */
public class LoginTask {
	private Context context;

	public LoginTask(Context context) {
		super();
		this.context = context;
	}
	
	public boolean getExecute(String account,String password){
		AsyncTask<String, Void, Boolean> async = new LoginAsync().execute(account,password);
		try {
			boolean isSuccess = async.get();
			return isSuccess;
		} catch (InterruptedException e) {
			e.printStackTrace();
			return false;
		} catch (ExecutionException e) {
			e.printStackTrace();
			return false;
		}
	}
	public class LoginAsync extends AsyncTask<String, Void, Boolean> {

		@Override
		protected Boolean doInBackground(String... params) {
			boolean isLogin = XmppTool.logins(params[0], params[1]);
			if (isLogin == true) {
				return true;
			}
			return false;
		}

		@Override
		protected void onPostExecute(Boolean result) {
			super.onPostExecute(result);
			if (result == true) {
				Toast.makeText(context, "登录成功!", Toast.LENGTH_SHORT)
						.show();
			} else {
				Toast.makeText(context,"登录失败!", Toast.LENGTH_SHORT)
						.show();
			}
		}
	}
}


8、新建一个包org.hkby.lwx.common用于放工具类,静态常量等,登录最关键的代码XmppTool.java,链接和登录到服务器。

package org.hkby.lwx.common;

import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;

/**
 * Xmpp Tool
 * 
 * @author liaowuxing
 * 
 */
public class XmppTool {

	private static XMPPConnection connection = null;

	/**
	 * open connection
	 */
	private static void openConnection() {
		try {
			if (null == connection || !connection.isAuthenticated()) {
				// Create the configuration for this new connection
				ConnectionConfiguration config = new ConnectionConfiguration(
						Constant.HOST, Constant.PORT);
				// Sets if the connection is going to use stream
				// compression.
				config.setCompressionEnabled(false);
				// Sets if the new connection about to be establish is going to
				// be debugged.
				config.setDebuggerEnabled(false);
				// Sets if the reconnection mechanism is allowed to be used.
				config.setReconnectionAllowed(true);
				// Sets if the enable security verification
				config.setSASLAuthenticationEnabled(false);
				// Sets the TLS security mode used when making the connection.
				config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
				// Sets if an initial available presence will be sent to the
				// server.
				config.setSendPresence(true);
				connection = new XMPPConnection(config);
				// Connect to the server
				connection.connect();
			}
		} catch (XMPPException xe) {
			xe.printStackTrace();
		}
	}

	/**
	 * create connection
	 * @return
	 */
	public static XMPPConnection getConnection() {
		if (connection == null) {
			openConnection();
		}
		return connection;
	}

	/**
	 * close connection
	 */
	public static void closeConnection() {
		if (connection != null) {
			if (connection.isConnected()) {
				//Disconnect from the server
				connection.disconnect();
				connection = null;
			}
		}
	}

	/**
	 * login
	 * @param username
	 * @param password
	 * @return
	 */
	public static boolean logins(String username, String password) {
		if (getConnection() == null) {
			return false;
		}
		try {
			//Log into the server
			getConnection().login(username, password);
			return true;
		} catch (XMPPException e) {
			e.printStackTrace();
		}
		return false;
	}
}
9、从登录界面跳转到主界面,暂时先不写,主界面我想用TabHost,所有命名为MainTabActivity.java,代码:

package org.hkby.lwx.activity;

import org.hkby.lwx.common.XmppTool;

import android.app.TabActivity;
import android.os.Bundle;
import android.view.Window;
/**
 * main 
 * @author liaowuxing
 *
 */
@SuppressWarnings("deprecation")
public class MainTabActivity extends TabActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Remove the title bar
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_maintab);
	}

	@Override
	public void onBackPressed() {
		super.onBackPressed();
		if (XmppTool.getConnection() != null) {
			XmppTool.closeConnection();
		}
	}
}


10、activity_maintab.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="gone" />
    </LinearLayout>

</TabHost>
11、注册界面:RegistActivity.java,下回再写。

<pre name="code" class="java">package org.hkby.lwx.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.widget.TextView;
/**
 * register
 * @author liaowuxing
 *
 */
public class RegistActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Remove the title bar
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		TextView tv_test = new TextView(RegistActivity.this);
		setContentView(tv_test);
	}
}


12、现在你只需要改Constant.java文件里的HOST改为你自己的主机ip就可以了。

package org.hkby.lwx.common;

public class Constant {
	//server host
	public static final String HOST = "192.168.1.105";
	//openfire server port
	public static final int PORT = 5222;
}
13、写完之后的结构是这样的:

五:基于XMPP的smack登录

14、ok,登陆写完了,测试一下,运行项目,登陆成功后,打开openfire,刷新一下,你会发现,你登陆的用户前面的小人变绿了。








扩展:

Mezzanine Markdown的问题

Mezzanine的扩展pagedown支持在Mezzanine中使用Markdown来编辑Page和blog。但是安装了pagedown之后,markdown的preview总是有问题。由于web开发基本没有做过,本文是一个流水账,记录如何解决这个问题。当然会非常杂,也有不少弯路。1 Find the problem1 从RICHTEXT_WIDGET_CLASS入手由于把richtext的Editor换成了RICHTEXT_WIDGET_CLASS,而RICHTEXT_WIDGET_CLAS......

基于python实现一个简单的神经网络

“温故而知新!”前言跳过废话,直接看正文在实验室师兄的要求下,我在去年花了很长一段时间学习并实现了实验室师兄的一篇毕业论文(胡剑青. 基于深度学习的方面级别评论情感分析[D]. 浙江大学, 2014.),因此才接触到了神经网络与深度学习这个领域。由于遗留下的部分代码是用matlab写的,因此我在实现这篇论文的时候,深度学习的这块代码也是用matlab来写的,由于对matlab不甚了解,用起来也不大习惯,因此遇到了不少坑,但照着UFLDL TUTORIAL, 也总算完成了任务,只是大部分是在照猫画......

基于Overfeat的图片分类、定位、检测

基于Overfeat的图片分类、定位、检测原文地址:http://blog.csdn.net/hjimce/article/details/50187881作者:hjimce一、相关理论本篇博文主要讲解来自2014年ICLR的经典图片分类、定位物体检测overfeat算法:《OverFeat: Integrated Recognition, Localization and Detection using Convolutio......

给最真的自己加上static final

第一篇:勿忘初心,继续coding第二篇:编程路上,送给处于迷茫中的你和自己第三篇:编程路上,对于迷失者的一些小小建议第四篇:如果不从事编程,我可以做什么?第五篇:给最真的自己加上static final有时候改变,并不一定是成长,给最真的自己加上static final属性,保留一点最真实的自己。前段时间,技术交流群里的一个好基友波哥,彻底抛弃Android转向javaEE的怀抱,做得很彻底,直接删了所有的Android资料,很有一种破釜沉舟之势,很欣赏这种方式。回想了下,类似这种事情,我以前......

浅谈Django中的mptt

层级结构层级结构,也叫树形结构。在实际应用中,你经常需要保存层级结构到数据库中。比如说:你的网站上的目录。不过,除非使用类XML的数据库,通用的关系数据库很难做到这点。对于树形数据的存储有很多种方案。主要的方法有两种:邻接表模型,以及修改过的前序遍历算法。因为mptt使用的是修改过的前序遍历算法,而此算法又是从邻接表改进得来的,所以本文先要说这两块。本文以食品商店为例,通过类别、颜色以及种类来对其食品进行分类。邻接列表模型(ADJACENCY LIST MODEL)邻接列表模型的实现很优雅,只需......

【Caffe实践】基于Caffe的人脸识别实现

转载自:【Caffe实践】基于Caffe的人脸识别实现 - 1983的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/chenriwei2/article/details/49500687导言深度学习深似海、尤其是在图像人脸识别领域,最近几年的顶会和顶刊常常会出现没有太多的理论创新的文章,但是效果摆在那边。DeepID是深度学习方法进行人脸识别中的一个简单,却高效的一个网络模型,其结构的特点可以概括为两句话:1、训练一个多个人脸的分类器,当训练好之......

基于React,dva脚手架的知乎日报

MyZhihuApp1,初始化npm install dvanpm install dva-cli -gmkdir MyZhiHuAppDvadva -initnpm start浏览器打开localhost:8989 你就可以看到欢迎界面了2,修改页面打开/routes/IndexPage.less,改为:.normal { margin: 50px; text-align: center;}.list { margin-top: 20px;}打开/routes/IndexPage.js改......

win10 UWP Hmac

HMAC是密钥相关的哈希运算消息认证码,输入密钥和信息。 在uwp,Hmac在很多网络使用,我最近写qiniu SDK,把原来C#改为UWP,需要使用HMAC。上传文件<form method="post" action="http://upload.qiniu.com/" enctype="multipart/form-data"> <input name="key" type="hidden" value="<resource_key>"> <i......

WPF中对XML的读写。

对于XML一直是听过没用过,倒是因为现在的工作是用WPF写界面,所以实际上我接触XAML要比XML要早一些。不过我一开始就知道XAML是XML的一种,而且之前做单据模板设计器时生成xaml用的类也多是XML的。但真正开始使用XML文档是今年国庆节的时候,那是帮朋友做FLASH里用到了,不过当时只是涉及到读取而已,而今天的工作是读写都有涉及到(不知道怎么搞的,虽然做AS时没觉得什么,可是换到WPF里怎么这么没底......)。 XML(可扩展标记语言)定义:用于标记电子文件使其具有结构性......

MPI,openMP与pthread的基本demo

MPI demo编译命令:mpicc -g -Wall -o Hello_mpi Hello_mpi.c执行命令:mpiexec -n 16 ./Hello_mpi#include <stdio.h>#include <string.h>#include <mpi.h>const int MAX_STRING = 100;int main(){ char greeting[MAX_STRING]; int comm_sz; int my_ra......

[PyQt] PyQt4写的音乐播放器

实现了: 播放歌曲;上/下一首;随机、循环、单曲循环;批量添加、删除歌曲;打开、存储播放列表(M3U格式);添加到收藏;单行/多行歌词桌面展示,有渐变填充效果;歌曲搜索;播放网络歌曲;自动保存配置;托盘、菜单播放控制;多语言选择;播放网络歌曲。 下载地址: https://github.com/wn0112/PPlayer......

UWP开发之StreamSocket聊天室(五)

这篇文章是"UWP开发之StreamSocket聊天室"系列的最后一篇文章,这篇文章中我们来实现聊天室服务端View的实现。由于很多View 、ViewModel和客户端的是基本一致的所以本篇内容会比较少,很多技术重合点这里也不会再做讲解。其实在日常的开发中我们的服务端不应该是以UWP形式来开发的,通常情况下是在服务器使用Socket技术来搭建一个IM服务端,我们这里仅仅是为了探索StreamSocket Service在UWP上如何使用才如此去做。首先我们还是先看设置界面的......

[Unity3D]适用于UWP的XmlDocument使用方法

上一篇讲了在Unity3D中UWP可以使用的XML的序列化的方法。 上文链接:[Unity3D]在UWP工程中使用的序列化方法。 但是XmlReader和XmlWriter使用起来很麻烦,所以本篇演示XmlDocument既可在UWP中使用又可在Unity3D编辑器中使用的方法。UWP和Unity3D都支持XmlDocument类,但由于程序集的不同,有些在Unity3D中可以用的方法在UWP中无法使用,最终导致在编译UWP工程时失败。比如XmlDocument.Load方法在UWP中就没有通过......

PHP创建的csv文件在windows上乱码的问题

前言做PHP开发的时候,由于业务需要,可能要经常导出csv文件。使用PHP将数据导出到csv文件不难,使用fputcsv函数就可以了,但导出来的csv文件在windows系统上使用office excel打开时,中文部分会乱码(使用金山的WPS打开不会),这是由于windows系统默认使用GBK编码导致的,所以,在以UTF-8为默认编码的系统上,比如Mac OS上就不会乱码。解决方法那么怎么解决这个乱码问题呢?方法很简单,只要在创建csv文件的时候,先往文件头部写入一个BOM头就可以了,有了BO......

PHP扩展redis使用手册

【key】方法:EXISTS($key)说明:检查某个key是否存在,存在返回true,不存在返回false方法:DEL($key)说明:删除一个key,返回删除的个数(整形)方法:EXPIRE($key, $seconds);说明:为某个key设置生存时间,单位为秒,设置成功返回true,失败返回false,比如key不存在的时候【string】方法:SET($key, $value)说明:设置一个string,设置成功返回true,key不存在会自动创建对应的key,key存在则覆盖它的旧&......

cmd /c和cmd /k

cmd /c和cmd /khttp://leaning.javaeye.com/blog/380810 java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令。 cmd /c dir 是执行完dir命令后关闭命令窗口。 cmd /k dir 是执行完dir命令后不关闭命令窗口。 cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。 cmd /k start dir ......

setdefaultencoding

python CGI模块获取中文编码问题解决- 部分方案转自 http://vb2005xu.javaeye.com/blog/258633文章分类:Python编程今天在尝试Python的CGI模块时遇到中文字符不能正确显示的问题,很郁闷.在网上仔细找了找,终于解决了这个问题,现在将解决方法陈述如下,以防下次失误. 页面源代码如下#-*- coding: utf8 -*-import cgitb , cgicgitb.enable()form = cgi.FieldStorage()......

常用命令:cd/rm & 创建和删除目录

二周第一次课(10月23日) 2.6 相对和绝对路径 绝对路径:从根开始的路径为绝对路径 相对路径:相对路径是你所在位置的路径2.7 cd命令 cd ~到root目录 cd .. 到上一级目录 cd - 返回到上次目录 2.8 创建和删除目录mkdir/rmdir mkdir=make directory mkdir dirname 创建目录 mkdir -p /etc/dirname/test/ 级联创建目录 mkdir -pv /etc/dirname/test/ 加上v可以看到创建的过......

Docker实践记录

创建容器(并执行脚本)docker run -d --name [容器名] -v [主机脚本所在目录]:[容器映射目录] -w [容器映射目录] [镜像] [...执行脚本的指令] docker run 命令基本结构: docker run [参数] [镜像] [命令] 查看记录1. 查看所有记录 docker logs [容器] 2. 查看最近N条记录 docker logs [容器] --tail [N] 3. 查看一段时间前开始的N条记录 docker logs [容器] --si......

Easypack:DockerCE(17.03.0-ce)安装

Docker刚刚发行了EE版本和CE版本, 在这篇Memo之中将会纪录使用Easypack安装第一版DockerCE的方法.脚本位置 项目 详细 安装脚本 https://github.com/liumiaocn/easypack/tree/master/docker OS CentOS7 Linux 内核 3.10安装命令sh easypack_docker.sh之所以把yum install docker-ce的结果输出打开是因为目前的源下载还是有点慢,在此处可能会反复出错,......