2012-09-24 124 views
2

嗨我想從NFC標籤讀取數據。 Tha數據讀取沒有問題。但我必須掃描我的標籤兩次才能顯示數據。當我掃描標籤時,它首次啓動應用程序,但不讀取數據。所以要讀取數據,我必須再次掃描我的標籤。那麼我該怎麼做才能讓我一掃描我的標籤就應該啓動應用程序並從標籤讀取數據。該應用程序是從標籤中讀取數據並更改我的android手機的配置文件。這裏是我的代碼.. 謝謝....自動從NFC標籤讀取數據

public class Read extends Activity { 

    Tag detectedTag; 
    TextView txtType,txtSize,txtWrite,txtRead; 
    Button btn_back; 
    NfcAdapter nfcAdapter; 
    IntentFilter[] readTagFilters; 
    PendingIntent pendingIntent; 
    byte[] new_payload; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
     setContentView(R.layout.read); 
     getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title); 

     nfcAdapter = NfcAdapter.getDefaultAdapter(); 
     detectedTag =getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     txtType = (TextView) findViewById(R.id.txtType); 
     txtSize = (TextView) findViewById(R.id.txtsize); 
     txtRead = (TextView) findViewById(R.id.txt_read); 

     pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, 
       new Intent(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}; 


     btn_back = (Button) findViewById(R.id.btn_back); 

     btn_back.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(getApplicationContext(),NFCTagWriterActivity.class); 
       i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(i); 

      } 
     }); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     // TODO Auto-generated method stub 

     setIntent(intent); 
     if(getIntent().getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)){ 
      detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 

      readFromTag(getIntent()); 
     } 

     else{ 
      AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext()); 
      builder.setMessage("Tag Not Detected! Please Bring Tag In Proximity").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        // TODO Auto-generated method stub 

       } 
      }).show(); 

      AlertDialog alert = builder.create(); 
      Toast.makeText(getApplicationContext(), "No Tag Detected", Toast.LENGTH_LONG).show(); 
     } 

    } 


    @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     nfcAdapter.enableForegroundDispatch(this, pendingIntent, readTagFilters, null); 
    } 


    public void readFromTag(Intent intent){ 

     Ndef ndef = Ndef.get(detectedTag); 


     try{ 
      ndef.connect(); 

      txtType.setText(ndef.getType().toString()); 
      txtSize.setText(String.valueOf(ndef.getMaxSize())); 

      Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 

      if (messages != null) { 
       NdefMessage[] ndefMessages = new NdefMessage[messages.length]; 
       for (int i = 0; i < messages.length; i++) { 
        ndefMessages[i] = (NdefMessage) messages[i]; 
       } 
      NdefRecord record = ndefMessages[0].getRecords()[0]; 

      byte[] payload = record.getPayload(); 
      int length = payload.length; 

      new_payload = new byte[length-3]; 
      System.arraycopy(payload, 3, new_payload, 0,length-3); 

      String text = new String(new_payload); 

      txtRead.setText(text); 
      Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show(); 

      if(text.equalsIgnoreCase("silent")){ 
       Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show(); 
       AudioManager audiomanage = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
       audiomanage.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
      } 
      if(text.equalsIgnoreCase("vibrate")){ 
       AudioManager audiomanage = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
       audiomanage.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); 
      } 
      if(text.equalsIgnoreCase("normal")){ 
       AudioManager audiomanage = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
       audiomanage.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
      } 

      ndef.close(); 

     } 
     } 
     catch (Exception e) { 
      Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

請注意,您可以直接檢查NDEF消息的意圖,無需連接/關閉。像[樣板工程]一樣(http://code.google.com/p/ndef-tools-for-android/downloads/detail?name=ndeftools-boilerplate-1.1.zip)。 – ThomasRS

+0

我試過,但它不工作.....我必須掃描標籤兩次.. – ssg

回答

1

問題是,onNewIntent心不是叫onCreate方法。想到的快速解決方案是:

在onCreate方法中,您可以chceck意圖類型。如果它的標籤被發現,你可以像處理onNewIntent一樣處理它。

另一種解決方案是將處理代碼放置在onResume中(如果標記重定位是您的所有應用程序的功能)並檢查其中的意圖。

也許有更清潔的解決方案,稍後再考慮一下,但現在,這應該對您有所幫助。

+0

謝謝你的回答它的工作........ – ssg

+1

如果是這樣,你可以考慮upvoting我的答案或接受它:) –

+0

對不起昨天它曾經工作過一次,但現在它不工作我試着你的答案....... – ssg