接收意图动作MAIN而不是NDEF消息

时间:2017-08-07 21:58:27

标签: android nfc ndef android-beam android-applicationrecord

我正在使用NFC开发应用程序。我正在使用一个示例,其中发送和接收数据由同一个Activity承载。现在我需要将发送移动到另一个,由于某种原因,接收不再起作用。

这是我的主要内容:

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

<uses-feature
    android:name="android.hardware.nfc"
    android:required="true" />
    <activity
        android:name=".Screens.LogIn.LogInActivity"
        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>

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

接收活动:

public class LogInActivity extends AppCompatActivity {

public static final String TAG = LogInActivity.class.getSimpleName();

private String messagesToReceive= null;

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

    if (getIntent().getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
        handleNfcIntent(getIntent());
    }
}

private void replaceFragment() {
    android.support.v4.app.FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
    LogInFragment fragment = new LogInFragment();
    ft.replace(R.id.fragmentFrame, fragment, LogInFragment.TAG);
    ft.commit();
}

@Override
public void onResume() {
    super.onResume();
    handleNfcIntent(getIntent());
}

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


private void handleNfcIntent(Intent NfcIntent) {

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

        if(receivedArray != null) {
            NdefMessage receivedMessage = (NdefMessage) receivedArray[0];
            NdefRecord[] attachedRecords = receivedMessage.getRecords();

            for (NdefRecord record:attachedRecords) {
                String string = new String(record.getPayload());
                if (string.equals(getPackageName())) { continue; }
                messagesToReceive = string;
            }
            Toast.makeText(this, "Received " +
                    " Messages", Toast.LENGTH_LONG).show();
        }
        else {
            Toast.makeText(this, "Received Blank Parcel", Toast.LENGTH_LONG).show();
        }
    }
}

问题是NfcIntent.getAction()总是等于android.intent.action.MAIN,即使我使用NFC发送数据时应用程序也会打开。如您所见,清单中有动作NDEF_DISCOVERED

这是我发送的内容:

public NdefRecord[] createRecords() {
    NdefRecord[] records = new NdefRecord[2];
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
        byte[] payload = messagesToSend.
                getBytes(Charset.forName("UTF-8"));
        NdefRecord record = new NdefRecord(
                NdefRecord.TNF_WELL_KNOWN,      //Our 3-bit Type name format
                NdefRecord.RTD_TEXT,            //Description of our payload
                new byte[0],                    //The optional id for our Record
                payload);                       //Our payload for the Record

        records[0] = record;
    }
    else {
        byte[] payload = messagesToSend.//messagesToSendArray.get(i).
                getBytes(Charset.forName("UTF-8"));

        NdefRecord record = NdefRecord.createMime("text/plain",payload);
        records[0] = record;
    }
    records[1] = NdefRecord.createApplicationRecord(getActivity().getPackageName());
    return records;
}


@Override
public NdefMessage createNdefMessage(NfcEvent event) {
    if (messagesToSend != null && !messagesToSend.equals("")) {
        return null;
    }
    NdefRecord[] recordsToAttach = createRecords();
    return new NdefMessage(recordsToAttach);
}

0 个答案:

没有答案