Android开发_NFC

来源:互联网 发布:电脑深度清理软件 编辑:程序博客网 时间:2024/06/07 21:45

NFC介绍

近场通信(NFC)是一个短范围无线技术集合,通常需要4厘米或更短的距离才能初始化连接。NFC允许在NFC标签和Android设备之间或两个Android设备之间共享小的数据的负载。

NFC标签具有复杂的分类。简单的NFC标签只提供读写语法,某些时候一次只能以只读的方式读取卡片的可编程区域。复杂一点的NFC标签提供了数学运算能力,而且有加密的硬件来认证对一个扇区的访问。最复杂的NFC标签包含了运算环境,允许在标签上执行复杂的交互代码。存储在标签中的数据也可以用各种格式来编写,但是大多数的Android框架API都使用基于NDEF(NFC Data Exchange Format)的标准。

在Android NFC 应用中,Android手机通常是作为通信中的发起者,也就是作为各种NFC卡的读写器。Android对NFC的支持主要在 android.nfc 和android.nfc.tech 两个包中。

android.nfc 包中主要类如下:

NfcManager 可以用来管理Android设备中指出的所有NFCAdapter,但由于大部分Android设备只支持一个NFC Adapter,所以一般直接调用getDefaultAapater来获取手机中的Adapter。

NfcAdapter 相当于一个NFC适配器,类似于电脑装了网络适配器才能上网,手机装了NfcAdapter才能发起NFC通信。

  NDEF: NFC Data Exchange Format,即NFC数据交换格式。

NdefMessage 和NdefRecord NDEF 为NFC forum 定义的数据格式。NdefMessage : 描述NDEF格式的信息,NdefRecord : 描述NDEF信息的一个信息段

Tag 代表一个被动式Tag对象,可以代表一个标签,卡片等。当Android设备检测到一个Tag时,会创建一个Tag对象,将其放在Intent对象,然后发送到相应的Activity。

android.nfc.tech 中则定义了可以对Tag进行的读写操作的类,这些类按照其使用的技术类型可以分成不同的类如:NfcA, NfcB, NfcF,以及MifareClassic 等。其中MifareClassic比较常见。

利用NFC启动android应用程序

 <uses-permission android:name="android.permission.NFC" />
 <uses-feature android:name="android.hardware.nfc" android:required="true"/>

public class InstalledApplicationListActivity extends ListActivity implementsOnItemClickListener {// 存储所有应用的包名private List<String> mPackages = new ArrayList<String>();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获取应用的包名PackageManager packageManager = getPackageManager();List<PackageInfo> packageInfos = packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES);for (PackageInfo packageInfo : packageInfos) {mPackages.add(packageInfo.applicationInfo.loadLabel(packageManager)+ "\n" + packageInfo.packageName);}ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, android.R.id.text1,mPackages);setListAdapter(arrayAdapter);getListView().setOnItemClickListener(this);}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {Intent intent = new Intent();intent.putExtra("package_name", mPackages.get(position));setResult(1, intent);finish();}}


public class MainActivity extends Activity {private Button mSelectAutoRunApplication;private String mPackageName;private NfcAdapter mNfcAdapter;private PendingIntent mPendingIntent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.lv);mSelectAutoRunApplication = (Button) findViewById(R.id.bt);mNfcAdapter = NfcAdapter.getDefaultAdapter(this);mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,getClass()), 0);}public void onNewIntent(Intent intent) {if (mPackageName == null)return;Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);writeNFCTag(detectedTag);}public void onResume() {super.onResume();if (mNfcAdapter != null)mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null,null);}public void onPause() {super.onPause();if (mNfcAdapter != null)mNfcAdapter.disableForegroundDispatch(this);}public void onClick_SelectAutoRunApplication(View view) {Intent intent = new Intent(this, InstalledApplicationListActivity.class);startActivityForResult(intent, 0);}public void writeNFCTag(Tag tag) {if (tag == null) {return;}NdefMessage ndefMessage = new NdefMessage(new NdefRecord[] { NdefRecord.createApplicationRecord(mPackageName) });int size = ndefMessage.toByteArray().length;try {Ndef ndef = Ndef.get(tag);if (ndef != null) {ndef.connect();if (!ndef.isWritable()) {return;}if (ndef.getMaxSize() < size) {return;}ndef.writeNdefMessage(ndefMessage);Toast.makeText(this, "ok", Toast.LENGTH_LONG).show();} else {// 格式化NFC标签成NDEF格式NdefFormatable format = NdefFormatable.get(tag);if (format != null) {format.connect();format.format(ndefMessage);Toast.makeText(this, "ok", Toast.LENGTH_LONG).show();} else {Toast.makeText(this, "formating is failed",Toast.LENGTH_LONG).show();}}} catch (Exception e) {}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == 1) {mSelectAutoRunApplication.setText(data.getExtras().getString("package_name"));String temp = mSelectAutoRunApplication.getText().toString();mPackageName = temp.substring(temp.indexOf("\n") + 1);}}}


0 0