อ่านข้อความ NFC จากแท็กเมื่อผู้ใช้สแกน NFC

ฉันต้องเปิดแอปของฉันและอ่านข้อความ NFC ในเวลาเดียวกันเมื่อผู้ใช้สแกนแท็ก NFC..

ขณะนี้ฉันสามารถเปิดของฉันได้เมื่อผู้ใช้แตะหรือสแกน NFC แต่ฉันไม่สามารถอ่านข้อมูลใน NFC ได้ในเวลาเดียวกัน

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

@SuppressLint("NewApi") คลาสสาธารณะ MainActivity ขยายกิจกรรม {

public static final String TAG = "NfcDemo";
private TextView mTextView;
// private NfcAdapter mNfcAdapter;
protected PendingIntent nfcPendingIntent;
NfcAdapter nfcAdapter;
IntentFilter[] readTagFilters;
PendingIntent pendingIntent;
Tag detectedTag;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = (TextView) findViewById(R.id.textView1);
    nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    detectedTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
    pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    IntentFilter tagDetected = new IntentFilter(
            NfcAdapter.ACTION_TAG_DISCOVERED);
    IntentFilter filter2 = new IntentFilter(
            NfcAdapter.ACTION_NDEF_DISCOVERED);
    readTagFilters = new IntentFilter[] { tagDetected, filter2 };
    Log.d(TAG, "ok" + getIntent().getAction());


}

public void enableForegroundMode() {
    Log.d(TAG, "enableForegroundMode");
    IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); 
    Log.d("done ", "in " + tagDetected.getAction(0));
    IntentFilter[] writeTagFilters = new IntentFilter[] { tagDetected };

}
@Override
protected void onResume() {
    Log.d(TAG, "onResume");
    super.onResume();
    nfcAdapter.enableForegroundDispatch(this, pendingIntent,readTagFilters, null);
    Intent ndefDetected = new Intent(NfcAdapter.ACTION_TAG_DISCOVERED);
    Tag tag = ndefDetected.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    Parcelable[] rawMsgs = ndefDetected .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    if (rawMsgs != null) {
        Log.d(TAG, "onResume1");

    } else {
        Log.d(TAG, "onResume2");
    }
}
@Override
protected void onPause() {
    Log.d(TAG, "onPause");
    super.onPause();
    if (NfcAdapter.getDefaultAdapter(this) != null)
        NfcAdapter.getDefaultAdapter(this).disableForegroundDispatch(this);
}
@Override
protected void onNewIntent(Intent intent) {
    // TODO Auto-generated method stub
    setIntent(intent);
    Log.d(TAG, "NewIntent is ...." + intent.getAction() + "....."
            + NfcAdapter.ACTION_NDEF_DISCOVERED);
    getTagMsg(intent);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);

    return true;
}

public void getTagMsg(Intent intent) {
    Log.d(TAG, "getTagContent" + intent.getAction() + "....."
            + NfcAdapter.ACTION_NDEF_DISCOVERED);
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {

        Log.d(TAG, "New Intent/1");
        NdefMessage[] messages = null;
        Parcelable[] rawMsgs = intent
                .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMsgs != null) {
            messages = new NdefMessage[rawMsgs.length];
            Log.d(TAG, "New Intent/2:" + messages);
            for (int i = 0; i < rawMsgs.length; i++) {
                messages[i] = (NdefMessage) rawMsgs[i];
            }
        }
        if (messages[0] != null) {
            String result = "";
            byte[] payload = messages[0].getRecords()[0].getPayload();
            // this assumes that we get back am SOH followed by host/code
            for (int b = 0; b < payload.length; b++) { // skip SOH
                result += (char) payload[b];
            }
            Log.d(TAG, "New Intent/3:" + result);
            Toast.makeText(getApplicationContext(),
                    "Tag Contains " + result, Toast.LENGTH_SHORT).show();
        }
    }

}

}


person user2495758    schedule 09.09.2013    source แหล่งที่มา


คำตอบ (1)


คุณไม่ได้ทำอะไรจริงๆ เมื่อกิจกรรมของคุณเริ่มต้นขึ้น คุณควรเรียก getTagMsg บนแท็กที่คุณคว้ามาจาก Intent ใน onCreate ของกิจกรรมของคุณ เมื่อถึงจุดสิ้นสุดของวิธีการ เพียงโทร getTagMsg(detectedTag)

คุณน่าจะมีวิธีช่วยเหลือที่เริ่มต้นจาก Intent หยิบ parceable พิเศษ และอ่านเนื้อหาของแท็กจากนั้น จากนั้นคุณสามารถใช้วิธีนี้ทั้งใน onCreate และ onNewIntent

person Ameen    schedule 11.09.2013
comment
ขอบคุณสำหรับข้อเสนอแนะของคุณ แต่เมื่อฉันใช้โค้ดด้านล่างใน oncreate ฉันได้รับค่าว่าง .why คืออะไร ?,ตรวจพบTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG); Log.d(แท็กที่ตรวจพบ, +detectedTag); - person user2495758; 12.09.2013
comment
กิจกรรมของคุณอาจเริ่มต้นโดยใช้ Intent ประเภทต่างๆ อาจเป็น เป็น NFC และอาจเป็นเจตนาปกติที่จะเริ่มกิจกรรมของคุณ คุณควรตรวจสอบการกระทำของ Intent ก่อนที่จะพยายามคว้าแท็ก ดูวิธีการ onNewIntent ในโพสต์บนบล็อกของฉัน และเพิ่มการตรวจสอบที่คุณเห็นในนั้นสำหรับการดำเนินการของ Intent . - person Ameen; 12.09.2013
comment
ในกรณีของคุณ คุณต้องการ ACTION_TAG_DISCOVERED และ ACTION_NDEF_DISCOVERED - person Ameen; 12.09.2013
comment
ความตั้งใจของฉันคือการเริ่มแอป Android เมื่อฉันสแกนแท็ก nfc และรับข้อมูลแท็ก (ขอแจ้งให้ทราบ: ฉันไม่ได้เปิดแอปก่อนสแกน) - person user2495758; 13.09.2013
comment
เมื่อฉันพยายามรับการกระทำของเจตนา oncreate ฉันมักจะได้รับ android.intent.action.MAIN แทนที่จะเป็น android.nfc.action.NDEF_DISCOVERED เมื่อฉันสแกนแท็ก - person user2495758; 13.09.2013
comment
เอาล่ะ คุณได้รวม Intent ที่คุณต้องการไว้ในไฟล์ AndroidManifest.xml แล้วใช่ไหม คุณมีตัวกรองตามที่กำหนดไว้ที่นี่หรือไม่ - person Ameen; 13.09.2013
comment
ใช่ ฉันมีตัวกรองเจตนาตามที่กำหนดไว้ในเอกสารนั้น ..‹intent-filter› ‹action android:name=android.nfc.action.NDEF_DISCOVERED/› ‹category android:name=android.intent.category.DEFAULT/› ‹ ข้อมูล android:mimeType=text/plain /› ‹/intent-filter› - person user2495758; 19.09.2013