• 10、NFC技术:读写NFC标签中的文本数据


    代码实现过程如下:

    读写NFC标签的纯文本数据.java

      1  import java.nio.charset.Charset;
      2 import java.util.Locale;
      3 
      4 import android.app.Activity;
      5 import android.content.Intent;
      6 import android.nfc.NdefMessage;
      7 import android.nfc.NdefRecord;
      8 import android.nfc.NfcAdapter;
      9 import android.nfc.Tag;
     10 import android.nfc.tech.Ndef;
     11 import android.os.Bundle;
     12 import android.view.View;
     13 import android.widget.TextView;
     14 
     15 /**
     16  * 主 Activity
     17  * 读写NFC标签的纯文本数据
     18  * @author dr
     19  * 
     20  */
     21 public class ReadWriteTextMainActivity extends Activity {
     22     private TextView mInputText;
     23     private String mText;
     24 
     25     @Override
     26     protected void onCreate(Bundle savedInstanceState) {
     27         // TODO Auto-generated method stub
     28         super.onCreate(savedInstanceState);
     29         setContentView(R.layout.activity_read_write_text_main);
     30 
     31         mInputText = (TextView) findViewById(R.id.textview_input_text);
     32     }
     33 
     34     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     35         if (requestCode == 1 && resultCode == 1) {
     36             mText = data.getStringExtra("text");
     37             mInputText.setText(mText);
     38         }
     39     }
     40 
     41     public void onNewIntent(Intent intent) {
     42         // read nfc text
     43         if (mText == null) {
     44             // 显示NFC标签内容
     45             Intent myIntent = new Intent(this, ShowNFCTagContentActivity.class);
     46             myIntent.putExtras(intent);
     47             myIntent.setAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
     48             startActivity(myIntent);
     49 
     50         } else {  // write nfc text
     51             Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
     52             NdefMessage ndefMessage = new NdefMessage(
     53                     new NdefRecord[] { createTextRecord(mText) });
     54             writeTag(ndefMessage, tag);
     55         }
     56     }
     57     
     58     /**
     59      * 将纯文本转换成NdefRecord对象。
     60      * @param text
     61      * @return
     62      */
     63     public NdefRecord createTextRecord(String text) {
     64         // 得到生成语言编码字节数组
     65         byte[] langBytes = Locale.CHINA.getLanguage().getBytes(
     66                 Charset.forName("US-ASCII"));
     67         Charset utfEncoding = Charset.forName("UTF-8");
     68         byte[] textBytes = text.getBytes(utfEncoding);
     69         int utfBit = 0;
     70         // 状态字节
     71         char status = (char) (utfBit + langBytes.length);
     72 
     73         byte[] data = new byte[1 + langBytes.length + textBytes.length];
     74         data[0] = (byte) status;
     75         // 数组拷贝
     76         System.arraycopy(langBytes, 0, data, 1, langBytes.length);
     77         System.arraycopy(textBytes, 0, data, 1 + langBytes.length,
     78                 textBytes.length);
     79 
     80         NdefRecord ndefRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
     81                 NdefRecord.RTD_TEXT, new byte[0], data);
     82         return ndefRecord;
     83     }
     84 
     85     boolean writeTag(NdefMessage ndefMessage, Tag tag) {
     86         try {
     87             Ndef ndef = Ndef.get(tag);
     88             ndef.connect();
     89             ndef.writeNdefMessage(ndefMessage);
     90             return true;
     91         } catch (Exception e) {
     92             // TODO: handle exception
     93         }
     94         return false;
     95     }
     96 
     97     // 向NFC标签写入文本
     98     public void onClick_InputText(View view) {
     99         Intent intent = new Intent(this, InputTextActivity.class);
    100         startActivityForResult(intent, 1);
    101     }
    102 
    103 }

    读写NFC标签的纯文本数据.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical" >
     6 
     7     <Button
     8         android:layout_width="match_parent"
     9         android:layout_height="wrap_content"
    10         android:onClick="onClick_InputText"
    11         android:text="输入要写入文本" />
    12 
    13     <TextView
    14         android:id="@+id/textview_input_text"
    15         android:layout_width="match_parent"
    16         android:layout_height="wrap_content"
    17         android:textSize="16sp" />
    18 
    19     <TextView
    20 
    21         android:layout_width="match_parent"
    22         android:layout_height="wrap_content"
    23         android:layout_marginTop="30dp"
    24         android:text="请将NFC标签靠近手机背面读取或写入文本"
    25         android:textColor="#F00"
    26         android:textSize="16sp" />
    27 
    28     <ImageView
    29         android:layout_width="match_parent"
    30         android:layout_height="match_parent"
    31         android:src="@drawable/read_nfc_tag" />
    32 
    33 </LinearLayout>

    显示NFC标签内容.java

     1 import cn.eoe.read.write.text.library.TextRecord;
     2 import android.app.Activity;
     3 import android.nfc.NdefMessage;
     4 import android.nfc.NdefRecord;
     5 import android.nfc.NfcAdapter;
     6 import android.nfc.Tag;
     7 import android.nfc.tech.Ndef;
     8 import android.os.Bundle;
     9 import android.os.Parcelable;
    10 import android.widget.TextView;
    11 
    12 
    13 /**
    14  * 显示NFC标签内容
    15  * @author dr
    16  *
    17  */
    18 public class ShowNFCTagContentActivity extends Activity {
    19 
    20     private TextView mTagContent;
    21     private Tag mDetectedTag;   // 传递过来的NFC的一个TAG对象
    22     private String mTagText;
    23 
    24     @Override
    25     protected void onCreate(Bundle savedInstanceState) {
    26         // TODO Auto-generated method stub
    27         super.onCreate(savedInstanceState);
    28         setContentView(R.layout.activity_show_nfctag_content);
    29         mTagContent = (TextView) findViewById(R.id.textview_tag_content);
    30 
    31         mDetectedTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
    32 
    33         Ndef ndef = Ndef.get(mDetectedTag);
    34 
    35         mTagText = ndef.getType() + "
    max size:" + ndef.getMaxSize()
    36                 + "bytes
    
    ";
    37 
    38         readNFCTag();
    39 
    40         mTagContent.setText(mTagText);
    41     }
    42 
    43     /**
    44      * 
    45      */
    46     private void readNFCTag() {
    47         if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
    48             Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(
    49                     NfcAdapter.EXTRA_NDEF_MESSAGES);
    50             NdefMessage msgs[] = null;
    51             int contentSize = 0;
    52             if (rawMsgs != null) {
    53                 msgs = new NdefMessage[rawMsgs.length];
    54                 for (int i = 0; i < rawMsgs.length; i++) {
    55                     msgs[i] = (NdefMessage) rawMsgs[i];
    56                     contentSize += msgs[i].toByteArray().length;
    57                 }
    58             }
    59             try {
    60                 if (msgs != null) {
    61                     NdefRecord record = msgs[0].getRecords()[0];
    62                     TextRecord textRecord = TextRecord.parse(record);
    63                     mTagText += textRecord.getText() + "
    
    text
    "
    64                             + contentSize + " bytes";
    65                 }
    66             } catch (Exception e) {
    67                 // TODO: handle exception
    68             }
    69         }
    70     }
    71 }

    显示NFC标签内容.xml

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:layout_width="match_parent"
     3     android:layout_height="match_parent"
     4     android:orientation="vertical" >
     5 
     6     <TextView
     7         android:id="@+id/textview_tag_content"
     8         android:layout_width="match_parent"
     9         android:layout_height="wrap_content"
    10         android:textSize="16sp" android:layout_margin="6dp" />
    11 
    12 </LinearLayout>

    向NFC标签写入文本.java

     1 import android.app.Activity;
     2 import android.content.Intent;
     3 import android.os.Bundle;
     4 import android.view.View;
     5 import android.widget.EditText;
     6 
     7 /**
     8  * 向NFC标签写入文本
     9  * 
    10  * @author dr
    11  * 
    12  */
    13 public class InputTextActivity extends Activity {
    14 
    15     private EditText mTextTag;
    16 
    17     @Override
    18     protected void onCreate(Bundle savedInstanceState) {
    19         super.onCreate(savedInstanceState);
    20         setContentView(R.layout.activity_input_text);
    21         mTextTag = (EditText) findViewById(R.id.edittext_text_tag);
    22     }
    23 
    24     public void onClick_OK(View view) {
    25         Intent intent = new Intent();
    26         intent.putExtra("text", mTextTag.getText().toString());
    27         setResult(1, intent);
    28         finish();
    29 
    30     }
    31 }

    向NFC标签写入文本.xml

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical" >
     6 
     7     <TextView
     8         android:layout_width="match_parent"
     9         android:layout_height="wrap_content"
    10         
    11         android:text="请输入要写入的文本" android:textSize="16sp" />
    12 
    13     <EditText
    14         android:layout_marginTop="10dp"
    15         android:id="@+id/edittext_text_tag"
    16         android:layout_width="match_parent"
    17         android:layout_height="wrap_content" />
    18 
    19     <Button
    20         android:layout_width="match_parent"
    21         android:layout_height="wrap_content"    
    22         android:onClick="onClick_OK"
    23         android:text="确定" />
    24 
    25 </LinearLayout>
     1 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     2     package="cn.eoe.read.write.text"
     3     android:versionCode="1"
     4     android:versionName="1.0" >
     5 
     6     <uses-sdk
     7         android:minSdkVersion="15"
     8         android:targetSdkVersion="15" />
     9 
    10     <uses-permission android:name="android.permission.NFC" />
    11 
    12     <application
    13         android:icon="@drawable/ic_launcher"
    14         android:label="@string/app_name"
    15         android:theme="@style/AppTheme" >
    16         <activity
    17             android:name=".ReadWriteTextMainActivity"
    18             android:label="读写NFC标签的纯文本数据"
    19             android:launchMode="singleTask" >
    20             <intent-filter>
    21                 <action android:name="android.intent.action.MAIN" />
    22                 <category android:name="android.intent.category.LAUNCHER" />
    23             </intent-filter>
    24             <intent-filter>
    25                 <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    26                 <category android:name="android.intent.category.DEFAULT" />
    27                 <data android:mimeType="text/plain" />
    28             </intent-filter>
    29         </activity>
    30         <activity
    31             android:name=".ShowNFCTagContentActivity"
    32             android:label="显示NFC标签内容"
    33             android:launchMode="singleTask" />
    34 
    35         <activity
    36             android:name=".InputTextActivity"
    37             android:label="向NFC标签写入文本" />
    38 
    39     </application>
    40 
    41 </manifest>

     DEMO:下载地址:http://download.csdn.net/detail/androidsj/7678947

  • 相关阅读:
    爬虫的基本原理、requests模块、模拟登陆网站、爬取视频网站、cookie池和代理池、正向代理和反向代理
    git初识、
    签发token、校验token、多方式登录签发token的实现、自定义认证反爬规则的认证类、admin使用自定义User表:新增用户密码密文、群查接口各种筛选组件数据准备、drf搜索过滤组件、drf排序过滤组件、drf基础分页组件
    频率认证源码分析、自定义频率认证组件、JWT认证、drf-jwt插件
    auth组件的权限六表 自定义User的权限六表 六表之间的数据访问 三大认证整体源码分析 自定义认证类 系统权限类 自定义权限类
    视图类与序列化类传参、二次封装response类、视图家族、GenericAPIView视图基类、mixins视图6大工具类、generic中的工具视图、视图集、GenericAPIView 与 APIView 作为两大继承视图的区别、工具视图集、路由组件(了解)
    修改文件后缀
    python统计自己微信好友并抓取信息
    关于今日头条小程序(字节跳动小程序)相关问题
    关于飞鱼文档不详细无法拉取数据问题
  • 原文地址:https://www.cnblogs.com/androidsj/p/3856429.html
Copyright © 2020-2023  润新知