English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ci sono pochissime informazioni sui sensori di impronte digitali di android M, dopo un periodo di lettura del codice nativo di android, ho scritto gli esempi seguenti, offrendoli a chiunque ne abbia bisogno.
Il seguente contenuto è basato su CPU高通64 bit, con chip fpc1020, questa parte del codice è stata modificata su android nativo per affrontare il test delle impronte digitali di fabbrica. L'inserimento delle impronte digitali su android M richiede 10 raccolte (variabile a seconda del chip).
Spiegazione del codice:
1. La classe FingerPrintEnrollBase:
Importante è
Java代码
public interface Listener { void onEnrollmentHelp(CharSequence helpString); void onEnrollmentError(int errMsgId, CharSequence errString); void onEnrollmentProgressChange(int steps, int remaining); {}
Questo'interfaccia.
1) La funzione onEnrollmentHelp: è l'informazione di aiuto per l'operazione delle impronte digitali restituita dal livello inferiore.
2) La funzione onEnrollmentError è l'informazione di errore restituita dal livello inferiore, errMsgId è il tipo di informazione di errore, tra cui 1 indica che l'hardware delle impronte digitali non è disponibile, 3 indica che è scaduto il tempo, 5 indica che l'operazione è stata annullata. errString è l'informazione testuale corrispondente a errMsgId, chiunque ne abbia bisogno può sperimentare da solo.
3) La funzione onEnrollmentProgressChange() mostra la situazione di raccolta attuale delle impronte digitali, steps: quante volte è necessario inserire in totale; remaining è il numero di volte rimanenti, ho stampato il Log in questa funzione.
2. FingerPrintActivity è la classe MainActivity, FingerPrintEnrollBase è la classe Base per le impronte digitali.
Occorre specificare in particolare che nella classe FingerPrintEnrollBase c'è una frase: private byte[] mToken = new byte[69]; Questo array, nella normale situazione, viene richiesto attraverso il livello framework al livello hal dopo aver inserito la password, qui per evitare di scrivere il codice di verifica, calcolato con sizeof(hw_auth_token_t) e che è uguale a 69, chi ne ha bisogno deve calcolare in questo modo. Ho sperimentato nel codice che se questo array non è uguale a 69 (sul CPU a 64 bit), il programma crasherà direttamente!
Diagramma di flusso di raccolta delle impronte digitali fpc:}
Il codice sorgente è il seguente:
FingerPrintEnrollBase:
Java代码
/* * Copyright (C) 2015 Il Progetto Open Source Android * * Licenziato sotto la Licenza Apache, Versione 2.0 (la "Licenza"); * non puoi utilizzare questo file se non in conformità con la Licenza. * Puoi ottenere una copia della Licenza al seguente indirizzo * * http://www.apache.org/licenses/LICENSE-2.0 * * Salvo che non richiesto dalla legge applicabile o accettato per iscritto, il software * distribuiti sotto la Licenza sono distribuiti su una BASE "COSI COME È", * SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, espressi o impliciti. * Vedi la Licenza per il linguaggio specifico che regola i permessi e * limitazioni sotto la Licenza */ package com.mediatek.test; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; import android.util.Log; /** * locale fragment per gestire lo stato intorno all'enrollamento delle impronte digitali. */ public class FingerPrintEnrollBase extends Fragment { private int mEnrollmentSteps = -1; private int mEnrollmentRemaining = 0; private Listener mListener; private boolean mEnrolling; private CancellationSignal mEnrollmentCancel; private Handler mHandler = new Handler(); private byte[] mToken = new byte[69]; // if byte length != sizeof(hw_auth_token_t), throws Exception private boolean mDone; private static final String TAG = "FingerPrintEnrollBase"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); {} @Override public void onAttach(Activity activity) { super.onAttach(activity); {} @Override public void onStart() { super.onStart(); Log.d(TAG, "mToken length="+mToken.length); if (!mEnrolling) { FingerprintManager mFpM = (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE); startEnrollment(mFpM); {} {} @Override public void onStop() { super.onStop(); if (!getActivity().isChangingConfigurations()) { cancelEnrollment(); {} {} protected void startEnrollment(FingerprintManager mFpM) { mHandler.removeCallbacks(mRunnableTempoScaduto); mPassiRegistrazione = -1; mEnrollmentCancel = new CancellationSignal(); if(mFpM != null){ mFpM.enroll(mToken, mAnnullaRegistrazione, 0, mCallbackRegistrazione); {} mRegistrazione = true; {} protected void cancelEnrollment() { mHandler.removeCallbacks(mRunnableTempoScaduto); if (mRegistrazione) { mAnnullaRegistrazione.cancel(); mRegistrazione = false; mPassiRegistrazione = -1; {} {} public void setListener(Ascoltatore ascoltatore) { mListener = ascoltatore; {} public int getEnrollmentSteps() { return mPassiRegistrazione; {} public int getEnrollmentRemaining() { return mRimanenteRegistrazione; {} public boolean isDone() { return mFinito; {} private FingerprintManager.EnrollmentCallback mCallbackRegistrazione = new FingerprintManager.EnrollmentCallback() { @Override public void onEnrollmentProgress(int rimanente) { if (mPassiRegistrazione == -1) { mPassiRegistrazione = rimanente; {} mRimanenteRegistrazione = rimanente; mFinito = rimanente == 0; if (mListener != null) { mListener.onEnrollmentProgressChange(mPassiRegistrazione, rimanente); {} {} @Override public void onEnrollmentHelp(int idMessaggioAiuto, CharSequence stringaAiuto) { if (mListener != null) { mListener.onEnrollmentHelp(STRINGAIUTO); {} {} @Override public void onEnrollmentError(int errMsgId, CharSequence errString) { if (mListener != null) { mListener.onEnrollmentError(errMsgId, errString); {} {} }; private final Runnable mTimeoutRunnable = new Runnable() { @Override public void run() { cancelEnrollment(); {} }; public interface Listener { void onEnrollmentHelp(CharSequence helpString); void onEnrollmentError(int errMsgId, CharSequence errString); void onEnrollmentProgressChange(int steps, int remaining); {} {}
FingerPrintActivity:
Java代码
package com.mediatek.test; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import java.util.Timer; import java.util.TimerTask; import android.R.color; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; import android.os.Message; import android.text.Spannable; import android.text.style.ForegroundColorSpan; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; import com.mediatek.test.R; import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintManager; public class FingerPrintActivity extends Activity implements FingerPrintEnrollBase.Listener{ private static final String TAG = "FingerPrintActivity"; private MyHandler mHandler = new MyHandler(); private TextView fingerPrintAcquisitionTextView, fingerPrintEnrollmentErrorView, fingerPrintEnrollmentHelpView; private FingerPrintEnrollBase fpeb; private FingerprintManager mFingerprintManager; @Override protected int setTitleId() { return R.string.tittle_fingerprint; {} @Override protected Activity getActivity() { return this; {} @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fingerprint); fingerPrintAcquisitionTextView = (TextView)findViewById(R.id.fingerprint_message); fingerPrintEnrollmentErrorView= (TextView)findViewById(R.id.fingerprint_enrollment_error); fingerPrintEnrollmentHelpView= (TextView)findViewById(R.id.fingerprint_enrollment_help); mFingerprintManager = (FingerprintManager) getActivity().getSystemService( Context.SERVIZIO_FINGERPRINT); {} private void sendMsgToHandler(int msgType, String remark){ Message msg = Message.obtain(); msg.what = msgType; Bundle bundle = new Bundle(); bundle.putString("result", remark); msg.setData(bundle); mHandler.sendMessage(msg); {} @Override public void onEnrollmentHelp(CharSequence helpString) { Log.d(TAG, "==onEnrollmentHelp="+helpString.toString()); sendMsgToHandler(3, helpString.toString()); {} @Override public void onEnrollmentError(int errMsgId, CharSequence errString) { Log.d(TAG, "==onEnrollmentError errMsgId="+errMsgId+" errString="+errString.toString()); if (errMsgId == 3) { // time out postIscrizione(); } else if (errMsgId == 1) { // hardware lose efficacy inizioIscrizione(); } else if (errMsgId == 5) { // operation cancel } else { sendMsgToHandler(4, errString.toString()); {} {} @Override public void onEnrollmentProgressChange(int steps, int remaining) { Log.d(TAG, "===============onEnrollmentProgressChange======="); Log.d(TAG, "steps" + steps + "||remaining=" + remaining); fingerPrintEnrollmentHelpView.setText(""); fingerPrintEnrollmentErrorView.setText(""); sendMsgToHandler(2, getString(R.string.fingerprint_validate_success)); buttonS.setEnabled(true); fermaImpronta(); {} private void startEnrollment(){ if (fpeb == null) { fpeb = new FingerPrintEnrollBase(); {} fpeb.setListener(this); fpeb.startEnrollment(mFingerprintManager); {} private void postEnrollment(){ if(mFingerprintManager != null){ mFingerprintManager.postEnroll(); {} {} private void stopFingerprint() { if (fpeb != null){ fpeb.cancelEnrollment(); onStop(); {} {} @Override protected void onStart() { super.onStart(); {} @Override protected void onStop() { super.onStop(); if(fpeb != null){ fpeb.setListener(null); {} {} @Override protected void onResume() { super.onResume(); if(mFingerprintManager == null){ mFingerprintManager = (FingerprintManager) getActivity().getSystemService( Context.SERVIZIO_FINGERPRINT); {} inizioIscrizione(); {} @Override protected void onPause() { super.onPause(); postIscrizione(); mFingerprintManager = null; fermaImpronta(); fpeb = null; {} class MyHandler extends Handler{ @Override public void handleMessage(Message msg) { Bundle bundle = null; super.handleMessage(msg); switch (msg.what) { case 0: rimuoviMessaggi(0); bundle = msg.getData(); String result = bundle.getString("result"); selfTestView.setText(result); selfTestView.setTextColor(result.contains("PASS")?Color.GREEN:Color.RED); break; case 1: rimuoviMessaggi(1); bundle = msg.getData(); String rs = bundle.getString("result"); checkBroadView.setText(bundle.getString("result")); checkBroadView.setTextColor(rs.contains("PASS")?Color.GREEN:Color.RED); break; case 2: rimuoviMessaggi(2); bundle = msg.getData(); String improntaString = bundle.getString("result"); fingerPrintAcquisitionTextView.setText(bundle.getString("result")); fingerPrintAcquisitionTextView.setTextColor(fingerprint.contains("PASS")?Color.GREEN:Color.WHITE); mButtonSelftest.setEnabled(true); mButtonCheckerboardTest.setEnabled(true); break; case 3: removeMessages(3); bundle = msg.getData(); String enrollmentHelp = bundle.getString("result"); fingerPrintEnrollmentHelpView.setText(bundle.getString("result")); break; case 4: removeMessages(4); bundle = msg.getData(); String enrollmentError = bundle.getString("result"); fingerPrintEnrollmentErrorView.setText(bundle.getString("result")); fingerPrintAcquisitionTextView.setText(""); break; default: break; {} {} {} {}
以上就是对Android指纹资料的整理,后续继续补充相关资料,谢谢大家对本站的支持!