5

我制作了一个在发送意图 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,但是当执行此代码时,它永远不会改变。

4

2 回答 2

2

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

于 2012-12-16T20:09:50.437 回答
1

如果您有其他应用程序可以在更高级别(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 基础和这里阅读 NFC 标签

于 2014-09-18T03:45:01.770 回答