LoginActivity中的指纹AuthenticationCallback

时间:2017-04-23 18:48:36

标签: java android class

如何从FingerPrintClass调用LoginActivityClass的方法“loginprep”?

在代码中看到...我写了一个我想用loginprep调用的地方:“//这里我需要LoginActivity类中的方法loginprep()”

FingerprintHandler.java

public class FingerprintHandler extends FingerprintManager.AuthenticationCallback {

private Context context;

// Constructor
public FingerprintHandler(Context mContext) {
    context = mContext;
}

public void startAuth(FingerprintManager manager, FingerprintManager.CryptoObject cryptoObject) {
    CancellationSignal cancellationSignal = new CancellationSignal();
    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    manager.authenticate(cryptoObject, cancellationSignal, 0, this, null);
}

@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
    Toast.makeText((Activity)context, "Fingerprint Authentication error.", Toast.LENGTH_LONG).show();
}

@Override
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
    Toast.makeText((Activity)context, "Fingerprint Authentication help.", Toast.LENGTH_LONG).show();
}

@Override
public void onAuthenticationFailed() {
    Toast.makeText((Activity)context, "Fingerprint Authentication failed.", Toast.LENGTH_LONG).show();
}

@Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {



    //Here I need the method loginprep() from the LoginActivity class




  }
}

LoginActivity.java

public class LoginActivity extends AppCompatActivity {

    public void loginprep() {
        SharedPreferences sharedPreferencesF = getSharedPreferences("loginDatasFinger", Context.MODE_PRIVATE);
        String urn = sharedPreferencesF.getString("username", "");
        String pwd =  sharedPreferencesF.getString("password", "");
        loginUser(urn, pwd);
    }

    private void launchHomeScreen() {
        Intent homeActivity = new Intent (LoginActivity.this,HomeActivity.class);
        LoginActivity.this.startActivity(homeActivity);
        finish();
    }

    public void loginUser(final String urn, final String pwd){
        pd = ProgressDialog.show(LoginActivity.this, "", "Loading...");
        StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGIN_URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject jsonResponse = new JSONObject(response);
                            System.out.println("JSON RESPONSE: " + jsonResponse.toString());
                            boolean success = jsonResponse.getBoolean("success");
                            if (success) {
                                launchHomeScreen();
                                pd.dismiss();
                                Toast.makeText(LoginActivity.this,"Welcome back " + urn,Toast.LENGTH_LONG).show();

                                SharedPreferences sharedPref = getSharedPreferences("loginDatas", Context.MODE_PRIVATE);

                                SharedPreferences.Editor editor = sharedPref.edit();
                                editor.putString("username", urn);
                                editor.putString("password", pwd);
                                editor.apply();
                            }
                            else {
                                loginButton.setBackgroundColor(0x73000000);
                                Toast.makeText(LoginActivity.this,"Wrong Username or Password!",Toast.LENGTH_LONG).show();
                                pd.dismiss();
                            }
                        }
                        catch (JSONException e) {
                            loginButton.setBackgroundColor(0x73000000);
                            e.printStackTrace();
                            pd.dismiss();
                            Toast.makeText(LoginActivity.this,response,Toast.LENGTH_LONG).show();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        loginButton.setBackgroundColor(0x73000000);
                        pd.dismiss();
                        System.out.println("Error: " + error);
                    }
                }){
            @Override
            protected Map<String,String> getParams(){
                Map<String,String> params = new HashMap<>();
                params.put(KEY_USERNAME,urn);
                params.put(KEY_PASSWORD,pwd);
                return params;
            }

        };
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }
}

2 个答案:

答案 0 :(得分:1)

下列的程序:

 MainActivity mActivity = new MainActivity();

这不是Android期望您创建活动的新实例的方式,通常您等待onCreate回调,如活动lifeCycle中所述... enter image description here

不遵循这种方法您将需要另一种方式来传达两种不同的活动,必须采取哪种方式取决于您的应用程序的特定arch ...最常实现的可能是使用自定义接口并实现自定义回调。 ..

答案 1 :(得分:1)

您正在编写一个FingerPrint 回调类,这意味着当&#34;身份验证成功时会调用一些onAuthenticationSucceeded方法。&#34;

如何实现自己的回调以传回LoginActivity

换句话说,你

1)写一个界面

public interface LoginListener {
    void onLoginSuccess();
    void onLoginFailed();
} 

2)让活动implements LoginListener并让onLogin的Activity方法使用SharedPreferences执行非静态内容,

public class LoginActivity extends AppCompatActivity 
    implements LoginListener {

    public static final String KEY_USERNAME = "username";
    public static final String KEY_PASS = "password"; 

    private FingerprintHandler fingerprintHandler;

    @Override
    public void onLoginFailed() { } 

    @Override
    public void onLoginSuccess() {
        SharedPreferences sharedPrefs = getSharedPreferences("loginDatasFinger", Context.MODE_PRIVATE);
        String urn = sharedPrefs.getString(KEY_USERNAME, "");
        String pwd =  sharedPrefs.getString(KEY_PASS, "");
        loginUser(urn, pwd);
    }

    @Override 
    public void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(R.layout.activity_login);

        fingerprintHandler = new FingerprintHandler(this); 
    }

    // public void loginUser(final String urn, final String pwd){ }

}

3)期望将LoginListener作为参数传递给该单独的类。

public class FingerprintHandler extends FingerprintManager.AuthenticationCallback {

    private final Context mContext;
    private LoginListener mListener;

    // Constructor
    public FingerprintHandler(Context context) {
        mContext = context;
        if (context instanceof LoginListener) {
            this.mListener = (LoginListener) context;
        } else {
            throw new ClassCastException("FingerprintHandler: context must implement LoginListener!");
        }
    }

4)然后您可以使用其他回调中的回调。

@Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
    if (mListener != null) {
        mListener.onLoginSuccess();
    }
}