最近接到一个项目:将手机放到一个带有NFC卡的底座上手机会自动解锁,然后打开相应的应用
本人用:杭州公交通用卡做为NFC卡+Coolpad手机进行试验
效果如下:
1、手机本身带有图案锁,输对图案才能解锁
2、Coolpad带有NFC功能
3、把手机内的所有正在运行的应用清空
4、关闭手机(目前处于锁住状态)
5、将NFC卡靠近
6、自动解锁+启动应用
注:我用华为的手机无法实现突破锁屏、打开应用的效果
工程核心代码
整个代码比较简单:(新建一个工程)在AndroidManifest.xml加入uses-feature和permission
同时还要在相应的activity中加入intent-filter,这里注意一定要加:<category android:name="android.intent.category.DEFAULT" />
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.beautifulzzzz.nfc_test" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="14" 9 android:targetSdkVersion="19" /> 10 11 <!-- 12 see http://www.developer.com/ws/android/nfc-programming-in-android.html for reference (note 13 that the minimum API version must be set as 10 in build.gradle (Module: app) for this to work, 14 and that classes being used from the nfc package require a minimum API version 14): 15 --> 16 <uses-feature 17 android:name="android.hardware.nfc" 18 android:required="true" /> 19 <uses-permission android:name="android.permission.NFC" /> 20 21 <uses-permission android:name="android.permission.WAKE_LOCK"/> 22 <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> 23 24 <application 25 android:allowBackup="true" 26 android:icon="@drawable/ic_launcher" 27 android:label="@string/app_name" 28 android:theme="@style/AppTheme" > 29 <activity 30 android:name=".Activity_Main" 31 android:label="@string/app_name" > 32 <intent-filter> 33 <action android:name="android.intent.action.MAIN" /> 34 <category android:name="android.intent.category.LAUNCHER" /> 35 </intent-filter> 36 37 <intent-filter> 38 <action android:name="android.nfc.action.TAG_DISCOVERED" /> 39 <category android:name="android.intent.category.DEFAULT" /> 40 </intent-filter> 41 </activity> 42 </application> 43 44 </manifest>
Activity中也比较简单——
onCreate中检测硬件是否支持和是否打开NFC
onResume中通过getIntent().getAction()获取当前的action然后显示在UI的文本显示区中
第34-48行是冲破图案锁,电量屏幕用的
1 public class Activity_Main extends Activity { 2 3 NfcAdapter nfcAdapter; 4 TextView promt; 5 @Override 6 public void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.ui_main); 9 promt = (TextView) findViewById(R.id.promt); 10 // 获取默认的NFC控制器 11 nfcAdapter = NfcAdapter.getDefaultAdapter(this); 12 if (nfcAdapter == null) { 13 promt.setText("设备不支持NFC!"); 14 System.out.println("设备不支持NFC!"); 15 finish(); 16 return; 17 } 18 if (!nfcAdapter.isEnabled()) { 19 promt.setText("请在系统设置中先启用NFC功能!"); 20 System.out.println("请在系统设置中先启用NFC功能!"); 21 finish(); 22 return; 23 } 24 promt.setText("正常启用APP!"); 25 System.out.println("正常启用APP!"); 26 } 27 28 @Override 29 protected void onResume() { 30 super.onResume(); 31 promt.setText(getIntent().getAction()); 32 System.out.println("正常启用APP!"); 33 34 PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE); 35 //获取电源管理器对象 36 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright"); 37 //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag 38 wl.acquire(); 39 //点亮屏幕 40 wl.release(); 41 //释放 42 43 KeyguardManager km= (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 44 //得到键盘锁管理器对象 45 KeyguardLock kl = km.newKeyguardLock("unLock"); 46 //参数是LogCat里用的Tag 47 kl.disableKeyguard(); 48 //解锁</pre><br><br> 49 } 50 }
资源链接
android之android.intent.category.DEFAULT的用途和使用
Android NFC开发概述(作者找了很多网上的NFC资料,可参考,有疏漏)
Android NFC 开发实例(一个简单的demo,我试了几下有点小问题,可参考)
本工程下载地址:http://pan.baidu.com/s/1c04ries
@beautifulzzzz
2015-11-02 持续更新中~