安卓多媒体信息发布系统说明书.doc
《安卓多媒体信息发布系统说明书.doc》由会员分享,可在线阅读,更多相关《安卓多媒体信息发布系统说明书.doc(58页珍藏版)》请在文库网上搜索。
1、大家学习 android 开发建议首选 android 开发文档,该文档在你下载的 sdk 中, 路径:/sdk/docs/index.html 目前 NFC 应用的大的框架上的理解: 我使用的 API LEVEL 是 19,支持的 API 有三个: android.nfc,android.nfc.cardemulator,android.nfc.tech NFC 在手机上的应用大体分为两类:读卡器和卡 android.nfc.cardemulator 接口是为 NFC 作为卡应用提供的接口,在较低版本的 API 上是没有的 android.nfc.tech,android.nfc 接口是为
2、NFC 作为读卡器应用提供的接口 首先说作为卡,nfc 有两种实现方式,一个是使用 NFC 芯片作为卡,另一个是 使用 SIM 作为卡 Figure 1. NFC card emulation with a secure element. 至于从读卡器发送的指令到底是传递到 NFC 芯片还是 SIM 由 NFC Controler 控制, 图中 Secure Element 是指 SIM,Host-CPU 指 NFC 芯片 android 提供 HostApduService 用于 NFC 芯片,OffHostApduService 用于 SIM 芯片, 传递方向在 res/xml 文件中通过
3、 AID 来控制 ps:Host-Based Card Emulator 简称为 HCE 代码实现: AndroidManifest.xml 中 配置 service,因为作为卡实现的话,NFC 功能是作为 service 存在的 res/xml/apduservice.xml 中配置 service 响应的 AID 配置文件完成后编写 service 的处理方法: NFCService 需要继承 HostApduService,如果需要与 Activity 通信,建议采用广播 方式 也可以自己实现观察者模式,只是这样就需要持有 Activity 的引用,感觉不太好 NFCService.ja
4、va public class NFCService extends HostApduService private Intent intent = new Intent(“ munication.RECEIVER“); Override public void onCreate() /启动 Acivity Intent i = new Intent(); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);/需要启动的 Activity 不是当前 Activity 的时候需要用 FLAG_ACTIVITY_NEW_TASK i.setAction(“com.a
5、pdu.nfc“); getApplication().startActivity(i); Toast.makeText(getApplicationContext(), “Service 启动“, Toast.LENGTH_LONG). show(); Override public byte processCommandApdu(byte commandApdu, Bundle extras) /当注 册的 AID 被选中后,后续指令被分发到这个处理函数中 byte sw = new byte(byte)0x90,(byte)0x00; byte response = new byte5;
6、 if (commandApdu0=(byte)0x00 else /apdu 处理逻辑 switch(commandApdu1) case (byte)0xA8: break; case (byte)0xAE: break; default: return sw; intent.putExtra(“command“, commandApdu); intent.putExtra(“response“, response); sendBroadcast(intent); /利用广播与 Activity 通信 return response; /SW 值需要包含在 response 中 Overr
7、ide public void onDeactivated(int reason) if (reason=HostApduService.DEACTIVATION_DESELECTED) Toast.makeText(getApplicationContext(), “已选择其它应用“, Toast.LENGTH_LONG).show(); else Toast.makeText(getApplicationContext(), “连接断开“, Toast.LENGTH_LONG). show(); Override public void onDestroy() Toast.makeText
8、(getApplicationContext(), “Service 关闭“, Toast.LENGTH_LONG). show(); super.onDestroy(); 框架搭建好剩余的事情就很简单了,apdu 的处理逻辑在 processCommandApdu 方法中实现即可 以上是 Host-CPU 方式的实现,SIM 方式,API 介绍中说该方式没有提供可供操 作的 API,也就是说 Android 不会监听 SIM 卡与读卡器之间的通信 所以 NFCOffService 只需要实现 onBind 接口,这样绑定该 Service 的 Activity 可 以对 NFCOffServ
9、ice 进行有限操作 public class NFCOffService extends OffHostApduService Override public IBinder onBind(Intent intent) / TODO Auto-generated method stub return null; 上面没有提到的就是,如果你需要使用 NFC,需要在 Manifest 中申请 NFC 权限: 现在来说说 NFC 芯片作为读卡器的应用场景以及实现 android.nfc.tech,android.nfc 接口是为 NFC 作为读卡器应用提供的接口 接口定义了三种 Action Ta
10、gs:ACTION_NDEF_DISCOVERED,ACTION_TECH_DISCOVERED,ACTION_TAG_DISC OVERED。 当你在 Manifest 文件中将 Activity 的 action-filter 设置为这三个 Tag 中的一种或 几种时,NFC 响应事件会按照如图流程处理 我的理解是ACTION_NDEF_DISCOVERED 是用于两台 NFC 手机之间传输文件的 ACTION_TECH_DISCOVERED,ACTION_TAG_DISCOVERED 才是用于 NFC 与卡进行通讯的 所以开发第一步是在 Manifest 中配置你的 Action: TE
11、CH_DISCOVERED 还需要配置 meta-data,meta-data 的作用相当于补充说明或 者一些配置信息 nfc_tech_filter.xml android.nfc.tech.IsoDep android.nfc.tech.NfcA android.nfc.tech.NfcB android.nfc.tech.NfcF android.nfc.tech.NfcV android.nfc.tech.Ndef android.nfc.tech.NdefFormatable android.nfc.tech.MifareClassic android.nfc.tech.Mifare
12、Ultralight 当然 API 中说明你可以将多个 tech 写在一个 tech-list 中,我做了尝试,这样做 会引出一个问题,在程序未启动的情况下当手机刷卡时不会自动打开程序 如果想要自动打开需要按照上面这种写法,tech 的个数可以根据你想要支持的 卡类型进行调整 配置完成后,可以开始编写自己的 Activity 的 java 代码了 在 onCreate 方法中,需要获取 NfcAdapter 的引用,从名字可以看出这是一个适 配器 NfcAdapter nfcAdapter; PendingIntent pendingIntent; Override protected voi
13、d onCreate(Bundle savedInstanceState) 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 munication4Financy)
14、; nfcAdapter=NfcAdapter.getDefaultAdapter(this); pendingIntent = PendingIntent.getActivity( this, 0, new Intent(this, getClass().addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); onNewIntent(getIntent(); 这里使用 PendingIntent,该 Intent 与普通的 Intent 不同的是它是有一个延迟启 动的功能,它启动时会回调 onNewIntent 函数,这样能够实现 NFC 与 Activ
15、ity 的 交互 pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass().addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);的含义是将 Intent 传 递给 this Activity 在 onPause 与 onResume 中需要添加代码 public void onPause() super.onPause(); nfcAdapter.disableForegroundDispatch(this); public void onResume()
16、 super.onResume(); nfcAdapter.enableForegroundDispatch(this, pendingIntent, FILTERS, TECHLISTS); enableForegroundDispatch 的作用是,当 NFC 事件发生时如果当前 Activity 不是 注册了 NFC action-filter 的 Activity,手机会显示注册了 NFC 事件的 Activity 供用 户选择 如果当前 Activity 注册了 NFC action 则将事件优先交由当前 Activity 处理。 onNewIntent 实现: Override p
17、ublic void onNewIntent(Intent intent) Parcelable p = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (p=null) return; Tag nfcTag = (Tag)p; final IsoDep isodep = IsoDep.get(nfcTag); / final NfcA isodep = NfcA.get(nfcTag); final byte cmd = (byte) 0x00, / CLA Class (byte) 0xB4, / INS Instruction (b
18、yte) 0x04, / P1 Parameter 1 (byte) 0x00, / P2 Parameter 2 (byte) 0x00, / Le ; try isodep.connect(); byte reaponse=null; logWindow.append(“00B4040000“+n); try reaponse = isodep.getHistoricalBytes(); logWindow.append(Util.bytes2HexString(reaponse)+n); reaponse =isodep.transceive(cmd); logWindow.append
19、(Util.bytes2HexString(reaponse)+n); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IOException e1) / TODO Auto-generated catch block e1.printStackTrace(); finally try isodep.close(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); 首先需
20、要获取 Tag,Tag 是操作 NFC 的基础 Parcelable p = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (p=null) return; Tag nfcTag = (Tag)p; 再将 tag 转换成特定的通讯协议 final IsoDep isodep = IsoDep.get(nfcTag); 连接读卡器: isodep.connect(); 获取历史字节: reaponse = isodep.getHistoricalBytes(); 响应指令: reaponse =isodep.transceive(cmd)
21、; 最后断开连接:(断开动作应该在 Activity 关闭或者 pause 的时候发生) finally try isodep.close(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); onNewIntent 里面可以实现业务逻辑的处理以及 UI 1 一 月二 月三 月 产品名称数量 金额利润产品名称数量 金额 利润产品名称数量金额利润 合 计合 计合 计 四 月五 月六 月 产品名称 数 量 金 额 利 润 产品名称 数 量 金 额 利 润 产品名称 数 量 金 额 利 润 合
22、计合 计合 计 下午 13:0017:00 B实行不定时工作制的员工,在保证完成甲方工作任务情况下,经公司同意,可自行安排工作和休息时间。 312 打卡制度 3.1.2.1 公司实行上、下班指纹录入打卡制度。全体员工都必须自觉遵守工作时间,实行不定时工作制的员工不必打卡。 3.1.2.2 打卡次数:一日两次,即早上上班打卡一次,下午下班打卡一次。 3.1.2.3 打卡时间:打卡时间为上班到岗时间和下班离岗时间; 3.1.2.4 因公外出不能打卡:因公外出不能打卡应填写外勤登记表,注明外出日期、事由、外勤起止时间。因公外出需事先申请,如因特殊情况不能事先申请,应在事毕到岗当日完成申请、 审批手续
23、,否则按旷工处理。因停电、卡钟(工卡)故障未打卡的员工,上班前、下班后要及时到部门考勤员处填写未打卡补签申请表,由直接主管签字证明当日的出勤状况,报部门经 理、人力资源部批准后,月底由部门考勤员据此上报考勤。上述情况考勤由各部门或分公司和项目文员协助人力资源部进行管理。 3.1.2.5 手工考勤制度 3.1.2.6 手工考勤制申请:由于工作性质,员工无法正常打卡(如外围人员、出差),可由各部门提出人员名单,经主管副总批准后,报人力资源部审批备案。 3.1.2.7 参与手工考勤的员工,需由其主管部门的部门考勤员(文员)或部门指定人员进行考勤管理,并于每月 26 日前向人力资源部递交考勤报表。 3
24、.1.2.8 参与手工考勤的员工如有请假情况发生,应遵守相关请、休假制度,如实填报相关表单。 3.1.2.9 外派员工在外派工作期间的考勤,需在外派公司打卡记录;如遇中途出差,持出差证明,出差期间的考勤在出差地所在公司打卡记录; 3.2 加班管理 3.2.1 定义 加班是指员工在节假日或公司规定的休息日仍照常工作的情况。 A现场管理人员和劳务人员的加班应严格控制,各部门应按月工时标准,合理安排工作班次。部门经理要严格审批员工排班表,保证员工有效工时达到要求。凡是达到月工时标准的,应扣 减员工本人的存休或工资;对超出月工时标准的,应说明理由,报主管副总和人力资源部审批。 B因员工月薪工资中的补贴
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
15 文币 0人已下载
下载 | 加入VIP,免费下载 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多媒体信息 发布 系统 说明书