Android NFC标签写入应用包名,感应到标签自动打开应用

首先在AndroidManifest.xml文件中添加如下配置

<!-- SDK版本至少为14 -->
<uses-sdk android:minSdkVersion="14"/>
<!-- 添加NFC权限 -->
<uses-permission android:name="android.permission.NFC" />
<!-- 要求当前设备必须要有NFC芯片 -->
<uses-feature android:name="android.hardware.nfc" android:required="true" />

创建一个NFC处理的基类

public class BaseNfcActivity extends AppCompatActivity {
    private NfcAdapter mNfcAdapter;
    private PendingIntent mPendingIntent;

    @Override
    protected void onStart() {
        super.onStart();
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        // 用于感应到NFC时启动该Activity
        // 这里建议将处理NFC的子类的launchMode设置成singleTop模式,这样感应到标签时就会回调onNewIntent,而不会重复打开页面
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);
    }
    /**
     * 获得焦点,按钮可以点击
     */
    @Override
    public void onResume() {
        super.onResume();
        // 设置当该页面处于前台时,NFC标签会直接交给该页面处理
        if (mNfcAdapter != null) {
            mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
        }
    }
    /**
     * 暂停Activity,界面获取焦点,按钮可以点击
     */
    @Override
    public void onPause() {
        super.onPause();
        // 当页面不可见时,NFC标签不交给当前页面处理
        if (mNfcAdapter != null) {
            mNfcAdapter.disableForegroundDispatch(this);
        }
    }
}

然后创建一个NFC写标的类,继承BaseNfcActivity

NFC主要相关类有NdefMessage、NdefRecord、Ndef、NdefFormatable,具体使用方法见如下代码及注释

public class MainActivity extends BaseNfcActivity{

    private String mPackageName = "com.android.mms"; // 短信APP包名
//    private String mPackageName = "com.tencent.mm"; // 微信APP包名

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // 将Activity的launchMode设置成singleTop,这样当感应到NFC标签时不会重复打开页面,而是回调该方法
    @Override
    public void onNewIntent(Intent intent) {
        Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        writeTag(detectedTag);
    }

    /**
     * 写标
     * @param tag
     */
    public void writeTag(Tag tag) {
        if (tag == null) {
            return;
        }

        // 利用应用包名创建待写入的数据
        NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
                .createApplicationRecord(mPackageName)});

//        NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord
//                .createUri(Uri.parse("http://www.baidu.com"))});

        // 获取内容字节大小
        int size = ndefMessage.toByteArray().length;
        try {
            // 获取Nedf
            Ndef ndef = Ndef.get(tag);
            // 不为空表示该标签为Nedf格式
            if (ndef != null) {
                ndef.connect();
                // 是否可写
                if (!ndef.isWritable()) {
                    Toast.makeText(this, "标签不支持写入", Toast.LENGTH_SHORT).show();
                    return;
                }
                // 判断写入内容大小是否超出允许写入的最大值
                if (ndef.getMaxSize() < size) {
                    Toast.makeText(this, "写入内容过大", Toast.LENGTH_SHORT).show();
                    return;
                }
                // 写入数据
                ndef.writeNdefMessage(ndefMessage);
                Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
            } else { // 标签非Nedf格式的情况
                NdefFormatable format = NdefFormatable.get(tag);
                // 不为空表示该标签允许格式化成Ndef格式
                if (format != null) {
                    format.connect();
                    // 格式化并写入Nedf内容
                    format.format(ndefMessage);
                    Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "标签不支持Nedf格式", Toast.LENGTH_SHORT).show();
                }
            }
        } catch (Exception e) {
        }
    }
}

最后记得把MainActivity的启动模式设置成singleTop

<activity
    android:name=".MainActivity"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

测试

  1. 首先准备一台支持NFC功能的手机,打开我们写好的应用
  2. 准备一张NFC标签,靠近手机NFC读取区域(一般在背部)
  3. 提示写入成功后,关闭应用
  4. 再次将NFC标签靠近手机,将会打开相应的应用(短信或者微信)

 

 

posted @ 2019-08-15 14:05  野猿新一  阅读(367)  评论(0编辑  收藏  举报