通过指纹识别模块验证用户,解锁手机

      项目简介:

      手机端编写屏保软件,利用蓝牙与蓝牙串口模块和指纹识别器组成的指纹采集、识别系统进行通信,从而获取用户指纹验证信息,

软件获取指纹识别器发送的验证结果,以决定是否允许用户解锁锁屏,进入手机主界面。

    这很想iPone5s的TouchID,用户只需按下Home键,即可完成用户验证、解锁锁屏和进入主界面这个步骤,代替了传统的解锁方式:

首先按下Home键,然后输入4个数字,用以验证,其次进入主界面。传统解锁方式繁琐复杂,完成解锁需要五个操作:按Home键+4个数字。

而指纹识别解锁只需一个操作:按Home键。

     这个想法是12年的冬天想到的,当时我正在宿舍门外用iPhone蹭网,每次解锁iPhone都要经历五个步骤,我感觉到很繁琐。

忽然,我想到了前两天从淘宝上看到的指纹识别器,忽然我就想,那我能不能模拟一下只按Home键即可解锁手机呢?正好当时

我们学校正在组织萌芽杯(就是大学内的科技制作等)比赛,我也早就和两位同学报名了萌芽杯,但是当时报名课题不是指纹一步解锁,

于是我们把课题换成了指纹一步解锁,我觉得这个意义很大,因为手机如果配备上指纹识别器后,将对于解锁和支付等需要密码验证的一类

服务产生巨大的影响。于是说做就做。

     时隔一年多,温习一下指纹一步解锁项目。

    项目各模块:

   1、安卓智能手机

   2、UART通信,TTL电平的光学指纹识别模块

   3、蓝牙串口模块

   4、USB转TTL模块(用电脑串口调试指纹识别器)


     指纹识别器与USB转TTL模块连接图


    

              电脑串口调试指纹模块图:


        

           蓝牙串口模块与指纹识别模块连线图:

     

        上图可以看到有一个单片机开发板,其实它没有什么作用,唯一的作用就是提供了蓝牙串口模块和指纹识别模块的电源。微笑


          利用手机端蓝牙串口调试软件对指纹识别器进行调试,检查是否连线正确

   


      调试成功!

     接着就开始写手机端的软件了。

    以下为主要代码段:

  

package jeff.iphonelock;

import java.util.List;

import android.app.ActivityManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;

//蓝牙
import java.io.IOException;
import java.io.InputStream;

import java.io.OutputStream;
 
import java.util.UUID;
 
import android.bluetooth.BluetoothAdapter;
 
import android.bluetooth.BluetoothDevice;
 
import android.bluetooth.BluetoothSocket;
import android.widget.Toast;

public class MyLockScreenService extends Service {
	private final String ACT_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
	private final String ACT_SCREEN_ON = "android.intent.action.SCREEN_ON";
	
	public BluetoothAdapter mBluetoothAdapter = null;
    public static BluetoothSocket btSocket = null;
    public static OutputStream outStream = null;
  //蓝牙通信类型:蓝牙串口
    public static final UUID 
              MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    public static String address = "00:15:FF:F3:B8:86"; // <==要连接的蓝牙设备MAC地址
    int k=0,is=0,canfinish=0;
    public static InputStream inStream = null;
	Toast toast=null;
    char  mes;
    byte[] buffer=new byte[20];  // buffer store for the instream
    //指纹识别器自动注册指令
    static byte[] zhuce={(byte) 0xEF,(byte) 0x01,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 
       0xFF,(byte) 0x01,(byte) 0x00,(byte) 0x03,(byte) 0x10,(byte) 0x00,(byte) 0x14};
    //指纹识别器自动识别指令
    static byte[] shibie={(byte) 0xEF,(byte) 0x01,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 
      0xFF,(byte) 0x01,(byte) 0x00,(byte) 0x03,(byte) 0x11,(byte) 0x00,(byte) 0x15}; 
    //指纹识别器删除指纹库内编号为0的指纹模板指令 
    static byte[] shanchu={(byte) 0xEF,(byte) 0x01,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 
      0xFF,(byte) 0x01,(byte) 0x00,(byte) 0x07,(byte) 0x0C,(byte) 0x00,(byte) 0x00,(byte) 
       0x00,(byte) 0x01,(byte) 0x00,(byte) 0x15}; 
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		Log.e("", "***********onBind MyLockScreenService");
		return null;
	}
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		//建立蓝牙连接
		 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
		 BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
         try {
        	   //约定蓝牙通信类型
               btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
               
             } catch (IOException e) {

	             DisplayToast("套接字创建失败!");
	             onDestroy();
	        }
	        mBluetoothAdapter.cancelDiscovery();
	        try {
	        	  //建立蓝牙通信通道
	                btSocket.connect();
	                DisplayToast("蓝牙连接成功!");

	        } catch (IOException e) {

	                try {
	                	btSocket.close();
	                	DisplayToast("蓝牙连接没有建立!");
	                	onDestroy();

	                } catch (IOException e2) {

	                        
	                        DisplayToast("连接没有建立,无法关闭套接字!");
	                        onDestroy();
	                }
	        }
		// register Broadcast
        //IntentFilter Filter= new IntentFilter(ACT_SCREEN_OFF);
    	//registerReceiver(ScreenBCR, Filter);

    	IntentFilter intentFilter= new IntentFilter(ACT_SCREEN_ON);
    	registerReceiver(mScreenBCR, intentFilter);
	}
	
	private void finish() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		try {
			
			btSocket.close();
			DisplayToast("已断开蓝牙连接!");
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		unregisterReceiver(mScreenBCR);
	}
	
	//接收到Screen_ON 事件:
	private BroadcastReceiver mScreenBCR = new BroadcastReceiver() {
		
		@SuppressWarnings("deprecation")
		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			Log.e("", "***********onReceive Intent="+intent);
		   //蓝牙发送数据
			
		  //is判断是否锁屏
		   is=0;       
		   try {
			    //获取输出数据流
			     outStream = btSocket.getOutputStream();
			
			  } catch (IOException e2) {
				// TODO Auto-generated catch block
			     e2.printStackTrace();
			 }
		   
		    try {
		    	//获取输入数据流
				 inStream=btSocket.getInputStream();
				 
				} catch (IOException e) {
								// TODO Auto-generated catch block
				   e.printStackTrace();
				}
		    
		    try {
		    	//发送指令给指纹识别器
				outStream.write(shibie);
				while(true){
			        				 
		            try {
					   if((k=inStream.read(buffer))!=-1){
						  //蓝牙串口返回数据为16个字节,避免数据传送阻塞,造成接收错误
							while(k!=16)
							  k+=inStream.read(buffer,k,16-k); 
							
							//调试用,查看接收数据字节数
							   //mes=(char) (k+48);
							//buffer[9]为指纹识别器通过蓝牙串口传回的确认码
							if(buffer[9]!=0){
							  if(buffer[9]==2) DisplayToast("未录入指纹!");
								else if(buffer[9]==9) DisplayToast("指纹不匹配!");
									else DisplayToast("指纹有误!");
								 is=0;
							}// endif
							else{
							    DisplayToast("成功!");
							    //关闭锁屏
								is=1;
								if(canfinish==1)
								   DrawLockScreen.mParentActivity.finish();
							}
							 break;
						 }  //endif
					} catch (IOException e1) {
											// TODO Auto-generated catch block
											e1.printStackTrace();
					}
			   }//endwhile
		     }//endtry
				catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
                 } 
		         //指纹识别不匹配或不成功时,开启锁屏
			      if(is==0){
			    	     //开启锁屏
		        	     Intent i = new Intent();  
		        	     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
		        	     i.setClass(context, IPhoneLock.class);  
		        	     context.startActivity(i);
		        	     canfinish=1;//是否可以启用DrawLockScreen.mParentActivity.finish();
		         }  
		} //EndonReceive
};//End——BroadcastReceiver

//显示提示内容
public void DisplayToast(String str)
	{
      if (toast == null) 
        {
            toast=Toast.makeText(this, str, Toast.LENGTH_SHORT);
        }
        else
        {
          //当另一个显示内容出现时,立即关闭当前显示,避免“大排队”
            toast.cancel();
            toast.setText(str);
        }
    	toast.setGravity(Gravity.TOP, 0, 220);
    	toast.show();
    }
}//End_MyLockScreenService;



     


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值