Android开发_NFC

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 implements
		OnItemClickListener {
	// 存储所有应用的包名
	private List<String> mPackages = new ArrayList<String>();

	@Override
	public 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);
	}

	@Override
	public 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;

	@Override
	protected 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) {}
	}

	@Override
	protected 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);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值