標籤:android nfc
最近在學習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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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}}@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);}}}
在此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 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();}}
當選擇應用後,會回調並傳回
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
NFC之讓Android自動運行程式