我发了一个应用程序,当发送意图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,但是当执行此代码时,它永远不会被更改。
答案 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 Basis和Read NFC tags