NFC之让Android自动运行程序

最近在学习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

时间: 2024-08-19 14:27:41

NFC之让Android自动运行程序的相关文章

7、NFC技术:让Android自动运行程序

用于描述NDEF格式数据的两个重要的类 NdefMessage:描述NDEF格式的信息 NdefRecord:描述NDEF信息的一个信息段  NdefMessage和NdefRecord是Android NFC技术的核心类,无论读写NDEF格式的NFC标签,还是通过Android Beam技术传递Ndef格式的数据,都需要这两个类. 向NFC标签写入数据的步骤 获取Tag对象 Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 判

Android实现开机自动运行程序

有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内容的后台service.怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以“Don't call me, I'll call you back!”总结Android框架,真是说到点子上了.理解这句话的含义,许多有关Android平台上实现某种功能的问题,都能迎刃而解. 使用场景:手机开机后,自动运行程序,在屏幕上显示"Hello. Istarted!"字样. 背景知识:当Android启动时,会发出一个系统广播,内

[VC]VC实现开机自动运行程序

有时候,我们需要在计算机启动的时候就启动某些程序,不要人干预.这里,提供一种让程序开机自动运行的方法.见下面代码: BOOL CXXX::SetAutoRun(CString strPath) { CString str; HKEY hRegKey; BOOL bResult; str=_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"); if(RegOpenKey(HKEY_LOCAL_MACHINE, str, &

如何在Linux实现自动运行程序

1.开机启动时 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init. init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /etc/rc.d ( /etc/rc?.d) 目录下的脚本文件,可以使init自动启动其它程序. /etc/rc:This file is responsible for starting/stopping services when the runlevel changes 例如: 编辑 /etc/rc.d/r

如何在LINUX中开机、登陆、退出、定时、定期自动运行程序

1.开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /etc/rc.d 或 /etc/rc?.d 目录下的脚本文件,可以使init自动启动其它程序.例如:编辑 /etc/rc.d/rc.local 文件,在文件最末加上一行“xinit”或“startx”,可以在开机启动后直接进入X-Window. 2.登录时自动运行程序 用户登录时,bash首先自动执行系

Android自动运行失败的原因分析

Android程序自动运行失败的原因是因为接收不到BOOT_COMPLETED广播.而造成接收不到BOOT_COMPLETED广播可能的原因可能有以下几个方面: (1).BOOT_COMPLETED对应的action和uses-permission没有一起添加 (2).应用安装到了sd卡内,安装在sd卡内的应用是收不到BOOT_COMPLETED广播的 (3).系统开启了Fast Boot模式,这种模式下系统启动并不会发送BOOT_COMPLETED广播 (4).应用程序安装后重来没有启动过,这

CentOS开机自动运行程序的脚本

有些时候我们需要在服务器里设置一个脚本,让他一开机就自己启动.方法如下: cd /etc/init.dvi youshell.sh   #将youshell.sh修改为你自己的脚本名编写自己的脚本后保存退出.在编写脚本的时候,请先加入以下注释 #add for chkconfig#chkconfig: 2345 70 30#description: the description of the shell   #关于脚本的简短描述#processname: servicename        

/etc/rc.local 与 /etc/init.d Linux 开机自动运行程序

1. /etc/rc.local 这是使用者自订开机启动程序,把需要开机自动运行的程序写在这个脚本里 --------引用---------------------- 在完成 run level 3 的服务启动后,如果我还有其他的动作想要完成时,举例来说, 我还想要寄一封 mail 给某个系统管理帐号,通知他,系统刚刚重新开机完毕,那么, 是否应该要制作一个 shell script 放置在 /etc/rc.d/init.d/ 里面,然后再以连结方式连结到 /etc/rc.d/rc3.d/ 里面

win下开机不登陆系统自动运行程序

文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作. Jet的电脑可以定时开机了,但是他希望XP系统启动后在不登陆用户的情况下运行锐捷和电驴,拿到这个问题的时候我第一个想法就是用服务,因为大家都知道服务启动是无视用户登录情况的. 简单来说,我用SC添加了一个服务,结果失败了,因为windows那该死的服务机制,具体原因我懒得写,总之就是不行.最后我跑到Microsoft Support那里找到了解决方法. Windows NT Re