2013-02-16 2 views
0

У меня есть этот исходный код, и он должен прочитать тег nfc NDEF. За исключением случаев, когда тег сканируется, он ничего не делает. Есть идеи ?Простая ошибка чтения исходного кода приложения NFC для Android. Он не будет читать теги nfc?

Код компилируется и ошибок нет.

Не работает функция защищенная пустота onNewIntent (намерение намерения).

package com.tapwise.nfcreadtag; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.PendingIntent; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.nfc.NdefMessage; 
import android.nfc.NfcAdapter; 
import android.os.Bundle; 
import android.os.Parcelable; 
import android.os.PatternMatcher; 
import android.provider.Settings; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

    public class MainActivity extends Activity { 
    private static final String TAG = "NFCReadTag"; 
    private NfcAdapter mNfcAdapter; 
    private IntentFilter[] mNdefExchangeFilters; 
    private PendingIntent mNfcPendingIntent; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

    mNfcAdapter = NfcAdapter.getDefaultAdapter(this); 

    mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, 
       getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP 
       | Intent.FLAG_ACTIVITY_CLEAR_TOP), 0); 


    IntentFilter smartwhere = new IntentFilter (NfcAdapter.ACTION_NDEF_DISCOVERED); 
     smartwhere.addDataScheme("http"); 
     smartwhere.addDataAuthority("www.smartwhere.com", null); 
     smartwhere.addDataPath(".*", PatternMatcher.PATTERN_SIMPLE_GLOB); 

     mNdefExchangeFilters = new IntentFilter[] { smartwhere }; 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if(mNfcAdapter != null) { 
      mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, 
       mNdefExchangeFilters, null); 
      if (!mNfcAdapter.isEnabled()){ 

       LayoutInflater inflater = getLayoutInflater(); 
       View dialoglayout = inflater.inflate(R.layout.nfc_settings_layout,(ViewGroup) findViewById(R.id.nfc_settings_layout)); 
       new AlertDialog.Builder(this).setView(dialoglayout) 
         .setPositiveButton("Update Settings", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface arg0, int arg1) { 
           Intent setnfc = new Intent(Settings.ACTION_WIRELESS_SETTINGS); 
           startActivity(setnfc); 
          } 
         }) 
         .setOnCancelListener(new DialogInterface.OnCancelListener() { 

          public void onCancel(DialogInterface dialog) { 
           finish(); // exit application if user cancels 
          }       
         }).create().show(); 

      } 
     } else { 
      Toast.makeText(getApplicationContext(), "Sorry, No NFC Adapter found.", Toast.LENGTH_SHORT).show(); 
     } 


    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if(mNfcAdapter != null) mNfcAdapter.disableForegroundDispatch(this); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent);  
     if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { 
      NdefMessage[] messages = null; 
      Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
      if (rawMsgs != null) { 
       messages = new NdefMessage[rawMsgs.length]; 
       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 = 1; b<payload.length; b++) { // skip SOH 
        result += (char) payload[b]; 
       } 
       Toast.makeText(getApplicationContext(), "Tag Contains " + result, Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 
+0

Как работает код с более общим фильтром (smartwhere)? – ThomasRS

+0

Имеет ли ваш тег URL-адрес формы http: //www.smartwhere.com/*? –

+0

Открывается ли ваше приложение при попытке сканирования? Если это так, удалите 3 строки, где вы устанавливаете свойства на «IntentFilter smartwhere». Если он не открыт, это не сработает, и вы должны указать, что вы делаете в файле манифеста вашего приложения. – Daneo

ответ

-1

Если вы используете Nexus 4, устройство не может прочитать классический тег MIFARE.

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). – Micha

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