如何从Android读取和写入NfcA卡

时间:2012-12-16 19:00:12

标签: android nfc

我发了一个应用程序,当发送意图android.nfc.action.TAG_DISCOVERED时调用,但后来我想在onNewIntent方法中获取卡的信息,但我不知道如何处理这种nfc卡。我尝试使用以下代码:

    public void onNewIntent(Intent intent) {
        Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        //do something with tagFromIntent
        NfcA nfca = NfcA.get(tagFromIntent);
        try{
            nfca.connect();
            Short s = nfca.getSak();
            byte[] a = nfca.getAtqa();
            String atqa = new String(a, Charset.forName("US-ASCII"));
            tv.setText("SAK = "+s+"\nATQA = "+atqa);
            nfca.close();
        }
        catch(Exception e){
            Log.e(TAG, "Error when reading tag");
            tv.setText("Error");
        }
    }

tv是一个TextView,但是当执行此代码时,它永远不会被更改。

2 个答案:

答案 0 :(得分:2)

如果您的活动已在运行并且设置为singleTask,则会调用OnNewIntent。 您将要使代码成为自己的方法,并在onCreate()和onNewIntent()中调用它

答案 1 :(得分:2)

如果您的其他应用可以管理更高级别的相同标记(NDEF_DISCOVERED或TECH_DISCOVERED)您的应用程序(仅管理较低级别)将永远不会被调用。

要使用您的应用,您需要打开您的应用,而不是扫描标记。

如果您的应用永远不会启动,请务必完成以下步骤:

在OnCreate()中获取你的NfcAdapter:

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

   ....
   mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

   if (mNfcAdapter == null) {
      // Stop here, we definitely need NFC
      Toast.makeText(this, "This device doesn't support NFC.", Toast.LENGTH_LONG).show();
      finish();
      return;
    }

    //method to handle your intent
    handleTag(getIntent());
}

在onResume中启用前台调度:

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

   final Intent intent = new Intent(this.getApplicationContext(), this.getClass());
   final PendingIntent pendingIntent = PendingIntent.getActivity(this.getApplicationContext(), 0, intent, 0);

    mNfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}

在onPause中禁用它:

@Override
protected void onPause() {
   mNfcAdapter.disableForegroundDispatch(this);

   super.onPause();
}

在onNewIntent中调用函数来处理你的意图

@Override
protected void onNewIntent(Intent intent) {
   super.onNewIntent(intent);

   handleTag(intent);
}

在您的函数中处理您的标记:

private void handleTag(Intent intent){
   String action = intent.getAction();
   Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

   if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action){

      // here your code
   }
}

不要忘记在清单中添加权限:

<uses-permission android:name="android.permission.NFC" />

<uses-feature  
   android:name="android.hardware.nfc"
   android:required="true" />

<activity>
   ....
   <intent-filter>
      <action android:name="android.nfc.action.TAG_DISCOVERED"/>
   </intent-filter>
</activity>

此处有更多信息NFC BasisRead NFC tags