English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La información sobre Android M huella digital es muy escasa, después de un tiempo de lectura del código nativo de Android, escribí los siguientes ejemplos, contribuyendo a las personas que necesitan ayuda.
El siguiente contenido se basa en64bits de CPU de alta gama Qualcomm, equipada con fpc1020 chip, esta parte del código se ha modificado en android nativo para manejar la prueba de huella digital de fábrica. La inscripción de huella digital de android nativo requiere recopilar10vez (dependiendo de diferentes chips).
Explicación simple del código:
1. La clase FingerPrintEnrollBase:
Es importante
Código Java
public interface Listener { void onEnrollmentHelp(CharSequence helpString); void onEnrollmentError(int errMsgId, CharSequence errString); void onEnrollmentProgressChange(int steps, int remaining); }
Esta interfaz.
1La función onEnrollmentHelp: es la información de ayuda para la operación de huella digital devuelta por la capa inferior.
2La función onEnrollmentError es la información de error devuelta por la capa inferior, errMsgId es el tipo de información de error, entre los cuales1Indica que el hardware de huella digital no está disponible.3Indica que se ha producido un timeout.5Indica que la operación se ha cancelado. errString es la información de texto correspondiente a errMsgId, si es necesario, puede experimentarlo usted mismo.
3)La función onEnrollmentProgressChange () muestra el estado actual de la captura de huellas digitales, steps: cuántas veces se necesita ingresar en total; remaining: cuántas veces quedan por ingresar, he impreso Log en esta función.
2. FingerPrintActivity es la clase de Activity principal, FingerPrintEnrollBase es la clase Base de huellas digitales.
Es necesario hacer una aclaración especial, en la clase FingerPrintEnrollBase hay una línea: private byte[] mToken = new byte[69]; Este array se obtiene normalmente después de ingresar la contraseña a través de la capa framework hacia la capa hal, aquí para evitar el código de verificación, calculado a través de sizeof(hw_auth_token_t) como69, si es necesario, calcule según esto. He experimentado en el código, si este array no es69(En64En el CPU, ¡lo que directamentes llevará a que el programa se rompa!
Diagrama de flujo de captura de huellas dactilares fpc:
El código fuente es el siguiente:
FingerPrintEnrollBase:
Código Java
/* * Derechos de Autor (C) 2015 El Proyecto de Código Fuente Abierto de Android * * Licenciado bajo la Licencia Apache, Versión 2.0 (la "Licencia"); * no puede usar este archivo excepto en cumplimiento con la Licencia. * Puede obtener una copia de la Licencia en * * http://www.apache.org/licencias/LICENCIA-2.0 * * Salvo que se exija por la legislación aplicable o se acuerde por escrito, el software * distribuido bajo la Licencia se distribuye en una BASE "Tal cual", * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sea explícito o implícito. * Ver el Licencia para el lenguaje específico que rige los permisos y * limitations under the License */ paquete 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; /** * local fragment to handle the state around fingerprint enrollment. */ 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(mTimeoutRunnable); mEnrollmentSteps = -1; mEnrollmentCancel = new CancellationSignal(); if(mFpM != null){ mFpM.enroll(mToken, mEnrollmentCancel, 0, mEnrollmentCallback); } mEnrolling = true; } protected void cancelEnrollment() { mHandler.removeCallbacks(mTimeoutRunnable); if (mEnrolling) { mEnrollmentCancel.cancel(); mEnrolling = false; mEnrollmentSteps = -1; } } public void setListener(Listener listener) { mListener = listener; } public int getEnrollmentSteps() { return mEnrollmentSteps; } public int getEnrollmentRemaining() { return mEnrollmentRemaining; } public boolean isDone() { return mDone; } private FingerprintManager.EnrollmentCallback mEnrollmentCallback = new FingerprintManager.EnrollmentCallback() { @Override public void onEnrollmentProgress(int el resto) { if (mEnrollmentSteps == -1) { mEnrollmentSteps = el resto; } mEnrollmentRemaining = el resto; mDone = el resto == 0; if (mListener != null) { mListener.onEnrollmentProgressChange(mEnrollmentSteps, remaining); } } @Override public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) { if (mListener != null) { mListener.onEnrollmentHelp(helpString); } } @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:
Código Java
paquete 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 obtenerTituloId() { return R.string.tittle_fingerprint; } @Override protected Activity obtenerActivity() { 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().obtenerSistemaServicio( Context.SERVICIO_HUELLA_DIGITAL); } private void enviarMsgAlHandler(int tipoMsg, String observaciones){ Message msg = Message.obtain(); msg.what = tipoMsg; Bundle paquete = new Bundle(); paquete.putString("result", observaciones); msg.setData(paquete); mHandler.sendMessage(msg); } @Override public void onEnrollmentHelp(CharSequence ayudaString) { Log.d(TAG, "==onEnrollmentHelp="+ayudaString.toString()); enviarMensajeAlManejador(3, ayudaString.toString()); } @Override public void onEnrollmentError(int errMsgId, CharSequence errString) { Log.d(TAG, "==onEnrollmentError errMsgId="+errMsgId+" errString="+errString.toString()); if (errMsgId == 3){//tiempo agotado publicarInscripcion(); } else if (errMsgId == 1){//pérdida de eficacia del hardware iniciarInscripcion(); } else if (errMsgId == 5){//operación cancelar } else { enviarMensajeAlManejador(4, errString.toString()); } } @Override public void onEnrollmentProgressChange(int pasos, int restantes) { Log.d(TAG, "=================onEnrollmentProgressChange======="); Log.d(TAG, "pasos" + pasos + "||restantes=" + restantes); fingerPrintEnrollmentHelpView.setText("")); fingerPrintEnrollmentErrorView.setText("")); enviarMensajeAlManejador(2, getString(R.string.validacion_huella_dactilar_exitosa)); buttonS.setEnabled(true); detenerHuellaDactilar(); } private void iniciarInscripcion(){ if (fpeb == null) { fpeb = new FingerPrintEnrollBase(); } fpeb.setListener(this); fpeb.startEnrollment(mFingerprintManager); } private void postInscripcion(){ if(mFingerprintManager != null){ mFingerprintManager.postEnroll(); } } private void detenerHuellaDactilar() { if (fpeb != null){ fpeb.cancelarInscripcion(); 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().obtenerSistemaServicio( Context.SERVICIO_HUELLA_DIGITAL); } iniciarInscripcion(); } @Override protected void onPause() { super.onPause(); publicarInscripcion(); mFingerprintManager = null; detenerHuellaDactilar(); fpeb = null; } class MyHandler extends Handler{ @Override public void tratarMensaje(Message msg) { Bundle bundle = null; super.tratarMensaje(msg); switch (msg.what) { case 0: eliminarMensajes(0); bundle = msg.getData(); String result = bundle.obtenerCadena("result"); vistaPruebaSelf.setText(result); vistaPruebaSelf.setTextColor(result.contiene("PASS")?Color.GREEN:Color.RED); break; case 1: removeMessages(1); bundle = msg.getData(); String rs = bundle.obtenerCadena("result"); comprobarVistaAncha.setText(bundle.obtenerCadena("result")); comprobarVistaAncha.setTextColor(rs.contiene("PASS")?Color.GREEN:Color.RED); break; case 2: removeMessages(2); bundle = msg.getData(); String fingerprint = 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; } } } }
Aquí termina la organización de la información sobre huellas digitales de Android, continuaremos complementando información relevante, ¡gracias por el apoyo a nuestro sitio!