最近接到一個(gè)項(xiàng)目:將手機(jī)放到一個(gè)帶有NFC卡的底座上手機(jī)會(huì)自動(dòng)解鎖,然后打開(kāi)相應(yīng)的應(yīng)用
本人用:杭州公交通用卡做為NFC卡+Coolpad手機(jī)進(jìn)行試驗(yàn)
效果如下:
1、手機(jī)本身帶有圖案鎖,輸對(duì)圖案才能解鎖
2、Coolpad帶有NFC功能
3、把手機(jī)內(nèi)的所有正在運(yùn)行的應(yīng)用清空
4、關(guān)閉手機(jī)(目前處于鎖住狀態(tài))
5、將NFC卡靠近
6、自動(dòng)解鎖+啟動(dòng)應(yīng)用
注:我用華為的手機(jī)無(wú)法實(shí)現(xiàn)突破鎖屏、打開(kāi)應(yīng)用的效果
工程核心代碼
整個(gè)代碼比較簡(jiǎn)單:(新建一個(gè)工程)在AndroidManifest.xml加入uses-feature和permission
同時(shí)還要在相應(yīng)的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 (note13 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-feature17 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 <application25 android:allowBackup="true"26 android:icon="@drawable/ic_launcher"27 android:label="@string/app_name"28 android:theme="@style/AppTheme" >29 <activity30 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中也比較簡(jiǎn)單——
onCreate中檢測(cè)硬件是否支持和是否打開(kāi)NFC
onResume中通過(guò)getIntent().getAction()獲取當(dāng)前的action然后顯示在UI的文本顯示區(qū)中
第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 // 獲取默認(rèn)的NFC控制器 11 nfcAdapter = NfcAdapter.getDefaultAdapter(this); 12 if (nfcAdapter == null) { 13 promt.setText("設(shè)備不支持NFC!"); 14 System.out.println("設(shè)備不支持NFC!"); 15 finish(); 16 return; 17 } 18 if (!nfcAdapter.isEnabled()) { 19 promt.setText("請(qǐng)?jiān)谙到y(tǒng)設(shè)置中先啟用NFC功能!"); 20 System.out.println("請(qǐng)?jiān)谙到y(tǒng)設(shè)置中先啟用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 //獲取電源管理器對(duì)象 36 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright"); 37 //獲取PowerManager.WakeLock對(duì)象,后面的參數(shù)|表示同時(shí)傳入兩個(gè)值,最后的是LogCat里用的Tag 38 wl.acquire(); 39 //點(diǎn)亮屏幕 40 wl.release(); 41 //釋放 42 43 KeyguardManager km= (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 44 //得到鍵盤(pán)鎖管理器對(duì)象 45 KeyguardLock kl = km.newKeyguardLock("unLock"); 46 //參數(shù)是LogCat里用的Tag 47 kl.disableKeyguard(); 48 //解鎖</pre><br><br> 49 } 50 }
資源鏈接
Android 解屏幕鎖與點(diǎn)亮屏幕(來(lái)電時(shí)效果)
android之a(chǎn)ndroid.intent.category.DEFAULT的用途和使用
Android NFC開(kāi)發(fā)概述(作者找了很多網(wǎng)上的NFC資料,可參考,有疏漏)
Android NFC 開(kāi)發(fā)實(shí)例(一個(gè)簡(jiǎn)單的demo,我試了幾下有點(diǎn)小問(wèn)題,可參考)
本工程下載地址:http://pan.baidu.com/s/1c04ries
@beautifulzzzz
2015-11-02 持續(xù)更新中~
聯(lián)系客服