0

Peter Smithという名前と123456という番号の2つのテキストフィールドを持つAndroidアプリがあります。これをNFC経由で送信したいです。ここでの私の問題は、名前だけを取得し、番号を取得しないことです。よろしければ、私のコードを見ていただければ幸いです。おそらく、私には見当たらない小さな間違いを犯したのでしょう。

public class MainActivity extends Activity implements CreateNdefMessageCallback,
        OnNdefPushCompleteCallback {
    NfcAdapter mNfcAdapter;
    TextView beamMsg;
    TextView beamMsg2;
    private static final int MESSAGE_SENT = 1;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        beamMsg = (TextView) findViewById(R.id.msg);
        beamMsg2 = (TextView) findViewById(R.id.msg_ID);
        beamMsg.setText("Peter Smith");
        beamMsg2.setText("123456");

        // Check for available NFC Adapter
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        if (mNfcAdapter == null) {
            beamMsg = (TextView) findViewById(R.id.msg);
            beamMsg2= (TextView) findViewById(R.id.msg_ID);

            beamMsg.setText("NFC is not available on this device.");
            beamMsg2.setText("NFC is not available on this device.");
        } else {
            // Register callback to set NDEF message
            mNfcAdapter.setNdefPushMessageCallback(this, this);
            // Register callback to listen for message-sent success
            mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
        }
    }

    public void submitClicked(View v)
    {
        Toast toast = Toast.makeText(getApplicationContext(), R.string.info,
                Toast.LENGTH_LONG);
        toast.show();
    }
    /**
     * Implementation for the CreateNdefMessageCallback interface
     */
    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        NdefMessage msg = new NdefMessage(NdefRecord.createMime(
                beamMsg.getText()  .toString(), null));

        return msg;

    }

    public NdefMessage createNdefMessage_two(NfcEvent event) {
        NdefMessage msg2 = new NdefMessage(NdefRecord.createMime(
                beamMsg2.getText()  .toString(), null));

        return msg2;

    }




    /**
     * Implementation for the OnNdefPushCompleteCallback interface
     */
    @Override
    public void onNdefPushComplete(NfcEvent arg0) {
        // A handler is needed to send messages to the activity when this
        // callback occurs, because it happens from a binder thread
        mHandler.obtainMessage(MESSAGE_SENT).sendToTarget();
    }

    /** This handler receives a message from onNdefPushComplete */
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MESSAGE_SENT:
                Toast.makeText(getApplicationContext(), "Message sent!", Toast.LENGTH_LONG).show();
                break;
            }
        }
    };

    @Override
    public void onResume() {
        super.onResume();
        // Check to see that the Activity started due to an Android Beam
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
            processIntent(getIntent());
        }
    }

    @Override
    public void onNewIntent(Intent intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent);
    }

    /**
     * Parses the NDEF Message from the intent and prints to the TextView
     */
    void processIntent(Intent intent) {
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                NfcAdapter.EXTRA_NDEF_MESSAGES);
        // only one message sent during the beam
        NdefMessage msg = (NdefMessage) rawMsgs[0];
        NdefMessage msg2 = (NdefMessage) rawMsgs[0];
        // record 0 contains the MIME type, record 1 is the AAR, if present
        beamMsg.setText(new String(msg.getRecords()[0].getPayload()));
        beamMsg2.setText(new String(msg.getRecords()[1].getPayload()));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // If NFC is not available, we won't be needing this menu
        if (mNfcAdapter == null) {
            return super.onCreateOptionsMenu(menu);
        }
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_settings:
                Intent intent = new Intent(Settings.ACTION_NFCSHARING_SETTINGS);
                startActivity(intent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}
4

3 に答える 3

0

気にする人のために(質問が古いので)二重のcreateNdefMessageの代わりに

@Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        NdefMessage msg = new NdefMessage(NdefRecord.createMime(
                beamMsg.getText()  .toString(), null));

        return msg;

    }

    public NdefMessage createNdefMessage_two(NfcEvent event) {
        NdefMessage msg2 = new NdefMessage(NdefRecord.createMime(
                beamMsg2.getText()  .toString(), null));

        return msg2;

    }

単にこれを行う

@Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        NdefMessage msg = new NdefMessage(
              NdefRecord.createMime(beamMsg.getText().toString(), null), 
              NdefRecord.createMime(beamMsg2.getText().toString(), null)
        );

        return msg;

    }

これが誰かに役立つことを願っています

于 2015-07-27T14:12:04.113 に答える
0

createNdefMessage(...) メソッドで ndef メッセージに ndef レコードを 1 つだけ追加します。したがって、コードは 2 つのレコードを読み取りますが、送信されるレコードは 1 つだけです。

于 2013-02-14T15:15:41.050 に答える