2015-12-16 3 views
1

Я работаю с чтения ЦНК Msg и отчетыКак читать NDEF Msg и записи тега NFC?

Здесь я сделал с чтением ID с помощью этого

public class MainActivity extends Activity { 

// list of NFC technologies detected: 
private final String[][] techList = new String[][] { 
     new String[] { 
      NfcA.class.getName(), 
      NfcB.class.getName(), 
      NfcF.class.getName(), 
      NfcV.class.getName(), 
      IsoDep.class.getName(), 
      MifareClassic.class.getName(), 
      MifareUltralight.class.getName(), Ndef.class.getName() 
     } 
}; 

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

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

@Override 
protected void onResume() { 
    super.onResume(); 
    // creating pending intent: 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
    // creating intent receiver for NFC events: 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(NfcAdapter.ACTION_TAG_DISCOVERED); 
    filter.addAction(NfcAdapter.ACTION_NDEF_DISCOVERED); 
    filter.addAction(NfcAdapter.ACTION_TECH_DISCOVERED); 
    // enabling foreground dispatch for getting intent from NFC event: 
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
    nfcAdapter.enableForegroundDispatch(this, pendingIntent, new IntentFilter[]{filter}, this.techList); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    // disabling foreground dispatch: 
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
    nfcAdapter.disableForegroundDispatch(this); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED) || intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED) || intent.getAction().equals(NfcAdapter.ACTION_TECH_DISCOVERED)) { 
     ((TextView)findViewById(R.id.text)).setText(
       "NFC Tag\n" + 
       ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID))); 
    } 
} 

private String ByteArrayToHexString(byte [] inarray) { 
    int i, j, in; 
    String [] hex = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; 
    String out= ""; 

    for(j = 0 ; j < inarray.length ; ++j) 
     { 
     in = (int) inarray[j] & 0xff; 
     i = (in >> 4) & 0x0f; 
     out += hex[i]; 
     i = in & 0x0f; 
     out += hex[i]; 
     } 
    return out; 
    } 
} 

Здесь Чтение тегов ID, который Record [0]

аналогичным образом Я хочу читать ЦНК Сообщ и отчеты как в одной и той же программе и таким же образом ... у нас есть много способов

Здесь я попытался с

if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) { 
      Ndef ndef = Ndef.get(tag); 
      if (ndef == null) { 
       // NDEF is not supported by this Tag. 
       return; 
      } 
      NdefMessage ndefMessage = ndef.getCachedNdefMessage(); 

      NdefRecord[] records = ndefMessage.getRecords(); 
      for (NdefRecord ndefRecord : records) { 
       //read each record 
      } 

но я не могу читать отчеты .. может любой предложить мне читать ЦНК Сообщ и записи в моем коде ....

Update

Я добавил это в манифесте. .

<intent-filter> 
     <action android:name="android.intent.action.MAIN"/> 
     <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 
    *<intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
     <data android:mimeType="text/plain" /> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter>* 
    <intent-filter> 
     <action android:name="android.nfc.action.TAG_DISCOVERED"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
    <meta-data 
      android:name="android.nfc.action.TAG_DISCOVERED" 
      android:resource="@xml/nfc_tech_filter" /> 

Но все же мне нужно идти с NfcAdapter.EXTRA_NDEF_MESSAGES может любой сказать мне, как использовать его в моем коде с вне осуществления или изменения NfcAdapter.EXTRA_ID.

+0

Имеет ли ваш тэг сообщение NDEF, которое можно было бы читать с помощью abo ve code? Является ли ваш тег тегом форума NFC (т. Е. Тегом, который может содержать сообщение NDEF)? –

+0

Да, я установил почти 4 записи в теге NFC, и я могу прочитать их приложения для чтения NFC, доступные в PlayStore. Я думаю, что мне нужно использовать 'NfcAdapter.EXTRA_NDEF_MESSAGES' или что-то еще, может ли кто-нибудь сказать мне, как использовать в моем коде –

ответ

1
  1. Добавить журнал, чтобы узнать, что произойдет.
  2. Получить NDEFMessage из тега Intent
  3. Вашей функции для преобразования ByteArray в Hex строку не лучший

И, пожалуйста, прочитайте официальную документацию, все, что вам нужно, это объясняет: http://developer.android.com/guide/topics/connectivity/nfc/nfc.html#obtain-info

В вашей деятельности , method onNewIntent:

@Override 
protected void onNewIntent(Intent intent) { 
    Log.d(TAG, "onNewIntent action=" + intent.getAction()); 
    if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED) || intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED) || intent.getAction().equals(NfcAdapter.ACTION_TECH_DISCOVERED)) { 

     ((TextView)findViewById(R.id.text)).setText(
       "NFC Tag\n" + 
       byteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID))); 
    } 
    if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) { 
     Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
     if (rawMsgs != null) { 
      for (int i = 0; i < rawMsgs.length; i++) { 
       NdefMessage ndefMessage = (NdefMessage) rawMsgs[i]; 
       NdefRecord[] records = ndefMessage.getRecords(); 
       for (NdefRecord ndefRecord : records) { 
        //read each record 
       } 
      } 
     } 
    } 
} 

/** 
* convert byte array to a hexadecimal string 
* 
* @param bArray 
*   byte array to convert 
* @return hexadecimal string 
*/ 
public static String byteArrayToHexString(byte[] bArray) { 
    StringBuffer buffer = new StringBuffer(); 

    for (byte b : bArray) { 
     buffer.append(byteToHexString(b)); 
     buffer.append(" "); 
    } 

    return buffer.toString().toUpperCase(Locale.getDefault()); 
} 

/** 
* convert byte to a hexadecimal string 
* 
* @param b 
*   byte to convert 
* @return hexadecimal string 
*/ 
public static String byteToHexString(byte b) { 

    int tmp = b & 0xFF; 

    if (tmp <= 15) { 
     return "0".concat(Integer.toHexString(tmp)); 
    } else { 
     return Integer.toHexString(tmp); 
    } 

} 
+0

Сэр может я знаю, где нет, для msg для Id его нормально ... но для вывода i wan to используйте набор текста ... Здесь я использую все теги nfc-тегов, поэтому он должен требовать все, как ndef, techdiscovered, tag discoverd ... –

+0

Извините, я не понимаю вашего комментария – LaurentY

+0

Спасибо большое за ваш ответ. записи ... –

Смежные вопросы