您的位置:首页 > 移动开发 > Android开发

NFC之让Android自动运行程序

2015-01-16 21:33 309 查看
最近在学习NFC,参考了两篇不错的文章
参考地址:
NFC基础 http://blog.csdn.net/zoeice/article/details/9714867
NFC高级 http://blog.csdn.net/zoeice/article/details/9714963
本文是使用了NFC的标签纸和小米3手机测试
首先新建一个Activity类

package com.cayden.run.application;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
/**
 * 
 *  
 * @author cuiran
 * @version 1.0.0
 */
public class RunApplicationActivity extends Activity {

	private Button mSelectAutoRunApplication;
	private String mPackageName;
	private NfcAdapter mNfcAdapter;
	private PendingIntent mPendingIntent;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_auto_run_application);

		mSelectAutoRunApplication = (Button) findViewById(R.id.button_select_auto_run_application);

		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();
			}

		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	@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);
			
		}

	}

}

在此Activity中,可以点击按钮然后跳转到另一个Activity,是用来显示应用列表

package com.cayden.run.application;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;

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();

	}

}

当选择应用后,会回调并传回

packageInfo.applicationInfo.loadLabel(packageManager)
					+ "\n" + packageInfo.packageName
具体操作,先将nfc标签纸放入手机背面会执行

public void onNewIntent(Intent intent) {
		if (mPackageName == null)
			return;

		Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

		writeNFCTag(detectedTag);
	}
如果不为空,就将所选择的应用写入标签纸
然后退出应用后,将标签纸放入手机背面就会自动执行所选择的应用程序。
关于NdefRecord 在官网也给出了api
http://developer.android.com/reference/android/nfc/package-summary.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: