如何在以前的活动中获得指纹认证的结果?

时间:2017-11-06 22:16:28

标签: android android-intent android-6.0-marshmallow android-fingerprint-api

我已经在这方面工作了很长时间并且无法弄明白,尽管我认为它会相对容易。我正在使用Android的FingerprintManager通过他们的指纹对用户进行身份验证,并且它运行良好。问题是我无法从我的帮助程序类中获取验证结果,这非常令人沮丧。我对使用帮助程序类很新,在广泛搜索之后,我仍然无法将验证结果返回到我的活动中。我最大的希望是使用onActivityResult的意图,但是助手类永远不会发出意图(或至少我的主要活动没有收到它)。

作为参考,我的主类是一个使用辅助类(扩展.AuthenticationCallback)来检查其指纹的活动。辅助类包含以下方法:

        public void startAuth(FingerprintManager manager, FingerprintManager.CryptoObject cryptoObject) {

        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) {

    }

    @Override
    public void onAuthenticationFailed() {

    }

    @Override
    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
    }

    @Override
    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
        Toast.makeText(context, "You have Been Successfully authenticated!", Toast.LENGTH_SHORT).show();
    }

活动的代码只是发出意图并有一个onActivityResult方法:

        Intent btauthenticate = new Intent(getApplicationContext(), FingerPrintMainActivity.class);
    startActivityForResult(authenticate, 1);

指纹已成功验证,我得到了我的祝酒词,但我不知道如何取回结果。我认为必须有一个简单的方法来取回结果,但我似乎无法弄清楚它是非常令人沮丧的。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

终于找到了适合我的解决方案。我从来没有真正发现为什么onActivityResult()从未起作用,即使它适用于我的其他各种活动。最好的猜测是onActivityResult意味着在两个活动之间工作(我一直尝试使用一个活动和一个辅助类)。我认为有一种方法可以使它工作,但我无法弄明白。也许它与未从活动本身启动它有关。

我的解决方案是简单地使用Handler处理数据,然后将Intent包发送回原始活动以进行处理。

以供将来遇到此主题的任何人参考:

onAuthenticationSucceeded方法中包含的Helper类包含:

        String message = "success" ;
        Message msg = Message.obtain();
        msg.obj = message;
        msg.setTarget(handler1); 
        msg.sendToTarget(); 

Helper类在类的开头包含它:

     Handler handler1 = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        String message = (String) msg.obj;
        Log.i(TAG, "Value of message: " + message);

        if (message == "success") {

            Intent intent = new Intent(....this, ....class);
            intent.putExtra("message", message);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);

        }

    }
  };

它启动的活动获取其onCreate()中的bundle然后进行处理:

    Bundle bundle = getIntent().getExtras();
    String message = bundle.getString("message");
    if(message...) {
    ....Do Something
    }

我确定这不是最有效的解决方案,但它确实有效。所有这一切的好处是可以将帮助程序类转换为服务并从各种其他活动中使用。活动只需要能够接收捆绑包并使用基本逻辑进一步处理。