day14 +第二周周总结
注册功能模块的完善
前面给出的注册布局效果展示
由登录界面的注册按钮跳转到注册界面,注册界面功能设计的几个点第一是确保输入的手机号是11位才能获取验证码,第二是验证码确认是否正确,第三是点击注册后切换到设置密码界面(这里需要把由输入框获取到的手机号传递到设置密码界面)
第一个点的实现是通过输入框的监听事件完成,只有满足11位才让按钮可点击,这里需要首先把按钮设为不可点击mBtn_getCode.setEnabled(false);
mEt_phone.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { Log.d(TAG, "afterTextChanged: mEt_phone.getText().toString().length()==" + mEt_phone.getText().toString().length()); if (mEt_phone.getText().toString().length() == 11) { mBtn_getCode.setEnabled(true); } else { mBtn_getCode.setEnabled(false); } } });
第二个点的实现需要先去https://www.mob.com/注册一个账号然后去配置sdk实现
第三个点验证码的确认成功后实现跳转并传递数据
package Home.login; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.CountDownTimer; import android.os.Handler; import android.os.Message; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.example.expressdelivery.R; import org.json.JSONObject; import cn.smssdk.EventHandler; import cn.smssdk.SMSSDK; import cn.smssdk.utils.SMSLog; //需要先判断输入的手机号是否已被注册(后台接口实现) public class RegisterActivity extends Activity implements View.OnClickListener { private static final String TAG = "RegisterActivity"; int time = 60 ; //短信验证码发送倒计时 private String phone,code; private EditText mEt_verificationCode, mEt_phone; private Button mBtn_getCode, mBtn_registerNext; private TextView mTv_sendMessage; EventHandler mEventHandler; private ImageView mIv_back; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); initView(); //初始化view initTextChanged(); //注册手机号EditText输入监听 initEventHandler(); //注册监听回调事件 } /** * 初始化view */ private void initView() { // 后退 // 手机号、验证码输入框 mEt_phone = findViewById(R.id.et_phone); mEt_verificationCode = findViewById(R.id.et_verificationCode); // 获取验证码按钮 mBtn_getCode = findViewById(R.id.btn_getCode); mBtn_getCode.setOnClickListener(this); mBtn_getCode.setEnabled(false); //未输入手机号,按钮不可点击 // 验证码提示信息 mTv_sendMessage = findViewById(R.id.tv_sendMessage); mTv_sendMessage.setVisibility(View.INVISIBLE); // 下一步按钮 mBtn_registerNext=findViewById(R.id.btn_register); mBtn_registerNext.setOnClickListener(this); } /** * 手机号输入监听 */ private void initTextChanged() { mEt_phone.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { Log.d(TAG, "afterTextChanged: mEt_phone.getText().toString().length()==" + mEt_phone.getText().toString().length()); if (mEt_phone.getText().toString().length() == 11) { mBtn_getCode.setEnabled(true); } else { mBtn_getCode.setEnabled(false); } } }); } public void onClick(View v) { switch (v.getId()) { // “后退”点击事件 // "获取验证码"点击事件 case R.id.btn_getCode: phone = mEt_phone.getText().toString(); Log.d(TAG, "onClick: 获取验证码,phone==\" + phone"); //boolean result = UserUtils.validatePhone(this, phone); //验证手机号 // if (!result) return; //判断网络状态 mTv_sendMessage.setVisibility(View.INVISIBLE); SMSSDK.getVerificationCode("86", phone); //请求发送验证码的服务 Log.d(TAG, "onClick: 获取验证码,phone==" +phone); break; // "注册"按钮点击事件 case R.id.btn_register: Log.d(TAG, "onClick: -注册--"); mTv_sendMessage.setVisibility(View.INVISIBLE); phone = mEt_phone.getText().toString(); code = mEt_verificationCode.getText().toString(); Log.d(TAG, "onClick: phone==" + phone); if(phone.equals("")) { Toast.makeText(getApplicationContext(), "请输入手机号", Toast.LENGTH_LONG).show(); } //boolean validate = UserUtils.validatePhone(this, phone); //验证手机号 //if (validate) { SMSSDK.submitVerificationCode("86", phone, mEt_verificationCode.getText().toString()); //提交验证码 // } break; default: break; } } private void initEventHandler() { mEventHandler = new EventHandler() { @Override public void afterEvent(int event, int result, Object data) { // TODO 此处不可直接处理UI线程,处理后续操作需传到主线程中操作 Message msg = new Message(); msg.arg1 = event; msg.arg2 = result; msg.obj = data; mHandler.sendMessage(msg); } }; SMSSDK.registerEventHandler(mEventHandler); //注册一个事件回调监听 } Handler mHandler = new Handler() { public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); int event = msg.arg1; int result = msg.arg2; Object data = msg.obj; Log.e("event", "event==" + event + "result==" + result); if (result == SMSSDK.RESULT_COMPLETE) { //回调完成 Log.d(TAG, "handleMessage: --回调完成--"); System.out.println(SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE+"asdasdasd"); if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { //提交验证码成功 Log.d(TAG, "handleMessage: 提交验证码成功"); Toast.makeText(getApplicationContext(), "验证成功", Toast.LENGTH_LONG).show(); //新建一个显式意图,第一个参数为当前Activity类对象,第二个参数为你要打开的Activity类 Intent intent =new Intent(RegisterActivity.this,SetPassword.class); Bundle bundle=new Bundle();//用Bundle携带数据 bundle.putString("phone", phone); //传递phone参数为tinyphp intent.putExtras(bundle); startActivity(intent);//跳转到设置登录密码界面 //startActivity(new Intent(RegisterActivity.this, SetPassword.class)); } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { //获取验证码成功 Log.d(TAG, "handleMessage: 获取验证码成功,验证码已发送"); Toast.makeText(getApplicationContext(), "验证码已发送,请注意查收", Toast.LENGTH_SHORT).show(); messageCountDown(); //倒计时 } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) { //返回支持发送验证码的国家列表 Log.d(TAG, "handleMessage: 获取国家列表成功"); } else { Log.d(TAG, "handleMessage: 捕捉"); } } else { int status = 0; try { Throwable throwable = (Throwable) data; throwable.printStackTrace(); JSONObject object = new JSONObject(throwable.getMessage()); status = object.optInt("status");//错误代码 Log.d(TAG, "handleMessage: -回调失败--"); Log.d(TAG, "handleMessage: data==" + data + " status==" + status); } catch (Exception e) { //do something SMSLog.getInstance().w(e); } if(status == 603) { Log.d(TAG, "handleMessage: 手机号码输入错误,请重新输入"); mTv_sendMessage.setText("请填写正确的手机号码"); mTv_sendMessage.setVisibility(View.VISIBLE); } else if (status == 468) { Log.d(TAG, "handleMessage: 验证码输入错误,请重新输入"); mTv_sendMessage.setText("验证码输入错误,请重新输入"); mTv_sendMessage.setVisibility(View.VISIBLE); } else if (status == 466) { Log.d(TAG, "handleMessage: 验证码为空,请输入"); mTv_sendMessage.setText("验证码为空,请输入"); mTv_sendMessage.setVisibility(View.VISIBLE); } else if (status == 462) { mTv_sendMessage.setText("当前操作过于频繁"); mTv_sendMessage.setVisibility(View.VISIBLE); } else if (status == 467) { mTv_sendMessage.setText("验证失败3次,验证码失效,请重新请求"); mTv_sendMessage.setVisibility(View.VISIBLE); } else if (status == 477) { mTv_sendMessage.setText("当前手机号发送短信的数量超过限额"); mTv_sendMessage.setVisibility(View.VISIBLE); } else { mTv_sendMessage.setText("出现未知错误"); Log.d(TAG, "handleMessage: 错误" + status); mTv_sendMessage.setVisibility(View.VISIBLE); } } } }; /** * 发送短信验证码60s倒计时 * millisInFuture 倒计时总时长 * countDownInterval 间隔时间 */ private void messageCountDown() { mBtn_getCode.setEnabled(false); //“获取验证码”按钮不可点击 CountDownTimer countDownTimer = new CountDownTimer(time * 1000, 1000) { @Override public void onTick(long millisUntilFinished) { Log.d(TAG, "onTick: time==" + time); mBtn_getCode.setText(time-- + "秒后再次获取"); } @Override public void onFinish() { mTv_sendMessage.setVisibility(View.INVISIBLE); mBtn_getCode.setText("获取验证码"); mBtn_getCode.setEnabled(true); } }; countDownTimer.start(); } /** * 注销监听,避免内存泄露 */ protected void onDestroy() { super.onDestroy(); SMSSDK.unregisterEventHandler(mEventHandler); } }