آموزش چک کردن اثر انگشت در اندروید
آموزش چک کردن اثر انگشت در اندروید سلام دوستان به بخش احراز هویت اثرانگشت در اندروید خوش آمدید بدون حرف اضافی به آموزش می پردازیم.
فواید استفاده از اثر انگشت
- سریع، راحت و قابل اطمینان
- دسترسی بدون نیاز به فکر کردن !
- اثر انگشت هر شخص منحصر بفرد است پس نگرانی ای برای دزدیده شدن آن وجود ندارد.
ابتدا پروژه را از File ⇒ New Project ایجاد می کنیم و کمترین مقدار sdk را برابر با APi 23 قرار میدهیم . علت قردادن این api ساپورت کردن finger print از گوشی های که اندروید 6 به بالا دارند هستش.البته ما در بخش کد هم این چک کردن را بررسی می کنیم ولی با این کار اپ ما روی گوشی هایی که اندرویدشان 6 به بالاست قابل نصب خواهد شد.
سپس در بخش AndroidMainfest.xml دسترسی زیر را اضافه می کنیم .
1 | <uses-permission android:name="android.permission.USE_FINGERPRINT" /> |
و بخش AndroidManifes.xml را به شکل زیر تکمیل می کنیم. کد های پایین فقط جنبه تکمیلی دارد تا کاربر گمراه نشود و افزودن دسترسی بالا کافی می باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="info.androidhive.fingerprint"> <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".FingerprintActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
در قسمت res ⇒ values فایل Colors.xml را باز کنید و همانند زیر تغییرات را اعمال کنید.
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#263237</color> <color name="colorPrimaryDark">#1e282d</color> <color name="colorAccent">#1e282d</color> <color name="textPrimary">#f5f5f5</color> <color name="textPrimaryDark">#95aab4</color> <color name="errorText">#ff7878</color> </resources> |
در قسمت res ⇒ values فایل string.xml را باز کنید و تغییرات زیر را اعمال کنید.
1 2 3 4 5 6 7 8 9 10 | <resources> <string name="app_name">Fingerprint</string> <string name="title_activity_main">MainActivity</string> <string name="title_fingerprint">One-touch Sign In</string> <string name="desc_fingerprint">Please place your fingertip on the scanner to verify your identity</string> <string name="note">(Fingerprint sign in makes your app login much faster. Your device should have at least one fingerprint registered in device settings)</string> <string name="title_activity_home">Fingerprint</string> <string name="activity_home_desc">You have successfully logged in with fingerprint authentication</string> <string name="activity_home_note">Close and re-open the app to see the fingerprint auth screen again</string> </resources> |
با کمک Android Image Assets یک ایکون اثرانگشت درست می کنیم برای این کار بروی فولدر drawable راست کلیک کرده و از بخش Create a New ⇐ گزینه Image Assets را انتخاب کنید و نام آن ایکون را برابر با ic_action_fingerprintost قرار دهید.
ساخت Fingerprint Activity
یک فایل به نام activity_fingerprint.xml در بخش layout ایجاد کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_fingerprint" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorPrimary" tools:context="info.androidhive.fingerprint.FingerprintActivity"> <LinearLayout android:layout_width="match_parent" android:id="@+id/headerLayout" android:orientation="vertical" android:gravity="center" android:layout_marginTop="100dp" android:layout_height="wrap_content"> <ImageView android:layout_width="70dp" android:layout_height="70dp" android:src="@drawable/ic_action_fingerprint" android:id="@+id/icon" android:paddingTop="2dp" android:layout_marginBottom="30dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/textPrimary" android:textSize="24sp" android:text="@string/title_fingerprint" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginTop="20dp" android:layout_marginBottom="10dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/textPrimary" android:textSize="16sp" android:textAlignment="center" android:gravity="center" android:id="@+id/desc" android:text="@string/desc_fingerprint" android:layout_margin="16dp" android:paddingEnd="30dp" android:paddingStart="30dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/errorText" android:textSize="14sp" android:textAlignment="center" android:id="@+id/errorText" android:paddingEnd="30dp" android:paddingStart="30dp" android:layout_marginTop="30dp" android:gravity="center"/> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/textPrimaryDark" android:textSize="14sp" android:text="@string/note" android:layout_marginLeft="16dp" android:textAlignment="center" android:layout_marginRight="16dp" android:layout_marginBottom="26dp" android:layout_alignParentBottom="true"/> </RelativeLayout><span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span> |
شکل اکتیویتی ما به این صورت می شود.
و در بخش FingeprintActivity.java تغییرات لازم را همانند زیر اعمال کنید.
آموزش چک کردن اثر انگشت در اندروید
دقت کنید در کد زیر Packagename تنطیم نشده است لطفا نام پکیج خود را وارد کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | import android.Manifest; import android.annotation.TargetApi; import android.app.KeyguardManager; import android.content.pm.PackageManager; import android.hardware.fingerprint.FingerprintManager; import android.os.Build; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyPermanentlyInvalidatedException; import android.security.keystore.KeyProperties; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; public class FingerprintActivity extends AppCompatActivity { private KeyStore keyStore; // Variable used for storing the key in the Android Keystore container private static final String KEY_NAME = "androidHive"; private Cipher cipher; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fingerprint); // Initializing both Android Keyguard Manager and Fingerprint Manager KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); FingerprintManager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE); textView = (TextView) findViewById(R.id.errorText); // Check whether the device has a Fingerprint sensor. if(!fingerprintManager.isHardwareDetected()){ /** * An error message will be displayed if the device does not contain the fingerprint hardware. * However if you plan to implement a default authentication method, * you can redirect the user to a default authentication activity from here. * Example: * Intent intent = new Intent(this, DefaultAuthenticationActivity.class); * startActivity(intent); */ textView.setText("Your Device does not have a Fingerprint Sensor"); }else { // Checks whether fingerprint permission is set on manifest if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { textView.setText("Fingerprint authentication permission not enabled"); }else{ // Check whether at least one fingerprint is registered if (!fingerprintManager.hasEnrolledFingerprints()) { textView.setText("Register at least one fingerprint in Settings"); }else{ // Checks whether lock screen security is enabled or not if (!keyguardManager.isKeyguardSecure()) { textView.setText("Lock screen security not enabled in Settings"); }else{ generateKey(); if (cipherInit()) { FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher); FingerprintHandler helper = new FingerprintHandler(this); helper.startAuth(fingerprintManager, cryptoObject); } } } } } } @TargetApi(Build.VERSION_CODES.M) protected void generateKey() { try { keyStore = KeyStore.getInstance("AndroidKeyStore"); } catch (Exception e) { e.printStackTrace(); } KeyGenerator keyGenerator; try { keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); } catch (NoSuchAlgorithmException | NoSuchProviderException e) { throw new RuntimeException("Failed to get KeyGenerator instance", e); } try { keyStore.load(null); keyGenerator.init(new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setUserAuthenticationRequired(true) .setEncryptionPaddings( KeyProperties.ENCRYPTION_PADDING_PKCS7) .build()); keyGenerator.generateKey(); } catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException | CertificateException | IOException e) { throw new RuntimeException(e); } } @TargetApi(Build.VERSION_CODES.M) public boolean cipherInit() { try { cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { throw new RuntimeException("Failed to get Cipher", e); } try { keyStore.load(null); SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, null); cipher.init(Cipher.ENCRYPT_MODE, key); return true; } catch (KeyPermanentlyInvalidatedException e) { return false; } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException | NoSuchAlgorithmException | InvalidKeyException e) { throw new RuntimeException("Failed to init Cipher", e); } } } |
و بخش activity_home.xml هم نیز به این صورت می باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="info.androidhive.fingerprint.HomeActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_home" /> </android.support.design.widget.CoordinatorLayout> |
و content_home.xml نیز همانند زیر
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/content_home" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="info.androidhive.fingerprint.HomeActivity" tools:showIn="@layout/activity_home"> <TextView android:layout_width="match_parent" android:text="@string/activity_home_desc" android:layout_centerVertical="true" android:textSize="24sp" android:textAlignment="center" android:textColor="@color/colorPrimary" android:layout_height="wrap_content" /> <TextView android:layout_width="match_parent" android:text="@string/activity_home_note" android:layout_alignParentBottom="true" android:textSize="14sp" android:textAlignment="center" android:textColor="@color/colorPrimary" android:layout_height="wrap_content" android:layout_marginBottom="24dp"/> </RelativeLayout> |
و بخش homeactivity.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | HomeActivity.class package info.androidhive.fingerprint; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; public class HomeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } } |
برای اینکه بتوانیم اثرانگشت کاربر را تشخیص دهیم نیاز به یک کلاس داریم تا تمامی نکات لازم را چک کند.
و در زیر ما یک FingerprintHandler ایجاد کرده ایم تا تمامی شرط ها را برایمان چک کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; import android.hardware.fingerprint.FingerprintManager; import android.os.CancellationSignal; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.widget.TextView; /** * Created by whit3hawks on 11/16/16. */ public class FingerprintHandler extends FingerprintManager.AuthenticationCallback { private Context context; // Constructor public FingerprintHandler(Context mContext) { context = mContext; } 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 public void onAuthenticationError(int errMsgId, CharSequence errString) { this.update("Fingerprint Authentication error\n" + errString, false); } @Override public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { this.update("Fingerprint Authentication help\n" + helpString, false); } @Override public void onAuthenticationFailed() { this.update("Fingerprint Authentication failed.", false); } @Override public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { this.update("Fingerprint Authentication succeeded.", true); } public void update(String e, Boolean success){ TextView textView = (TextView) ((Activity)context).findViewById(R.id.errorText); textView.setText(e); if(success){ textView.setTextColor(ContextCompat.getColor(context,R.color.colorPrimaryDark)); } } } |
دوستان آموزش یه پایان رسید انشاالله که مفید بوده باشد.
how to add fingerprint authentication in android
سلام
وقت بخیر
تشکر بابت آموزشهای کاربردی و سایت فاخر ؛
من میخواهم یک جدول کاربران درست کنم که هر کاربر در هنگام تعریف ، اثر انگشت او در جدول بانک اطلاعاتی ذخیره شود.
حال زمانی که کاربر میخواهد وارد برنامه شود ، در ابتدای صفحه لاگین با اثر انگشت بوده ، و اطلاعات کاربر پس از منطبق بودن در جدول بانک اطلاعاتی ، وارد برنامه شود.
سوال من :
* به چه صورت امکان ذخیره کردن اطلاعات اثر انگشت در بانک اطلاعاتی است ؟
* جستجو کردن یا منطبق کردن اثر انگشت کاربر با اطلاعات جدول کاربران ، در زمان لاگین به چه صورت می باشد ؟
* ارائه راهکار
متشکرم
دوست عزیز لطفا اینگونه سوالات را در صفحه اصلی بخش سوالات مطرح کنید که هم زودتر به جواب برسین هم بقیه استفاده راحت تر بکنند از بحث ها.ممنون
این کاری که شما میخواید انجام بدید و اطلاعات اثر انگشت کاربر رو توی دیتابیس ذخیره کنید امکان پذیر نیس چون برای استفاده و باز کردن قفل برنامه باید از fingerprintmanager استفاده کنید که اون هم امکان گرفتن fingerprint_Id رو از گوشی کاربر نداره و فقط ۳تا متد authenticate() و isHardwareDetected() و hasEnrolledFingerprints() داره که کلا هیچ کاری برای گرفتن اثر انگشت کاربر نمیکنن و باتوجه به اسمشون جنبه اطلاع رسانی به کاربر رو دارن و برای این استفاده میشن که برنامه خطا نده شرایط مختلف بررسی بشه
سلام
از اینکه هر روز آموزش های جدیدی میزارید واقعا ممنونیم ولی اگه امکان داره یخورده نحوه ی ایجاد فایل ها را و دقیقا کجا قرار بگیرند در استودیو بیشتر توضیح بدید که ما هم بعنوان یک برنامه نویس آماتور بتوانیم همراه شما رشد کنیم
سپاس
سلام آموزش های جدید به صورت کامل قرار گرفته است آموزش های قدیمی کمی کامل نیست.
موفق باشید.
باسلام و وقت بخیر خدمت شما مهندس
ممنون از راهنمایی ها و آموزشهای خوبتون
میخواستم بدونم که این روش برای خرید درون برنامه ای هم جوابکو هس کامل؟
بنده برای خرید درون برنامه ای مقدار بولینی رو داخل sqlite ذخیره میکنم…
آیا برای همین پارامتر باید کل دیتابیس رو رمزنگاری کنم یا همون بخش رو میشه رمزنگاری کنم؟
ممنون میشم راهنمایی بفرمایید.
سلام و درود
همون بخش رو میشه رمزگذاری کرد.
با سلام
آموزشتون فقط در حد کپی پیست هستش و اصلا کاربردی نداره و توضیحی در مورد کد ها ندادین
حتی یه جاهایی یه کلاس هایی رو فراخوانی کردید که در کد های بعدی به اون اشاره کردید و تازه اونو ساختید.
کتابخانه دیزاین رو استفاده کردید در صورتی که اصلا به اضافه کردن اون اشاره نکردید.
امیدوارم تلاشی برای بهتر کردن آموزش بکنید