2014-10-28 2 views
0

я правильно настроить NFC среды:Как правильно прочитать НФК тег

  • технический фильтр

    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> 
        <tech-list> 
         <tech>android.nfc.tech.NfcA</tech> 
         <tech>android.nfc.tech.NdefFormatable</tech> 
        </tech-list> 
    </resources> 
    
  • в проявленном

    <uses-permission android:name="android.permission.NFC" /> 
    
    <uses-feature android:name="android.hardware.nfc" /> 
    
    <activity android:name=".ui.ScanActivity"> 
    
         <intent-filter> 
          <action android:name="android.nfc.action.TECH_DISCOVERED" /> 
          <category android:name="android.intent.category.DEFAULT" /> 
         </intent-filter> 
    
         <meta-data 
          android:name="android.nfc.action.TECH_DISCOVERED" 
          android:resource="@xml/nfc_tech_filter" /> 
    </activity> 
    
  • кода (активность, некоторое время после его создания путем чтения тега nfc)

    Intent intent = getIntent(); 
    
    if (intent != null) { 
        String action = intent.getAction(); 
         if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { 
          Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
    

Вот так, rawMsgs всегда пустой, хотя у меня есть приложение на моем телефоне, который читает тот же тег отлично, показывая данные в теге. Где я ошибаюсь?

+1

Есть ли в вашем теге сообщение NDEF? Если 'EXTRA_NDEF_MESSAGES' имеет значение NULL, это обычно означает, что в теге нет сообщения NDEF. –

+0

И ваш технический фильтр содержит android.nfc.tech.Ndef или пуст? – ThomasRS

+0

Отредактированный вопрос. Оказалось, что мой тег не содержит NDEF, но у меня также есть еще один тег, который я не могу разобрать, и который определенно содержит сообщения, потому что другое приложение читает его и показывает некоторые данные из него. – Eugene

ответ

0

Попробуйте добавить в свой манифест фильтры намерений для NDEF_DISCOVERED и TAG_DISCOVERED. И android.nfc.tech.Ndef в вашем технологическом фильтре.

2

Существуют различные типы тегов nfc (например, Mifare Ultralight, Mifare Ultralight C, Mifare Classic, felica ...). Каждый тег имеет разные размеры и порядок чтения. Например: Mifare Ultralight имеет 64 байта, но mifare Classic 1k содержит 1 килобайт памяти. Для чтения данных из сверхмалого mifare не требуется дополнительной проверки подлинности, но Mifare classic требует аутентификации. Когда вы получите Новый Intent Вы можете разобрать его, чтобы получить тег информацию: Прежде всего вы должны инициализировать адаптер NFC и определить ожидание Intent в OnCreate обратного вызова:

NfcAdapter mAdapter; 
PendingIntent mPendingIntent; 
mAdapter = NfcAdapter.getDefaultAdapter(this);  

    if (mAdapter == null) { 
     //nfc not support your device. 
     return; 
    } 
    mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, 
      getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

В onResume() Перезвоните включить передний план Отправку для обнаружения намерений NFC.

mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); 

В OnPause() обратного вызова вы должны отключить отправку forground:

if (mAdapter != null) { 
    mAdapter.disableForegroundDispatch(this); 
} 

В onNewIntent() обратный вызов метода вы получите новый Nfc Intent. После получения The Intent вам необходимо проанализировать намерение обнаружить карту:

@Override 
protected void onNewIntent(Intent intent){  
    getTagInfo(intent) 
    } 

private void getTagInfo(Intent intent) { 
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    } 

У вас есть тег. Чтобы узнать тип точного тега Вот my Answer И полный проект находится в my Github Repo

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