Android 无法通过NFC发送NDEF消息

Android 无法通过NFC发送NDEF消息,android,nfc,Android,Nfc,我想通过NFC从2台android设备发送/接收消息。但这对我不起作用 似乎当我靠近两部手机时,createNdefMessage不会被呼叫,信息也不会被传输。 当发送/接收两个设备屏幕都打开时。 应用程序正在运行&甚至我触摸了设备的屏幕 我尝试了很多方法来解决这个问题,但是没有结果! 我在哪里犯了错误 公共类NFCActivity扩展了AppCompativity 实现NfcAdapter.OnNdefPushCompleteCallback, NfcAdapter.Create

我想通过NFC从2台android设备发送/接收消息。但这对我不起作用

似乎当我靠近两部手机时,createNdefMessage不会被呼叫,信息也不会被传输。 当发送/接收两个设备屏幕都打开时。 应用程序正在运行&甚至我触摸了设备的屏幕

我尝试了很多方法来解决这个问题,但是没有结果! 我在哪里犯了错误






公共类NFCActivity扩展了AppCompativity
实现NfcAdapter.OnNdefPushCompleteCallback,
NfcAdapter.CreateNdefMessageCallback{
专用NfcAdapter mNfcAdapter;
private ArrayList messagesToSendArray=new ArrayList();
private ArrayList messagesReceivedArray=new ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u nfc);
mNfcAdapter=NfcAdapter.getDefaultAdapter(此);
if(mNfcAdapter!=null&&mNfcAdapter.isEnabled()){
mNfcAdapter.setNdefPushMessageCallback(this,this);
mNfcAdapter.setOnNdefPushCompleteCallback(this,this);
}否则{
Toast.makeText(此“NFC在此设备上不可用”,
吐司。长度(短)。show();
}
}
公共void addMessage(视图){
字符串newMessage=txtBoxAddMessage.getText().toString();
messagestosendary.add(newMessage);
txtBoxAddMessage.setText(null);
updateTextViews();
}
@凌驾
公共NdefMessage createNdefMessage(NfcEvent事件){
if(messagesToSendArray.size()==0)
返回null;
NdefRecord[]recordsToAttach=createRecords();
返回新的NdefMessage(recordsToAttach);
}
公共NdefRecord[]创建记录(){
NdefRecord[]记录=新的NdefRecord[messagesToSendArray.size()+1];
if(Build.VERSION.SDK\u INT
<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());
    }
}