版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31390999/article/details/90717078
写项目的时候需要实现登录并人脸认证的功能,但是登录的接口只有用户名和密码,登录成功返回重要信息flag,使用虹软的人脸识别。因此想的是先判断登录然后人脸认证。出现的问题是登录后进行人脸认证。登录部分是写在线程里的,如果返回的flag不为空,表明登录成功,可以进行人脸认证,否则弹出登录失败(写在catch中是,使用了loop)。因为登录部分写在线程中,所以一开始无论是否登录成功都会进行人脸认证(线程同步,线程还没有执行完)。想了很多线程同步之类的方法,比如join()。但是这样子的话如果登录密码错误直接会挂掉(因为有loop的存在)。最后解决方法是不在catch中弹出消息,而将其写在if判断中。还是自己太差了,逻辑能力差。
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import static io.agora.rtc.gl.EglBase.lock;
public class LoginActivity extends AppCompatActivity {
private EditText login_name;
private EditText login_pwd;
private Button login;
private CheckBox keep_password;
//private Button facedector;
private String user_id1 = "";
private String flag = "";
private Thread t1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_login);
CrashReport.testJavaCrash();
initView();
}
@SuppressLint("WrongViewCast")
private void initView() {
login_name = findViewById(R.id.login_name);
login_name.setSelection(login_name.getText().length());
login_pwd = findViewById(R.id.login_pwd);
login_pwd.setSelection(login_pwd.getText().length());
login = (Button) findViewById(R.id.login_login);
keep_password = (CheckBox) findViewById(R.id.Login_Remember);
boolean isKeep = ShareUtils.getBoolean(this, "keeppass", false);
keep_password.setChecked(isKeep);
if(isKeep){
String name = ShareUtils.getSring(this, "login_name", "");
String pwd = ShareUtils.getSring(this, "login_pwd", "");
login_name.setText(name);
login_pwd.setText(pwd);
}
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
user_id1 = "";
//这是重点,返回flag
flag = sendRequestWithHttpURLConnection();
System.out.println("flag:"+ flag);
try {
//等待执行完成
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(flag.equals("")){
//在if判断中执行Toast
Toast.makeText(LoginActivity.this, "用户名或密码错误",Toast.LENGTH_LONG).show();
}else {
if( ((Application)getApplicationContext()).mFaceDB.mRegister.isEmpty() ) {
Toast.makeText(LoginActivity.this, "首次登录,请先注册身份信息!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getApplicationContext(),IdentityActivity.class);
startActivity(intent);
}else {
Toast.makeText(LoginActivity.this,"请进行人脸认证",Toast.LENGTH_LONG).show();
new AlertDialog.Builder(LoginActivity.this)
.setTitle("请选择相机")
.setIcon(android.R.drawable.ic_dialog_info)
.setItems(new String[]{"后置相机", "前置相机"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startDetector(which);
}
})
.show();
}
}
}
});
}
private void startDetector(int camera) {
Intent it = new Intent(LoginActivity.this, DetecterActivity.class);
it.putExtra("Camera", camera);
it.putExtra("user_id",user_id1);
startActivityForResult(it, REQUEST_CODE_OP);
}
private String sendRequestWithHttpURLConnection() {
t1 = new Thread(new Runnable() {
@Override
public void run() {
//登录操作略
try {
service.getInput().put("login_name", login_name.getText().toString()); //传入登录名
service.getInput().put("login_pwd", login_pwd.getText().toString()); //传入登录密码
service.service();
user_id1 = service.getOutput().getString("user_id");
MainActivity.user_id1 = user_id1;
System.out.println("现在的user_id1:"+ user_id1);
} catch (java.lang.Exception e) {
//最一开始在catch中Toast,因此需要使用 Looper.prepare()和Looper.loop();
//Looper.prepare();
e.printStackTrace();
//System.out.println("用户名或密码错误1");
Toast.makeText(LoginActivity.this, "用户名或密码错误",Toast.LENGTH_LONG).show();
// Looper.loop();
}
}
});
t1.start();
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
return user_id1;
}
private boolean isFirst() {
boolean isFirst = ShareUtils.getBoolean(this,StaticClass.SHARE_IS_FIRST,true);
if(isFirst){
ShareUtils.putBoolean(this,StaticClass.SHARE_IS_FIRST,false);
//是第一次运行
return true;
}else {
return false;
}
}
//假设我现在输入用户名和密码,但是我不点击登录,而是直接退出了
@Override
protected void onDestroy() {
super.onDestroy();
//保存状态
ShareUtils.putBoolean(this, "keeppass", keep_password.isChecked());
//是否记住密码
if (keep_password.isChecked()) {
//记住用户名和密码
ShareUtils.putString(this, "login_name", login_name.getText().toString());
ShareUtils.putString(this, "login_pwd", login_pwd.getText().toString());
} else {
ShareUtils.deleteShare(this, "login_name");
ShareUtils.deleteShare(this, "login_pwd");
}
}
}