Android NFC标签未检测到onClick按钮

问题描述:

我正在开发一款Android应用程序,在该应用程序中,当点击该按钮时需要扫描NFC标签。但如果我点击一个按钮,它没有检测到卡,什么都没有发生。帮我解决这个问题。Android NFC标签未检测到onClick按钮

public class Check_in extends Activity { 
    EditText card_details; 
    PendingIntent pendingIntent; 
    IntentFilter[] intentFiltersArray; 
    String[][] techList; 
    NfcAdapter nfcAdapter; 
    LinearLayout scanContainer; 
    private boolean isScanEnabled = false; 

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

     card_details = (EditText) findViewById(R.id.editText); 


    } 

    public void get_nfc(View v) 
    { 
     nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
     if(nfcAdapter == null) 
      Toast.makeText(this,"This Device Not supporting  NFC",Toast.LENGTH_SHORT).show(); 
     else 
      handleIntent(); 

    } 

    private void handleIntent() { 
     pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, 
       getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
     IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); 
     intentFiltersArray = new IntentFilter[] { ndef }; 
     techList = new String[][] { new String[] { NfcA.class.getName(), 
       MifareUltralight.class.getName()} }; 


    } 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     if(nfcAdapter !=null) { 
      if(nfcAdapter.isEnabled()) 
       nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techList); 
      else 
       Toast.makeText(this,"NFC Disabled",Toast.LENGTH_SHORT).show(); 
     } 
    } 


    @Override 
    protected void onPause() { 

     if(nfcAdapter !=null) 
      nfcAdapter.disableForegroundDispatch(this); 
     super.onPause(); 
    } 


    @Override 
    public void onNewIntent(Intent intent) { 
     if(!isScanEnabled) 
      return; 
     Parcelable tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     card_details.setText(dumpTagData(tag).toString()); 

     Toast.makeText(this, "This is "+dumpTagData(tag).toString(), 5000).show(); 
    } 


    private String dumpTagData(Parcelable p) { 
     StringBuilder sb = new StringBuilder(); 
     Tag tag = (Tag) p; 
     byte[] id = tag.getId(); 
     sb.append(getHex(id)); 
     return sb.toString(); 
    } 


    private String getHex(byte[] bytes) { 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < bytes.length; i++) { 
      int b = bytes[i] & 0xff; 
      if (b < 0x10) 
       sb.append('0'); 
      sb.append(Integer.toHexString(b)); 
     } 
     return sb.toString(); 
    } 


} 

在的onResume()和的onPause()方法nfcAdapter总是空的(因为你只有在点击按钮的nfcAdapter)。为什么这个enableForegroundDispatch()方法永远不会被调用。

我对代码做了一些修改(但我没有测试过)。

public class Check_in extends Activity { 

    EditText card_details; 
    PendingIntent pendingIntent; 
    IntentFilter[] intentFiltersArray; 
    String[][] techList; 
    NfcAdapter nfcAdapter; 
    LinearLayout scanContainer; 
    private boolean isToScan = false; 

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

     card_details = (EditText) findViewById(R.id.editText); 

     nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
    } 

    public void get_nfc(View v){ 
     isToScan = true; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     if(nfcAdapter != null) { 

      if (nfcAdapter.isEnabled()) { 

       pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, 
        getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

       IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); 

       intentFiltersArray = new IntentFilter[] { ndef }; 

       techList = new String[][] { new String[] { NfcA.class.getName(), 
        MifareUltralight.class.getName()} }; 

       nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techList); 

      } else { 
       Toast.makeText(this,"NFC Disabled",Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    @Override 
    protected void onPause() { 

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

     super.onPause(); 
    } 

    @Override 
    public void onNewIntent(Intent intent) { 

     if (isToScan && intent.hasExtra(NfcAdapter.EXTRA_TAG)) { 
      isToScan = false; 

      Parcelable tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 

      card_details.setText(dumpTagData(tag).toString()); 

      Toast.makeText(this, "This is " + card_details.getText().toString(), 5000).show(); 
     } 
    } 

    private String dumpTagData(Parcelable p) { 
     StringBuilder sb = new StringBuilder(); 
     Tag tag = (Tag) p; 
     byte[] id = tag.getId(); 
     sb.append(getHex(id)); 
     return sb.toString(); 
    } 

    private String getHex(byte[] bytes) { 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < bytes.length; i++) { 
      int b = bytes[i] & 0xff; 
      if (b < 0x10) 
       sb.append('0'); 
      sb.append(Integer.toHexString(b)); 
     } 
     return sb.toString(); 
    } 
} 

希望这会有所帮助。

+0

它像一个魅力。它帮助了我很多 – user3805324 2015-04-07 05:38:57