IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]NFC之让Android自动运行程序

    cuiran发表于 2015-01-16 21:33:23
    love 0

    最近在学习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 mPackages = new ArrayList();
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    
    		PackageManager packageManager = getPackageManager();
    		List packageInfos = packageManager
    				.getInstalledPackages(PackageManager.GET_ACTIVITIES);
    		for (PackageInfo packageInfo : packageInfos) {
    
    			mPackages.add(packageInfo.applicationInfo.loadLabel(packageManager)
    					+ "\n" + packageInfo.packageName);
    		}
    
    		ArrayAdapter arrayAdapter = new ArrayAdapter(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

    作者:cuiran 发表于2015/1/16 21:33:23 原文链接
    阅读:1284 评论:0 查看评论


沪ICP备19023445号-2号
友情链接