2017-07-17 1 views
1

私は、画面がロック解除された後にアプリに戻るたびに、ユーザーを認証するためにアプリでFingerprintManagerを使用しています。初めて正常に動作したとき、次に指紋操作がキャンセルされたことを示します。アプリ内認証を使用中に指紋操作がキャンセルされる

は、ここに私のコードです:センサは前回の操作によって占有されているとき

public class FingerprintHandler extends FingerprintManager.AuthenticationCallback 
{ 
    private AlertDialog.Builder dialogBuilder; 
    private AlertDialog b; 

    private TextView text_state; 
    private ImageView image_state; 
    View view; 
    private Context context; 

    public FingerprintHandler(Context mContext, View mView) { 
     context = mContext; 
     this.view = mView; 
     dialogBuilder = new AlertDialog.Builder(context); 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final View dialogView = inflater.inflate(R.layout.custom_fingerprint_auth_dialog, null); 
     text_state = (TextView) dialogView.findViewById(R.id.text_state); 
     image_state = (ImageView) dialogView.findViewById(R.id.image_state); 
     // view = inflater.inflate(R.layout.activity_passcode, null); 
     dialogBuilder.setView(dialogView); 
     dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       dialog.dismiss(); 
      } 
     }); 
     dialogBuilder.setPositiveButton("Use Password", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

       PasscodeActivity.enterPassword(view, context); 
      } 
     }); 
     b = dialogBuilder.create(); 
     b.show(); 
     b.setCancelable(false); 
     b.setCanceledOnTouchOutside(false); 
    } 

    //Implement the startAuth method, which is responsible for starting the fingerprint authentication process// 

    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 
    //onAuthenticationError is called when a fatal error has occurred. It provides the error code and error message as its parameters// 

    public void onAuthenticationError(int errMsgId, CharSequence errString) { 

     //I’m going to display the results of fingerprint authentication as a series of toasts. 
     //Here, I’m creating the message that’ll be displayed if an error occurs// 

     if (errMsgId != FINGERPRINT_ERROR_CANCELED) { 
      text_state.setText(errString); 
      Log.e("ERROR", "" + errString); 
      image_state.setImageResource(R.drawable.ic_fingerprint_failure); 
      text_state.setTextColor(context.getResources().getColor(R.color.notVerified)); 
      //Toast.makeText(context, "Authentication error\n" + errString, Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 

    //onAuthenticationFailed is called when the fingerprint doesn’t match with any of the fingerprints registered on the device// 

    public void onAuthenticationFailed() { 
     text_state.setText(context.getString(R.string.fingerFailure)); 
     image_state.setImageResource(R.drawable.ic_fingerprint_failure); 
     text_state.setTextColor(context.getResources().getColor(R.color.notVerified)); 
     //Toast.makeText(context, "Authentication failed", Toast.LENGTH_LONG).show(); 
    } 

    @Override 

    //onAuthenticationHelp is called when a non-fatal error has occurred. This method provides additional information about the error, 
    //so to provide the user with as much feedback as possible I’m incorporating this information into my toast// 
    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { 
     text_state.setText(helpString); 
     Log.e("HELP",""+helpString); 
     image_state.setImageResource(R.drawable.ic_fingerprint_failure); 
     text_state.setTextColor(context.getResources().getColor(R.color.notVerified)); 
     //Toast.makeText(context, "Authentication help\n" + helpString, Toast.LENGTH_LONG).show(); 
    } 

    @Override 

    //onAuthenticationSucceeded is called when a fingerprint has been successfully matched to one of the fingerprints stored on the user’s device// 
    public void onAuthenticationSucceeded(
      FingerprintManager.AuthenticationResult result) { 

     text_state.setText(context.getString(R.string.fingerSuccess)); 
     image_state.setImageResource(R.drawable.ic_fingerprint_success); 
     text_state.setTextColor(context.getResources().getColor(R.color.colorPrimaryDark)); 
     Activity activity = (Activity) context; 
     activity.finish(); 
     b.dismiss(); 

     //Toast.makeText(context, "Success!", Toast.LENGTH_LONG).show(); 
    } 
} 

答えて

2

指紋操作キャンセルは通常トリガされます。アプリケーションを終了するたびに、または認証が完了したら、cancellationSignal.cancel();に電話をかけると、センサーがジョブを終了して解放できることが確認されます。あなたのケースでは、私はあなたのLockScreens onPauseでその行を追加しても重要なりますし、あなたのFingerPrintHandlerコールバックのそれぞれにその行は念例えば

@Override 
//onAuthenticationFailed is called when the fingerprint doesn’t match with any of the fingerprints registered on the device// 
public void onAuthenticationFailed() { 
    text_state.setText(context.getString(R.string.fingerFailure)); 
    image_state.setImageResource(R.drawable.ic_fingerprint_failure); 
    cancellationSignal.cancel(); 
    text_state.setTextColor(context.getResources().getColor(R.color.notVerified)); 
    //Toast.makeText(context, "Authentication failed", Toast.LENGTH_LONG).show(); 
} 
を作るために
関連する問題