1.验证码
2.倒计时
1.验证码:
1.1有一个免费的发送验证码的网站
http://www.mob.com/
注册 获得appky和appsecuret
1.2 进入android studio
首先AndroidMainfest.xml 添加许可
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
1.2 在点开3,添加
1.3 点4,就是用到的那个module 添加
1.4 在要用的LoginActivity中,添加
这个发送验证码的方法,只需要在onclick里面调用
这个是判断验证码是否正确的方法。
至此 验证码就结束了。
LoginActivity在后面贴出来
接下来,倒计时:
2.倒计时:
好了。
public class LoginActivity extends Activity implements View.OnClickListener {
private EditText et_account;
private EditText et_code;
private TextView tv_getCode;
private Button btn_login;
private CheckBox mCheckBox;
private static final String COUNTRY = "86";
private static final int LOGIN_SUCCESS = 1;
private static final int LOGIN_FAIL = 0;
public static String TAG = LoginActivity.class.getCanonicalName();//测试
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.m_login);
init();
initEvent();
MobSDK.init(this);
}
private void init() {
et_account = findViewById(R.id.login_accounts_value);
et_code = findViewById(R.id.login_code_value);
tv_getCode = findViewById(R.id.get_code);
btn_login = findViewById(R.id.login_btn);
mCheckBox = findViewById(R.id.is_agree_compcat);
}
private void initEvent() {
tv_getCode.setOnClickListener(this);
btn_login.setOnClickListener(this);
mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
btn_login.setBackgroundResource(R.color.main_blue);
btn_login.setClickable(true);
} else {
btn_login.setBackgroundResource(R.color.main_disable);
btn_login.setClickable(false);
}
}
});
}
@Override
public void onClick(View v) {
if (ValidUtil.isVaild) {
int id = v.getId();
String phone = et_account.getText().toString().trim();
switch (id) {
case R.id.get_code:
if (ValidUtil.isMobilePhone(phone)) {
sendCode(COUNTRY, phone);
TimeCountDown timeCountDown = new TimeCountDown(60*1000,1000);
timeCountDown.start();
} else {
Toast.makeText(this, "请输入正确的手机号", Toast.LENGTH_SHORT).show();
}
break;
case R.id.login_btn:
String code = et_code.getText().toString().trim();
if (ValidUtil.isEmpty(phone)) {
Toast.makeText(this, "电话号码不能为空", Toast.LENGTH_SHORT).show();
} else if (ValidUtil.isEmpty(code)) {
Toast.makeText(this, "验证码不能为空", Toast.LENGTH_SHORT).show();
}else {
submitCode(COUNTRY, phone, code);
}
}
}
}
// 请求验证码,其中country表示国家代码,如“86”;phone表示手机号码,如“13800138000”
public void sendCode(String country, String phone) {
// 注册一个事件回调,用于处理发送验证码操作的结果
SMSSDK.registerEventHandler(new EventHandler() {
public void afterEvent(int event, int result, Object data) {
if (result == SMSSDK.RESULT_COMPLETE) {
// TODO 处理成功得到验证码的结果
// 请注意,此时只是完成了发送验证码的请求,验证码短信还需要几秒钟之后才送达
Log.d("mali", "afterEvent:SMSSDK.RESULT_COMPLETE " + result);
} else {
// TODO 处理错误的结果
Log.d("mali", "afterEvent:!= " + result);
}
}
});
// 触发操作
SMSSDK.getVerificationCode(country, phone);
}
// 提交验证码,其中的code表示验证码,如“1357”
public void submitCode(String country, String phone, String code) {
// 注册一个事件回调,用于处理提交验证码操作的结果
SMSSDK.registerEventHandler(new EventHandler() {
public void afterEvent(int event, int result, Object data) {
final Message msg = new Message();
if (result == SMSSDK.RESULT_COMPLETE) {
// TODO 处理验证成功的结果
msg.arg1 = LOGIN_SUCCESS;
} else {
// TODO 处理错误的结果
Log.d("mali", "afterEvent:SMSSDK.RESULT_COMPLETE " + result);
msg.arg1 = LOGIN_FAIL;
}
mHandler.sendMessage(msg);
}
});
// 触发操作
SMSSDK.submitVerificationCode(country, phone, code);
}
protected void onDestroy() {
super.onDestroy();
//用完回调要注销掉,否则可能会出现内存泄露
SMSSDK.unregisterAllEventHandler();
}
private Handler mHandler = new Handler(){
@Override
public void handleMessage(final Message msg) {
super.handleMessage(msg);
int isSuccess = msg.arg1;
if (isSuccess == LOGIN_SUCCESS){
ConnectNet connectNet = new ConnectNet();
String phone = et_account.getText().toString().trim();
// storeToPhone(phone);
connectNet.postToService("addUser",phone);
connectNet.setResponseAction(new ConnectNet.ResponseAction() {
@Override
public void doResponseMethod(String json) {
msg.arg1 = LOGIN_SUCCESS;
Gson gson = new Gson();
UserBean userBean = gson.fromJson(json,UserBean.class);
Log.d(TAG, "doResponseMethod: "+userBean.toString());
storeToPhone(userBean);
}
});
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}else {
Log.d(TAG, "handleMessage: "+isSuccess);
Toast.makeText(LoginActivity.this, "验证码错误", Toast.LENGTH_SHORT).show();
}
}
};
public class TimeCountDown extends CountDownTimer {
/**
* @param millisInFuture The number of millis in the future from the call
* to {@link #start()} until the countdown is done and {@link #onFinish()}
* is called.
* @param countDownInterval The interval along the way to receive
* {@link #onTick(long)} callbacks.
*/
public TimeCountDown(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
//计时
tv_getCode.setClickable(false);
tv_getCode.setText(millisUntilFinished/1000+"s");
}
/**
* 计时完毕
*/
@Override
public void onFinish() {
tv_getCode.setText("获取验证码");
tv_getCode.setClickable(true);
}
}
/**
* 将服务器返回的user存入sharePreference
* @param userBean
*/
private void storeToPhone(UserBean userBean){
SharedPreferences sharedPreferences = getSharedPreferences("user",MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
int userId = userBean.getId();
String userTel = userBean.getTel();
String iconUrl = userBean.getIconUrl();
editor.putInt("userId",userId);
editor.putString("userTel",userTel);
editor.putString("iconUrl",iconUrl);
editor.commit();
}
}