NFC意图 -> 从标签获取信息

3
我在 NFC 和意图方面遇到了困难,我可以发现标签,但是如何从中读取信息呢?
根据代码显示:我得到了“使用意图发现的标签:Intent {act= android.nfc.action TECH_DISCOVERED flg=0x13400000 cmp=com.example.android.apid/.nfc. Techfilter(has extra)}”。
我想从标签中获取信息,我应该解析字节等吗?
最好的问候, h.
/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */

package com.example.android.apis.nfc;

import java.util.List;

import com.example.android.apis.R;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.NfcF;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;


/**
 * An example of how to use the NFC foreground dispatch APIs. This will intercept any MIME data
 * based NDEF dispatch as well as all dispatched for NfcF tags.
 */
public class ForegroundDispatch extends Activity {
    //StringBuilder detailsRead = new StringBuilder();
    private NfcAdapter mAdapter;
    private PendingIntent mPendingIntent;
    private IntentFilter[] mFilters;
    private String[][] mTechLists;
    private TextView mText;
    private int mCount = 0;
    static final String TAG = "TagReadActivity";


    @Override
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);

        setContentView(R.layout.foreground_dispatch);
        mText = (TextView) findViewById(R.id.text);
        //resolveIntent(getIntent());
        mText.setText("Scan a tag");

        mAdapter = NfcAdapter.getDefaultAdapter(this);

        // Create a generic PendingIntent that will be deliver to this activity. The NFC stack
        // will fill in the intent with the details of the discovered tag before delivering to
        // this activity.
        mPendingIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        // Setup an intent filter for all MIME based dispatches
        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
        try {
            ndef.addDataType("*/*");
        } catch (MalformedMimeTypeException e) {
            throw new RuntimeException("fail", e);
        }
        mFilters = new IntentFilter[] {
                ndef,
        };

        // Setup a tech list for all NfcF tags
        mTechLists = new String[][] { new String[] { NfcF.class.getName() } };
    }
/**
    void resolveIntent(Intent intent) {
        // TODO Auto-generated method stub
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
            // When a tag is discovered we send it to the service to be save. We
            // include a PendingIntent for the service to call back onto. This
            // will cause this activity to be restarted with onNewIntent(). At
            // that time we read it from the database and view it.
            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
            NdefMessage[] msgs;
            if (rawMsgs != null) {
                msgs = new NdefMessage[rawMsgs.length];
                for (int i = 0; i < rawMsgs.length; i++) {
                    msgs[i] = (NdefMessage) rawMsgs[i];
                }
            } else {
                // Unknown tag type
                byte[] empty = new byte[] {};
                NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
                NdefMessage msg = new NdefMessage(new NdefRecord[] {record});
                msgs = new NdefMessage[] {msg};
            }
            // Setup the views
        } else {
            Log.e(TAG, "Unknown intent " + intent);
            mText.setText("My thing going on " + ++mCount + " with intent: " + action);
            finish();
            return;
        }
    }
    **/

    @Override
    public void onResume() {
        super.onResume();
        mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
    }
    @Override
    public void onNewIntent(Intent intent) {
        Log.i("Foreground dispatch", "Discovered tag with intent: " + intent);
        mText.setText("Discovered tag " + ++mCount + " with intent: " + intent);

    }
    @Override
    public void onPause() {
        super.onPause();
        mAdapter.disableForegroundDispatch(this);
    }
}
3个回答

1

我创建了一个Android 实用项目,可以将NDEF消息解析为更高级别的对象。同一网站还包括抽象活动模板(和演示),可执行您要执行的操作(即在前台模式下)。

我还创建了一个图形化NDEF编辑器,您可能会感兴趣。

编辑:链接代码已经得到大幅改进。


1

你应该首先调用 resolveIntent 方法。 你触发一个需要解决的意图。 解决它包含通过在意图上调用 getParcelableExtra() 方法来获取标签数据。 这将给你一个可分配给标签的可分发对象。

如果您需要代码,请在此处发布评论。


0

一旦获取标签,获取技术列表,然后根据技术调用技术的标记方法。 如果您从标签中选择了适当的技术,则此值不应为空。 一旦获取技术,就可以轻松地从提供的技术类中获取消息。 在接收到消息后,解析消息以获取记录。 干杯, AA


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接