您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 心得体会 > 安卓开发工作心得体会范文
安卓开发工作心得体会范文【导读】这篇文档“安卓开发工作心得体会范文”由三一刀客最漂亮的网友为您分享整理,希望这篇范文对您有所帮助,喜欢就下载吧!安卓NFC开发学习笔记1大家学习android开发建议首选android开发文档,该文档在你下载的sdk中,路径:/sdk/docs/index.html目前NFC应用的大的框架上的理解:我使用的APILEVEL是19,支持的API有三个:android.nfc,android.nfc.cardemulator,android.nfc.techNFC在手机上的应用大体分为两类:读卡器和卡android.nfc.cardemulator接口是为NFC作为卡应用提供的接口,在较低版本的API上是没有的android.nfc.tech,android.nfc接口是为NFC作为读卡器应用提供的接口首先说作为卡,nfc有两种实现方式,一个是使用NFC芯片作为卡,另一个是使用SIM作为卡Figure1.NFCcardemulationwithasecureelement.至于从读卡器发送的指令到底是传递到NFC芯片还是SIM由NFCControler控制,图中SecureElement是指SIM,Host-CPU指NFC芯片android提供HostApduService用于NFC芯片,OffHostApduService用于SIM芯片,传递方向在res/xml文件中通过AID来控制ps:Host-BasedCardEmulator简称为HCE代码实现:AndroidManifest.xml中配置service,因为作为卡实现的话,NFC功能是作为service存在的android:permiion=android.permiion.BIND_NFC_SERVICEandroid:resource=@xml/apduservice/res/xml/apduservice.xml中配置service响应的AIDandroid:requireDeviceUnlock=falseandroid:category=other配置文件完成后编写service的处理方法:NFCService需要继承HostApduService,如果需要与Activity通信,建议采用广播方式也可以自己实现观察者模式,只是这样就需要持有Activity的引用,感觉不太好NFCService.javapublicclaNFCServiceextendsHostApduService{privateIntentintent=newIntent(com.example.communication.RECEIVER);@OverridepublicvoidonCreate(){//启动AcivityIntenti=newIntent();i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//需要启动的Activity不是当前Activity的时候需要用FLAG_ACTIVITY_NEW_TASKi.setAction(com.apdu.nfc);getApplication().startActivity(i);Toast.makeText(getApplicationContext(),Service启动,Toast.LENGTH_LONG).show();}@Overridepublicbyte[]proceCommandApdu(byte[]commandApdu,Bundleextras){//当注册的AID被选中后,后续指令被分发到这个处理函数中byte[]sw=newbyte[]{(byte)0x90,(byte)0x00};byte[]response=newbyte[5];if(commandApdu[0]==(byte)0x00&&commandApdu[1]==(byte)0xA4&&commandApdu[2]==(byte)0x04&&commandApdu[4]==(byte)0x07&&commandApdu[5]==(byte)0xF0){returnsw;}else{//apdu处理逻辑switch(commandApdu[1]){case(byte)0xA8:break;case(byte)0xAE:break;default:returnsw;}}intent.putExtra(command,commandApdu);intent.putExtra(response,response);sendBroadcast(intent);//利用广播与Activity通信returnresponse;//SW值需要包含在response中}@OverridepublicvoidonDeactivated(intreason){if(reason==HostApduService.DEACTIVATION_DESELECTED){Toast.makeText(getApplicationContext(),已选择其它应用,Toast.LENGTH_LONG).show();}else{Toast.makeText(getApplicationContext(),连接断开,Toast.LENGTH_LONG).show();}}@OverridepublicvoidonDestroy(){Toast.makeText(getApplicationContext(),Service关闭,Toast.LENGTH_LONG).show();super.onDestroy();}框架搭建好剩余的事情就很简单了,apdu的处理逻辑在proceCommandApdu方法中实现即可以上是Host-CPU方式的实现,SIM方式,API介绍中说该方式没有提供可供操作的API,也就是说Android不会监听SIM卡与读卡器之间的通信所以NFCOffService只需要实现onBind接口,这样绑定该Service的Activity可以对NFCOffService进行有限操作publicclaNFCOffServiceextendsOffHostApduService{@OverridepublicIBinderonBind(Intentintent){//TODOAuto-generatedmethodstubreturnnull;}}上面没有提到的就是,如果你需要使用NFC,需要在Manifest中申请NFC权限:现在来说说NFC芯片作为读卡器的应用场景以及实现android.nfc.tech,android.nfc接口是为NFC作为读卡器应用提供的接口接口定义了三种ActionTags:ACTION_NDEF_DISCOVERED,ACTION_TECH_DISCOVERED,ACTION_TAG_DISCOVERED。当你在Manifest文件中将Activity的action-filter设置为这三个Tag中的一种或几种时,NFC响应事件会按照如图流程处理我的理解是ACTION_NDEF_DISCOVERED是用于两台NFC手机之间传输文件的ACTION_TECH_DISCOVERED,ACTION_TAG_DISCOVERED才是用于NFC与卡进行通讯的所以开发第一步是在Manifest中配置你的Action:android:resource=@xml/nfc_tech_filter/TECH_DISCOVERED还需要配置meta-data,meta-data的作用相当于补充说明或者一些配置信息nfc_tech_filter.xmlandroid.nfc.tech.IsoDepandroid.nfc.tech.NfcAandroid.nfc.tech.NfcBandroid.nfc.tech.NfcFandroid.nfc.tech.NfcVandroid.nfc.tech.Ndefandroid.nfc.tech.NdefFormatableandroid.nfc.tech.MifareClaicandroid.nfc.tech.MifareUltralight当然API中说明你可以将多个tech写在一个tech-list中,我做了尝试,这样做会引出一个问题,在程序未启动的情况下当手机刷卡时不会自动打开程序如果想要自动打开需要按照上面这种写法,tech的个数可以根据你想要支持的卡类型进行调整配置完成后,可以开始编写自己的Activity的java代码了在onCreate方法中,需要获取NfcAdapter的引用,从名字可以看出这是一个适配器NfcAdapternfcAdapter;PendingIntentpendingIntent;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.pos_main);dc=(Button)findViewById(R.id.button4DC);ecc=(Button)findViewById(R.id.button4ECC);qpboc=(Button)findViewById(R.id.button4QPBOC);logWindow=(TextView)findViewById(R.id.communication4Financy);nfcAdapter=NfcAdapter.getDefaultAdapter(this);pendingIntent=PendingIntent.getActivity(this,0,newIntent(this,getCla()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);onNewIntent(getIntent());}这里使用PendingIntent,该Intent与普通的Intent不同的是它是有一个延迟启动的功能,它启动时会回调onNewIntent函数,这样能够实现NFC与Activity的交互pendingIntent=PendingIntent.getActivity(this,0,newIntent(this,getCla()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);的含义是将Intent传递给thisActivity在onPause与onResume中需要添加代码publicvoidonPause(){super.onPause();nfcAdapter.disableForegroundDispatch(this);}publicvoidonResume(){super.onResume();nfcAdapter.enableForegroundDispatch(this,pendingIntent,FILTERS,TECHLISTS);}enableForegroundDispatch的作用是,当NFC事件发生时如果当前Activity不是注册了NFCaction-filter的Activity,手机会显示注册了NFC事件的Activity供用户选择如果当前Activity注册了NFCaction则将事件优先交由当前Activity处理。onNewIntent实现:@OverridepublicvoidonNewIntent(Intentintent){Parcelablep=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);if(p==null){return;}TagnfcTag=(Tag)p;finalIsoDepisodep=IsoDep.get(nfcTag);//finalNfcAisodep=NfcA.get(nfc
本文标题:安卓开发工作心得体会范文
链接地址:https://www.777doc.com/doc-10569409 .html