亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android指紋識別API講解,一種更快更好的用戶體驗

2019-10-21 21:37:45
字體:
來源:轉載
供稿:網友

我發現了一個比較怪的現象。在iPhone上使用十分普遍的指紋認證功能,在Android手機上卻鮮有APP使用,我簡單觀察了一下,發現Android手機上基本上只有支付寶、微信和極少APP支持指紋認證功能,就連銀行和金融類的應用都基本不支持,甚至很多開發者都不知道Android系統是有指紋認證的官方API的。

Android,指紋識別,API

事實上,Android從6.0系統開始就支持指紋認證功能了,但是指紋功能還需要有硬件支持才行,而Android手機的硬件都是由各廠商生產的,手機檔次也參差不齊,因此不能像iPhone那樣保證所有的手機都是支持指紋認證功能的。所以,可能很多開發者就覺得,即使做了指紋認證功能,也無法兼容所有的手機,還是要配合圖案解鎖或密碼等功能一起使用才行,那么索性就只用圖案和密碼好了,一勞永逸。

看似這樣解釋好像也合情合理,但其實受傷的是數以億計的Android手機用戶。明明有更輕松更快捷的使用方式,卻因為APP不予支持,最終只能使用更加原始和笨拙的方式。在國內,絕大多數Android手機的指紋認證功能都僅僅只局限于用來解鎖手機而已,很少有使用到APP的功能邏輯當中。

其實將指紋認證功能使用到APP的功能邏輯當中是有很多功能場景的,比如說金融銀行類APP可以使用指紋認證來快速登錄,應用商店類APP可以使用指紋認證來下載安裝軟件,股票證券類APP可以使用指紋認證來操作和交易等等。

雖然有了應用場景,還有很多開發者可能會擔心,指紋認證功能實現起來會不會很復雜?因為畢竟支持的設備有限,還要配合圖案和密碼來使用才行,如果實現起來非常復雜,又只能支持部分設備的話,那投入產出比就太低了,或許這也是很多APP不肯去實現指紋認證功能的原因。這里我不得不說,Android官方提供的指紋認證Demo的確是挺復雜的,看著讓人望而卻步。但是大家不用擔心,本篇文章中我會帶著大家一起去實現一個最簡版的指紋認證Demo,直接復制粘貼本文中的代碼到大家各自的項目中,即可一步集成指紋認證功能。

那么話不多說,首先新建一個FingerprintTest項目,并選擇添加一個Empty Activity。然后修改activity_main.xml中的代碼,如下所示:

<?xml version="1.0" encoding="utf-8"?><FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent">  <TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="已進入App主界面"    android:textSize="18sp"    android:layout_gravity="center"    /></FrameLayout>

這里我們修改了MainActivity中的布局文件,在界面上添加了一個 已進入App主界面 的TextView,待會在指紋認證通過之后,就會讓APP跳轉到此界面。

接下來我們開始編寫指紋認證界面,新建fingerprint_dialog.xml,代碼如下所示:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"       android:orientation="vertical"       android:layout_width="match_parent"       android:layout_height="match_parent">  <ImageView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center_horizontal"    android:src="@drawable/ic_fp_40px"    />  <TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:layout_marginTop="20dp"    android:text="請驗證指紋解鎖"    android:textColor="#000"    android:textSize="16sp"    />  <TextView    android:id="@+id/error_msg"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:layout_marginTop="5dp"    android:maxLines="1"    android:textSize="12sp"    android:textColor="#f45"    />  <View    android:layout_width="match_parent"    android:layout_height="0.5dp"    android:layout_marginTop="10dp"    android:background="#ccc"    />  <TextView    android:id="@+id/cancel"    android:layout_width="match_parent"    android:layout_height="50dp"    android:gravity="center"    android:text="取消"    android:textColor="#5d7883"    android:textSize="16sp"    /></LinearLayout>

這是一個非常簡易的指紋認證界面,相信沒什么需要解釋的地方。界面大致樣式如下圖所示:

Android,指紋識別,API

注意,通常為了讓用戶清楚的知道現在需要進行指紋認證,Google官方建議最好使用一個通用的指紋圖標,而不應該由各APP制作自己的指紋圖標。為此,Google也特意提供了一套指紋認證的組圖。

接著我們創建一個FingerprintDialogFragment類,并讓它繼承自DialogFragment,用于作為提示用戶進行指紋認證的對話框,代碼如下所示:

@TargetApi(23)public class FingerprintDialogFragment extends DialogFragment {  private FingerprintManager fingerprintManager;  private CancellationSignal mCancellationSignal;  private Cipher mCipher;  private LoginActivity mActivity;  private TextView errorMsg;  /**   * 標識是否是用戶主動取消的認證。   */  private boolean isSelfCancelled;  public void setCipher(Cipher cipher) {    mCipher = cipher;  }  @Override  public void onAttach(Context context) {    super.onAttach(context);    mActivity = (LoginActivity) getActivity();  }  @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    fingerprintManager = getContext().getSystemService(FingerprintManager.class);    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog);  }  @Nullable  @Override  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {    View v = inflater.inflate(R.layout.fingerprint_dialog, container, false);    errorMsg = v.findViewById(R.id.error_msg);    TextView cancel = v.findViewById(R.id.cancel);    cancel.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        dismiss();        stopListening();      }    });    return v;  }  @Override  public void onResume() {    super.onResume();    // 開始指紋認證監聽    startListening(mCipher);  }  @Override  public void onPause() {    super.onPause();    // 停止指紋認證監聽    stopListening();  }  private void startListening(Cipher cipher) {    isSelfCancelled = false;    mCancellationSignal = new CancellationSignal();    fingerprintManager.authenticate(new FingerprintManager.CryptoObject(cipher), mCancellationSignal, 0, new FingerprintManager.AuthenticationCallback() {      @Override      public void onAuthenticationError(int errorCode, CharSequence errString) {        if (!isSelfCancelled) {          errorMsg.setText(errString);          if (errorCode == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {            Toast.makeText(mActivity, errString, Toast.LENGTH_SHORT).show();            dismiss();          }        }      }      @Override      public void onAuthenticationHelp(int helpCode, CharSequence helpString) {        errorMsg.setText(helpString);      }      @Override      public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {        Toast.makeText(mActivity, "指紋認證成功", Toast.LENGTH_SHORT).show();        mActivity.onAuthenticated();      }      @Override      public void onAuthenticationFailed() {        errorMsg.setText("指紋認證失敗,請再試一次");      }    }, null);  }  private void stopListening() {    if (mCancellationSignal != null) {      mCancellationSignal.cancel();      mCancellationSignal = null;      isSelfCancelled = true;    }  }}

說了是實現一個最簡版的指紋認證Demo,因此這里的代碼也都是非常簡單的,基本上就是一個Fragment類的最普通實現,下面我帶大家簡單解析一下。

首先setCipher()方法用于接受一個Cipher對象,這個參數在待會進行指紋認證的時候會用到。

接下來幾個生命周期方法都很簡單,在onAttach()方法中獲取了Activity的實例,在onCreate()方法獲取了FingerprintManager的實例,在onCreateView()方法中加載了我們剛剛創建的fingerprint_dialog.xml布局,都是一些常規操作。

緊接著重點的要來了,在onResume()方法中調用了startListening()方法開始指紋認證監聽,在onPause()方法中調用了stopListening()方法停止指紋認證監聽。為什么要這么做呢?因為指紋傳感器和攝像頭類似,是不能多個程序同時使用的,因此任何一個程序都不應該在非前臺時刻占用著指紋傳感器的資源,所以需要在onPause()方法中及時釋放資源。

那么,現在我們只需要把所有的目光都放在startListening()和stopListening()這兩個方法上就可以了。在startListening()方法中,調用了FingerprintManager的authenticate()方法來開啟指紋指紋監聽。authenticate()方法接收五個參數,第一個參數是CryptoObject對象,這里我們只需要將剛才傳入的Cipher對象包裝成CryptoObject對象就可以了。第二個參數是CancellationSignal對象,可以使用它來取消指紋認證操作。第三個參數是可選參數,官方的建議是直接傳0就可以了。第四個參數用于接收指紋認證的回調,上述代碼中我將所有的回調可能都進行了界面提示,方便大家觀察。第五個參數用于指定處理回調的Handler,這里直接傳null表示回調到主線程即可。

而在stopListening()方法中的邏輯則簡單得多了,我們只需要調用CancellationSignal的cancel()方法將指紋認證操作取消就可以了。

這樣我們就將FingerprintDialogFragment中的代碼全部完成了,這段代碼可以直接復制到任意項目當中來作為指紋認證提醒對話框。

最后,我們再來編寫一個簡單的登錄界面,整個指紋認證過程就完整了。創建LoginActivity,代碼如下所示:

public class LoginActivity extends AppCompatActivity {  private static final String DEFAULT_KEY_NAME = "default_key";  KeyStore keyStore;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_login);    if (supportFingerprint()) {      initKey();      initCipher();    }  }  public boolean supportFingerprint() {    if (Build.VERSION.SDK_INT < 23) {      Toast.makeText(this, "您的系統版本過低,不支持指紋功能", Toast.LENGTH_SHORT).show();      return false;    } else {      KeyguardManager keyguardManager = getSystemService(KeyguardManager.class);      FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class);      if (!fingerprintManager.isHardwareDetected()) {        Toast.makeText(this, "您的手機不支持指紋功能", Toast.LENGTH_SHORT).show();        return false;      } else if (!keyguardManager.isKeyguardSecure()) {        Toast.makeText(this, "您還未設置鎖屏,請先設置鎖屏并添加一個指紋", Toast.LENGTH_SHORT).show();        return false;      } else if (!fingerprintManager.hasEnrolledFingerprints()) {        Toast.makeText(this, "您至少需要在系統設置中添加一個指紋", Toast.LENGTH_SHORT).show();        return false;      }    }    return true;  }  @TargetApi(23)  private void initKey() {    try {      keyStore = KeyStore.getInstance("AndroidKeyStore");      keyStore.load(null);      KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");      KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(DEFAULT_KEY_NAME,          KeyProperties.PURPOSE_ENCRYPT |              KeyProperties.PURPOSE_DECRYPT)          .setBlockModes(KeyProperties.BLOCK_MODE_CBC)          .setUserAuthenticationRequired(true)          .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7);      keyGenerator.init(builder.build());      keyGenerator.generateKey();    } catch (Exception e) {      throw new RuntimeException(e);    }  }  @TargetApi(23)  private void initCipher() {    try {      SecretKey key = (SecretKey) keyStore.getKey(DEFAULT_KEY_NAME, null);      Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"          + KeyProperties.BLOCK_MODE_CBC + "/"          + KeyProperties.ENCRYPTION_PADDING_PKCS7);      cipher.init(Cipher.ENCRYPT_MODE, key);      showFingerPrintDialog(cipher);    } catch (Exception e) {      throw new RuntimeException(e);    }  }  private void showFingerPrintDialog(Cipher cipher) {    FingerprintDialogFragment fragment = new FingerprintDialogFragment();    fragment.setCipher(cipher);    fragment.show(getFragmentManager(), "fingerprint");  }  public void onAuthenticated() {    Intent intent = new Intent(this, MainActivity.class);    startActivity(intent);    finish();  }}

首先在onCreate()方法中,調用了supportFingerprint()方法來判斷當前設備是否支持指紋認證功能。這一點是非常重要的,因為當設備不支持指紋認證的時候,還需要及時切換到如圖案、密碼等其他的認證方式。

當設備支持指紋認證的時候,再分為兩步,第一步生成一個對稱加密的Key,第二步生成一個Cipher對象,這都是Android指紋認證API要求的標準用法。得到了Cipher對象之后,我們創建FingerprintDialogFragment的實例,并將Cipher對象傳入,再將FingerprintDialogFragment顯示出來就可以了。

最后的最后,當指紋認證成功之后,會在FingerprintDialogFragment的回調當中調用LoginActivity的onAuthenticated()方法,然后界面會跳轉到MainActivity,整個指紋認證過程就此結束。

總共就這些代碼了,總體來說還是相當簡單的,現在我們來運行一下看看實際的效果吧。打開應用之后會立刻彈出指紋認證對話框,此時先使用錯誤的手指來進行認證:

Android,指紋識別,API

可以看到,當指紋驗證失敗的時候,會在界面上顯示相應的錯誤提示信息。

接下來使用正確的手指來進行認證:

Android,指紋識別,API

OK,指紋驗證成功,并自動跳轉到了MainActivity界面。

這樣一個最簡版的指紋認證Demo就此完成,大家如果想要在自己的APP中集成指紋認證功能,只需要復制粘貼本文中的代碼就可以輕松實現了。

在文章的結尾我還想再補充幾句,雖然本文中的指紋認證Demo實現過程很簡單,但是切記它是不能單獨使用的,必須要配合著圖案或其他認證方式一起來使用,因為一定要提供一個在設備不支持指紋情況下的其他認證方式。

另外,比較遺憾的是,雖然是剛剛寫出來的文章,但是FingerprintManager在最新的Android 9.0系統上已經被廢棄了。因為Android 9.0系統提供了更加強大的生物識別認證功能,包括指紋識別、面部識別、甚至是虹膜識別等等,因此僅僅只能用于指紋識別的FingerprintManager已經不能滿足新系統的強大需求了。不過大家也不用擔心,雖然被標為廢棄,但是至少在較長一段時間內,FingerprintManager還是可以正常使用的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲老头老太hd| 国产大片精品免费永久看nba| 午夜美女久久久久爽久久| 欧美性xxxxxxx| 国产精品对白刺激| 午夜精品一区二区三区av| 亚洲成色777777女色窝| 久久久久亚洲精品| 国产精品视频内| 最近2019好看的中文字幕免费| 在线色欧美三级视频| 国产99久久精品一区二区 夜夜躁日日躁| 91精品国产色综合久久不卡98| 韩剧1988在线观看免费完整版| 欧美劲爆第一页| 亚洲国产高潮在线观看| 95av在线视频| 亚洲天堂视频在线观看| 亚洲精品91美女久久久久久久| 国产日韩在线视频| 色综合久综合久久综合久鬼88| 国产va免费精品高清在线观看| 91在线视频精品| 九九热99久久久国产盗摄| 亚洲r级在线观看| 最新国产精品拍自在线播放| 日韩欧美在线视频免费观看| 欧美黑人国产人伦爽爽爽| 欧美日韩免费区域视频在线观看| 57pao成人国产永久免费| 国产男人精品视频| 亚洲女成人图区| 91av在线视频观看| 亚洲最大中文字幕| 国产亚洲精品久久久久久| 欧美成人国产va精品日本一级| 中文字幕日韩电影| 国内精品小视频| 欧美一级在线亚洲天堂| 日韩欧美亚洲国产一区| 亚洲欧美一区二区三区情侣bbw| 亚洲国产欧美日韩精品| 57pao成人永久免费视频| 亚洲电影成人av99爱色| 中日韩美女免费视频网站在线观看| 欧美日韩精品中文字幕| 国产精品久久久亚洲| 岛国av一区二区在线在线观看| 成人午夜激情网| 中文字幕久久久| 福利一区视频在线观看| 中文字幕日韩av| 亚洲精品videossex少妇| 国产精品自拍偷拍视频| 欧美裸体xxxx极品少妇| www国产亚洲精品久久网站| 国模精品一区二区三区色天香| 日韩av在线不卡| 欧美乱妇40p| 精品免费在线观看| 91亚洲精品一区| 91精品在线播放| 精品露脸国产偷人在视频| 国产精品一区专区欧美日韩| 中文字幕亚洲国产| 国产精品自拍偷拍| 国产精品91免费在线| 日韩有码在线观看| 色哟哟亚洲精品一区二区| 亚洲精品99久久久久中文字幕| 国产精品一久久香蕉国产线看观看| 日韩av大片在线| 97视频在线观看网址| 亚洲最大中文字幕| 狠狠干狠狠久久| 九九热最新视频//这里只有精品| 亚洲第一色在线| 51色欧美片视频在线观看| 亚洲免费高清视频| 久久久久久网址| 亚洲国产婷婷香蕉久久久久久| 久久久久久噜噜噜久久久精品| 韩日精品中文字幕| 日本精品免费观看| 欧美性生活大片免费观看网址| 66m—66摸成人免费视频| 欧美一级黄色网| 亚洲人成在线观看| 成人黄色中文字幕| 中文字幕亚洲二区| 欧美大尺度电影在线观看| 久久在线免费视频| 亚洲国产精品久久久久久| 97在线免费观看视频| 亚洲剧情一区二区| 亚洲欧美日韩国产中文专区| 色偷偷av一区二区三区乱| 久久99精品久久久久久青青91| 国产精品亚发布| 日韩中文字幕久久| 亚洲最大福利视频网| 国产一区二区日韩精品欧美精品| 青青草99啪国产免费| 欧美激情综合色| 国产日产久久高清欧美一区| 欧美一区三区三区高中清蜜桃| 中文字幕日韩精品有码视频| 中文字幕日本精品| 97色伦亚洲国产| 色综合久久精品亚洲国产| 日韩精品一区二区视频| 日韩精品一二三四区| 久久精品国产一区二区电影| 在线观看精品国产视频| 亚洲精品456在线播放狼人| 国内精品久久久久影院优| 在线观看精品自拍私拍| 亚洲精品久久久久中文字幕欢迎你| 三级精品视频久久久久| 国产精品久久久久国产a级| 欧美性极品xxxx做受| 疯狂做受xxxx欧美肥白少妇| 91爱爱小视频k| 久久久久国产精品一区| 亚洲第一色在线| 色偷偷88888欧美精品久久久| 国产va免费精品高清在线观看| 国产视频精品久久久| 日韩欧亚中文在线| 日韩网站免费观看高清| 在线视频精品一| 久久久久这里只有精品| 91精品久久久久久久久青青| 久久久久国产精品免费| 国产a∨精品一区二区三区不卡| 最近2019年日本中文免费字幕| 欧美中文字幕在线| 韩国精品久久久999| 国产精品免费久久久久久| 国产成人亚洲综合91精品| 久久久久女教师免费一区| 精品国偷自产在线视频| 成人精品一区二区三区电影黑人| 欧美极度另类性三渗透| 亚洲va久久久噜噜噜久久天堂| 精品久久香蕉国产线看观看亚洲| 深夜福利一区二区| 久久视频在线视频| 欧美午夜宅男影院在线观看| 欧洲永久精品大片ww免费漫画| 午夜精品美女自拍福到在线| 亚洲精品aⅴ中文字幕乱码| 日韩电影中文字幕一区| 国产精品久久久久久久久久久新郎| 亚洲伊人久久大香线蕉av| 免费不卡在线观看av| 国产精品一区二区久久| 欧美日韩国产麻豆| 国产日韩欧美在线视频观看| 国产精品视频公开费视频| 欧美精品生活片| 久久久久久午夜| 国产精品一区二区久久国产| 亚洲成人a**站|