Невозможно отправить сообщения NDEF через NFC - PullRequest
0 голосов
/ 24 октября 2018

Я хочу отправлять / получать сообщения от 2 Android-устройства через NFC.но это не работает для меня.

кажется, когда я подхожу к двум мобильным телефонам createNdefMessage не вызывается и сообщения не передаются.при отправке / получении экран обоих устройств включен.приложение работает, и даже я касаюсь экрана устройства!

Я пытаюсь исправить это, но у меня ничего не получилось!Где я допустил ошибки?


<uses-permission android:name="android.permission.NFC" />

<uses-feature
    android:name="android.hardware.nfc"
    android:required="true" />

 <activity android:name=".NFCActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>

public class NFCActivity extends AppCompatActivity
        implements NfcAdapter.OnNdefPushCompleteCallback,
        NfcAdapter.CreateNdefMessageCallback {


    private NfcAdapter mNfcAdapter;

    private ArrayList<String> messagesToSendArray = new ArrayList<>();
    private ArrayList<String> messagesReceivedArray = new ArrayList<>();


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

        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        if (mNfcAdapter != null && mNfcAdapter.isEnabled()) {
            mNfcAdapter.setNdefPushMessageCallback(this, this);

            mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
        } else {
            Toast.makeText(this, "NFC not available on this device",
                    Toast.LENGTH_SHORT).show();
        }
    }


    public void addMessage(View view) {
        String newMessage = txtBoxAddMessage.getText().toString();
        messagesToSendArray.add(newMessage);
        txtBoxAddMessage.setText(null);
        updateTextViews();
    }


    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        if (messagesToSendArray.size() == 0) 
            return null;

        NdefRecord[] recordsToAttach = createRecords();
        return new NdefMessage(recordsToAttach);
    }


    public NdefRecord[] createRecords() {
        NdefRecord[] records = new NdefRecord[messagesToSendArray.size() + 1];
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            for (int i = 0; i < messagesToSendArray.size(); i++) {
                byte[] payload = messagesToSendArray.get(i).getBytes(Charset.forName("UTF-8"));
                NdefRecord record = new NdefRecord(
                        NdefRecord.TNF_WELL_KNOWN,      
                        "http://developer.android.com/index.html".getBytes(Charset.forName("UTF-8")),            
                        new byte[0],                    
                        payload);                    

                records[i] = record;
            }
        } else {
            for (int i = 0; i < messagesToSendArray.size(); i++) {
                byte[] payload = messagesToSendArray.get(i).
                        getBytes(Charset.forName("UTF-8"));

                NdefRecord record = NdefRecord.createMime("application/vnd.com.example.android.beam", payload);
                records[i] = record;
            }
        }
        records[messagesToSendArray.size()] = NdefRecord.createApplicationRecord(getPackageName());

        return records;
    }


    @Override
    public void onNdefPushComplete(NfcEvent event) {
        messagesToSendArray.clear();
    }

    private void handleNfcIntent(Intent intent) {

        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
            Parcelable[] receivedArray = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

            if (receivedArray != null) {

                updateTextViews();
            } else {
                Log.i(TAG, "Received Blank Parcel");
            }
        }
    }

    @Override
    public void onNewIntent(Intent intent) {
        setIntent(intent);
        handleNfcIntent(intent);
    }

    @Override
    public void onResume() {
        super.onResume();

        updateTextViews();
        handleNfcIntent(getIntent());
    }
}
...