六:基於XMPP的smack註冊

     吐舌頭 接着上一篇,一個軟件不能只從服務器端手動添加用戶,那麼這個軟件剛到用戶手裏是不能用,所有今天寫註冊。

      start:

1、註冊界面比較簡單,因爲目的是爲了寫聊天,其他的就簡單寫了。


activity_regist.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" >

    <TextView
        android:id="@+id/tv_regist_username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="106dp"
        android:text="@string/regist_account"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/et_regist_username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/tv_regist_username"
        android:layout_toRightOf="@+id/tv_regist_rUsername"
        android:ems="10"
        android:hint="@string/et_regist_account" />

    <TextView
        android:id="@+id/tv_regist_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_regist_username"
        android:layout_below="@+id/tv_regist_username"
        android:layout_marginTop="20dp"
        android:text="@string/regist_password"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/et_regist_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/tv_regist_password"
        android:layout_toRightOf="@+id/tv_regist_rUsername"
        android:ems="10"
        android:hint="@string/et_regist_password"
        android:inputType="textPassword" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/tv_regist_rUsername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tv_regist_password"
        android:layout_below="@+id/tv_regist_password"
        android:layout_marginTop="16dp"
        android:text="@string/regist_rPassword"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/et_regist_rPassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/tv_regist_rUsername"
        android:layout_alignBottom="@+id/tv_regist_rUsername"
        android:layout_toRightOf="@+id/tv_regist_rUsername"
        android:ems="10"
        android:hint="@string/et_regist_rPassword"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/btn_regist_sure"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/tv_regist_password"
        android:layout_marginTop="88dp"
        android:text="@string/regist_sure" />

</RelativeLayout>
2、把下面的代碼加到values下的string.xml裏,代碼:

 <!-- 註冊 -->
    <string name="regist_account">用戶名:</string>
    <string name="et_regist_account">請輸入用戶名</string>
    <string name="regist_password">密		碼:</string>
    <string name="et_regist_password">請輸入密碼</string>
    <string name="regist_rPassword">確認密碼:</string>
    <string name="et_regist_rPassword">請重新輸入密碼</string>
    <string name="regist_sure">確定</string>
    <string name="passwordNoUnify">密碼不統一</string>
    <string name="regist_fail">註冊失敗</string>
    <string name="regist_success">註冊成功</string>
    <string name="ServiceNoResponse">服務器沒有響應</string>
    <string name="usernameIsExist">用戶已存在</string>
3、註冊的java代碼,挺簡單的,幾個控件,點擊一下,沒什麼要說,RegistActivity.java

package org.hkby.lwx.activity;

import org.hkby.lwx.common.Constant;
import org.hkby.lwx.task.RegistTask;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

/**
 * register
 * 
 * @author liaowuxing
 * 
 */
public class RegistActivity extends Activity {

	private EditText et_username, et_password, et_rPassword;
	private Button btn_sure;

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

	public void initView() {
		et_username = (EditText) this.findViewById(R.id.et_regist_username);
		et_password = (EditText) this.findViewById(R.id.et_regist_password);
		et_rPassword = (EditText) this.findViewById(R.id.et_regist_rPassword);
		btn_sure = (Button) this.findViewById(R.id.btn_regist_sure);
	}

	public void initClick() {
		btn_sure.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String username = et_username.getText().toString();
				String password = et_password.getText().toString();
				String rPassword = et_rPassword.getText().toString();
				if (username == "" || password == "" || username.length() == 0
						|| password.length() == 0) {
					Toast.makeText(RegistActivity.this, R.string.isEmpty,
							Toast.LENGTH_SHORT).show();
				} else if (password.length() != rPassword.length()
						|| !password.equals(rPassword)) {
					Toast.makeText(RegistActivity.this,
							R.string.passwordNoUnify, Toast.LENGTH_SHORT)
							.show();
				} else {
					RegistTask registTask = new RegistTask(RegistActivity.this);
					String isSuccess = registTask
							.getExecute(username, password);
					if (isSuccess == Constant.regist_success) {
						et_username.setText("");
						et_password.setText("");
						et_rPassword.setText("");
					} else {
						et_password.setText("");
						et_rPassword.setText("");
					}
				}
			}
		});
	}
}
4、註冊需要開一個線程,我用異步任務,創建一個類:RegistTask.java

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

import java.util.concurrent.ExecutionException;

import org.hkby.lwx.activity.R;
import org.hkby.lwx.common.Constant;
import org.hkby.lwx.common.XmppTool;

import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
/**
 * register
 * @author liaowuxing
 *
 */
public class RegistTask {

	private Context context;
	public RegistTask(Context context) {
		this.context = context;
	}
	
	public String getExecute(String username,String password){
		AsyncTask<String, Void, String> result = new ExecuteAsync().execute(username,password);
	    try {
			String state = result.get();
			if (state == Constant.regist_fail) {
				return Constant.regist_fail;
			} else if (state == Constant.regist_success) {
				return Constant.regist_success;
			} else if (state == Constant.ServiceNoResponse) {
				return Constant.ServiceNoResponse;
			} else if (state == Constant.usernameIsExist) {
				return Constant.usernameIsExist;
			} else {
				return Constant.regist_fail;
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
			return null;
		} catch (ExecutionException e) {
			e.printStackTrace();
			return null;
		}
	    
	}
	public class ExecuteAsync extends AsyncTask<String, Void, String>{

		@Override
		protected String doInBackground(String... params) {
			String state = XmppTool.regist(params[0], params[1]);
			return state;
		}
		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			if (result != null) {
				if (result == Constant.regist_fail) {
					Toast.makeText(context, R.string.regist_fail, Toast.LENGTH_SHORT).show();
				} else if (result == Constant.regist_success) {
					Toast.makeText(context, R.string.regist_success, Toast.LENGTH_SHORT).show();
				} else if (result == Constant.ServiceNoResponse) {
					Toast.makeText(context, R.string.ServiceNoResponse, Toast.LENGTH_SHORT).show();
				} else if (result == Constant.usernameIsExist) {
					Toast.makeText(context, R.string.usernameIsExist, Toast.LENGTH_SHORT).show();
				} else {
					Toast.makeText(context, R.string.regist_fail, Toast.LENGTH_SHORT).show();
				}
			}else {
				Toast.makeText(context, R.string.regist_fail, Toast.LENGTH_SHORT).show();
			}
		}
	}
}
5、最關鍵的代碼在下面,我定義了幾個常量,0代表註冊失敗,1代表註冊成功,2代表服務器沒有響應,3代表註冊的用戶已存在。


<pre name="code" class="java">/**
	 * regist
	 * 
	 * @param username
	 * @param password
	 * @return 
	 * 
	 */
	public static String regist(String username, String password) {
		if (getConnection() == null) {
			return Constant.ServiceNoResponse;
		}
		Registration reg = new Registration();
		reg.setType(IQ.Type.SET);
		reg.setTo(getConnection().getServiceName());
		//Enter the username,Not a JID
		reg.setUsername(username);
		//Enter the password
		reg.setPassword(password);
		//addAttribut Can't be empty
		reg.addAttribute("android", "geolo_createUser_android");
		PacketFilter filter = new AndFilter(new PacketIDFilter(
				reg.getPacketID()), new PacketTypeFilter(IQ.class));
		PacketCollector collector = getConnection().createPacketCollector(
				filter);
		getConnection().sendPacket(reg);
		IQ result = (IQ) collector.nextResult(SmackConfiguration
				.getPacketReplyTimeout());
		// Stop request results
		collector.cancel();
		if (result == null) {
			return Constant.ServiceNoResponse;
		} else if (result.getType() == IQ.Type.RESULT) {
			return Constant.regist_success;
		} else {
			if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {
				return Constant.usernameIsExist;
			} else {
				return Constant.regist_fail;
			}
		}
	}
6、常量當然放在Constant.java裏了。

<pre name="code" class="java">public static final String regist_fail = "0";//regist fail,
	public static final String regist_success = "1";//regist success,
	public static final String ServiceNoResponse = "2";//service no response
	public static final String usernameIsExist = "3";// username is exist

7、Android工程的結構如下:


8、ok,你可以隨便註冊一個用戶see一下了。see you.再見







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章