public class Mainactivity extends NfcExternalDetectoractivity {
private static final String TAG = Mainactivity.class.getName();
private NxpNfcLibLite libInstance = null;
private TextView textView = null;
private Nxpnfcliblitecallback mCallback = new Nxpnfcliblitecallback() {
@Override
public void onNewTagDetected(Tag tag) {
Log.d(TAG,"-------------- onNewTagDetected ------");
}
@Override
public void onUltraLightCardDetected(final IUltralight card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onUltraLightCCardDetected(final IUltralightC card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onUltraLightEV1CardDetected(final IUltralightEV1 card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onClassicCardDetected(final IMFClassic card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onClassicEV1CardDetected(final IMFClassicEV1 card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onDESFireCardDetected(final IDESFireEV1 card) {
Log.i(TAG,card.getclass().getName() + " card detected");
try {
card.getReader().close();
card.getReader().connect();
desfireCardLogic(card);
} catch (Throwable t) {
Log.w(TAG,"Problem DesfireEV1 operations",t);
}
}
@Override
public void onPlusCardDetected(final IPlus card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onPlusSL1CardDetected(IPlusSL1 card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onICodeSLIDetected(final IICodeSLI card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onICodeSLILDetected(final IICodeSLIL card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onICodeSLISDetected(final IICodeSLIS card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onICodeSLIXDetected(final IICodeSLIX card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onICodeSLIXLDetected(final IICodeSLIXL card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onICodeSLIXSDetected(final IICodeSLIXS card) {
Log.i(TAG,card.getclass().getName() + " card card");
}
@Override
public void onICodeSLIX2Detected(final IICodeSLIX2 card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onNTag203xCardDetected(final INTag203x card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onNTag210CardDetected(final INTag210 card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onNTag213215216CardDetected(final INTag213215216 card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onNTag213F216FCardDetected(final INTag213F216F card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onNTagI2CCardDetected(final INTagI2C card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onNTagI2CplusCardDetected(final INTAGI2Cplus card) {
Log.i(TAG,card.getclass().getName() + " card detected");
}
@Override
public void onCardNotSupported(Tag tag) {
Log.i(TAG,"Card NOT supported");
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
libInstance = NxpNfcLibLite.getInstance();
libInstance.registeractivity(this);
textView = (TextView) findViewById(R.id.text);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
public void clear(View view) {
textView.setText("");
}
@Override
public void onconfigurationChanged(Configuration newConfig) {
super.onconfigurationChanged(newConfig);
}
@Override
protected void onPause() {
libInstance.stopForeGroundDispatch();
super.onPause();
}
@Override
protected void onResume() {
libInstance.startForeGroundDispatch();
super.onResume();
}
protected void onExternalNfcIntentDetected(Intent intent,String action) {
// default to same as native NFC
onNfcIntentDetected(intent,action);
}
@Override
protected void onExternalNfcServiceStopped(Intent intent) {
Log.d(TAG,"Service started");
}
@Override
protected void onExternalNfcServiceStarted(Intent intent) {
Log.d(TAG,"Service stopped");
}
@Override
protected void onExternalNfcReaderOpened(Intent intent) {
Log.d(TAG,"Reader open");
}
@Override
protected void onExternalNfcReaderClosed(Intent intent) {
if(intent.hasExtra(NfcReader.EXTRA_READER_STATUS_CODE)) {
Log.d(TAG,"Disconnect status code " + intent.getIntExtra(NfcReader.EXTRA_READER_STATUS_CODE,-1));
}
if(intent.hasExtra(NfcReader.EXTRA_READER_STATUS_MESSAGE)) {
Log.d(TAG,"Disconnect status message " + intent.getcharSequenceExtra(NfcReader.EXTRA_READER_STATUS_MESSAGE));
}
}
/**
*
* NFC feature was found and is currently enabled
*
*/
@Override
protected void onNfcStateEnabled() {
toast(getString(R.string.nfcAvailableEnabled));
}
/**
*
* NFC feature was found but is currently disabled
*
*/
@Override
protected void onNfcStateDisabled() {
toast(getString(R.string.nfcAvailableDisabled));
}
/**
*
* NFC setting changed since last check. For example,the user enabled NFC in the wireless settings.
*
*/
@Override
protected void onNfcStateChange(boolean enabled) {
if(enabled) {
toast(getString(R.string.nfcAvailableEnabled));
} else {
toast(getString(R.string.nfcAvailableDisabled));
}
}
/**
*
* This device does not have NFC hardware
*
*/
@Override
protected void onNfcFeatureNotFound() {
toast(getString(R.string.noNfcMessage));
}
@Override
protected void onNfcTagLost(Intent intent) {
Log.d(TAG,"Tag lost");
}
protected void onExternalNfcTagLost(Intent intent) {
// default to same as native NFC
onNfcTagLost(intent);
}
@Override
protected void onNfcIntentDetected(Intent intent,String action) {
if(intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
Tag tag = (Tag)intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
try {
Log.d(TAG,"Filter intent");
libInstance.filterIntent(tag,mCallback);
} catch (CloneDetectedException e) {
Log.d(TAG,"Clone Detected",e);
}
try {
String[] techList = tag.getTechList();
for (String tech : techList) {
Log.d(TAG,"Tech " + tech);
if (tech.equals(android.nfc.tech.MifareUltralight.class.getName())) {
MifareUltralight mifareUltralight = MifareUltralight.get(tag);
if(mifareUltralight == null) {
throw new IllegalArgumentException("No Mifare Ultralight");
}
int type = mifareUltralight.getType();
Log.d(TAG,"Got MifareUltralight type " + type);
} else if (tech.equals(android.nfc.tech.NfcA.class.getName())) {
NfcA nfcA = NfcA.get(tag);
if(nfcA == null) {
throw new IllegalArgumentException("No NfcA");
}
byte[] atqa = nfcA.getatqa();
short sak = nfcA.getSak();
Log.d(TAG,"Got NfcA with ATQA " + toHexString(atqa) + " and sak " + Integer.toHexString(sak));
} else if (tech.equals(android.nfc.tech.NfcB.class.getName())) {
NfcB nfcB = NfcB.get(tag);
if(nfcB == null) {
throw new IllegalArgumentException("No NfcB");
}
byte[] applicationData = nfcB.getapplicationData();
byte[] protocolInfo = nfcB.getProtocolInfo();
Log.d(TAG,"Got NfcB with application data " + toHexString(applicationData) + " and protcol info " + toHexString(protocolInfo));
} else if (tech.equals(android.nfc.tech.NfcF.class.getName())) {
Log.d(TAG,"Ignore " + tech);
} else if (tech.equals(android.nfc.tech.NfcV.class.getName())) {
Log.d(TAG,"Ignore " + tech);
} else if (tech.equals(android.nfc.tech.IsoDep.class.getName())) {
android.nfc.tech.IsoDep isoDep = IsoDep.get(tag);
if(isoDep == null) {
throw new IllegalArgumentException("No IsoDep");
}
boolean hostCardEmulation = intent.getBooleanExtra(NfcTag.EXTRA_HOST_CARD_EMULATION,false);
if(hostCardEmulation) {
Log.d(TAG,"Got HCE device");
} else {
Log.d(TAG,"Got " + IsoDep.class.getName());
}
} else if (tech.equals(android.nfc.tech.Mifareclassic.class.getName())) {
android.nfc.tech.Mifareclassic mifareclassic = Mifareclassic.get(tag);
if(mifareclassic == null) {
throw new IllegalArgumentException("No Mifareclassic");
}
Log.d(TAG,"Got " + Mifareclassic.class.getName());
} else if (tech.equals(android.nfc.tech.Ndef.class.getName())) {
Ndef ndef = Ndef.get(tag);
if(ndef == null) {
throw new IllegalArgumentException("No NDEF");
}
Log.d(TAG,"Got " + Ndef.class.getName());
} else if (tech.equals(android.nfc.tech.NdefFormatable.class.getName())) {
NdefFormatable ndefFormatable = NdefFormatable.get(tag);
if(ndefFormatable == null) {
throw new IllegalArgumentException("No NdefFormatable");
}
Log.d(TAG,"Got " + NdefFormatable.class.getName());
}
}
} catch(Exception e) {
Log.d(TAG,"Problem processing tag technology",e);
}
}
}
private void showMessage(final String string) {
Log.d(TAG,string);
runOnUiThread(new Runnable(){
public void run() {
textView.append(string + "\n");
}
});
}
public void toast(int id) {
toast(getString(id));
}
public void toast(String message) {
Toast toast = Toast.makeText(this,message,Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL,0);
toast.show();
}
/**
* Mifare DESFire Card Logic.
*
* @throws SmartCardException
*/
protected void desfireCardLogic(IDESFireEV1 card) throws SmartCardException {
try {
card.getReader().setTimeout(2000);
/* Do the following only if write checkbox is selected */
testDESFirepersonalize(card);
testDESFireauthenticate(card);
testDESFireupdatePICCMasterKey(card);
testDESFireauthenticate(card);
testDESFireupdateApplicationmasterKey(card);
testDESFireauthenticate(card);
testDESFireWrite(card);
testDESFireRead(card);
card.getReader().setTimeout(2000);
//showCardDetails(mDESFire.getcardDetails());
/* Do the following only if write checkbox is selected */
testDESFireFormat(card);
card.getReader().close();
} catch (ReaderException e) {
Log.w(TAG,"Problem running Desfire EV1 operations",e);
}
}
/** DESFire read IO Operations. */
private void testDESFireRead(IDESFireEV1 card) {
boolean res = false;
try {
Log.d(TAG,"testDESFireRead,start");
byte[] data = card.read(5);
res = true;
showMessage(
"Data Read from the card..." + Utilities.dumpBytes(data));
} catch (SmartCardException e) {
showMessage("Data Read from the card: " + res);
e.printStackTrace();
}
Log.d(TAG,result is " + res);
Log.d(TAG,End");
}
/** DESFire Write IO Operations. */
private void testDESFireWrite(IDESFireEV1 card) {
byte[] data = new byte[] { 0x11,0x11,0x11 };
boolean res = false;
try {
Log.d(TAG,"testDESFireWrite,start");
card.write(data);
res = true;
showMessage("Data Written: " + Utilities.dumpBytes(data));
} catch (SmartCardException e) {
showMessage("Data Written: " + res);
e.printStackTrace();
}
Log.d(TAG,End");
}
/** DESFire Update Application master key IO Operations. */
private void testDESFireupdateApplicationmasterKey(IDESFireEV1 card) {
byte[] oldKey = new byte[] { 0x01,0x00,0x00 };
byte[] newKey = new byte[] { 0x01,0x00 };
byte[] masterKey = new byte[] { 0x00,0x00 };
byte[] appId = { 0x12,0x12,0x12 };
boolean res = false;
try {
Log.d(TAG,"testDESFireupdateApplicationmasterKey,start");
card.updateApplicationmasterKey(masterKey,appId,oldKey,newKey);
res = true;
showMessage("Update Application MasterKey: " + res);
} catch (SmartCardException e) {
showMessage("Update Application MasterKey: " + res);
e.printStackTrace();
}
Log.d(TAG,result is "
+ res);
Log.d(TAG,End");
}
/** DESFire Authenticate IO Operations . */
private void testDESFireauthenticate(IDESFireEV1 card) {
byte[] masterKey = new byte[] { 0x00,0x00 };
byte[] appId = { 0x12,0x12 };
byte[] appkey = new byte[] { 0x01,0x00 };
boolean res = false;
try {
Log.d(TAG,"testDESFireauthenticate,start");
card.authenticate(masterKey,appkey);
res = true;
showMessage("Authenticate: " + res);
} catch (SmartCardException e) {
showMessage("Authenticate: " + res);
e.printStackTrace();
}
Log.d(TAG,End");
}
/** DESFire personalize Operations. */
private void testDESFirepersonalize(IDESFireEV1 card) {
byte[] mykey = new byte[] { 0x00,0x00 };
byte[] appKey = new byte[] { 0x01,"testDESFirepersonalize,start");
card.personalize(mykey,new byte[]{0x12,0x12},appKey);
res = true;
showMessage("personalize: " + res);
} catch (SmartCardException e) {
showMessage("personalize: " + res);
e.printStackTrace();
}
Log.d(TAG,End");
}
/** DESFire update PICC Master key Operations . */
private void testDESFireupdatePICCMasterKey(IDESFireEV1 card) {
byte[] oldKey = new byte[] { 0x00,0x00 };
byte[] newKey = new byte[] { 0x00,0x00 };
boolean res = false;
try {
Log.d(TAG,"testDESFireupdatePICCMasterKey,start");
card.updatePICCMasterKey(oldKey,newKey);
res = true;
showMessage("DESFire Update PICC Master Key: " + res);
} catch (SmartCardException e) {
showMessage("DESFire Update PICC Master Key: " + res);
e.printStackTrace();
}
Log.d(TAG,End");
}
/** DESFire Format Operations . */
private void testDESFireFormat(IDESFireEV1 card) {
byte[] mykey = new byte[] { 0x00,"testDESFireFormat,start");
card.format(mykey);
res = true;
showMessage("Format: " + res);
} catch (SmartCardException e) {
showMessage("Format: " + res);
e.printStackTrace();
}
Log.d(TAG,End");
}
}
上面的代码是 skjobler (https://github.com/skjolber/external-nfc-api) 从外部 NFC api 中获取的示例。每当我在 Android 手机上运行示例文件中的代码时,都会出现一个特定错误。
07/26 11:48:02: launching 'examples.nxpClient' on LGE LM-K410.
Install successfully finished in 2 s 242 ms.
$ adb shell am start -n "com.github.skjolber.nfc.external.nxpclient/com.github.skjolber.nfc.external.nxpclient.Mainactivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Connected to process 26402 on device 'lge-lm_k410-LMK410VS9P8P659TYL'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
D/com.github.skjolber.nfc.util.activity.NfcDetectoractivity: onCreate
D/com.github.skjolber.nfc.util.activity.NfcDetectoractivity: NFC feature found
D/com.github.skjolber.nfc.util.activity.NfcDetectoractivity: NFC is enabled
D/com.github.skjolber.nfc.util.activity.NfcExternalDetectoractivity: Start receiving tag broadcasts
D/com.github.skjolber.nfc.util.activity.NfcExternalDetectoractivity: Start receiving reader broadcasts
D/com.github.skjolber.nfc.util.activity.NfcExternalDetectoractivity: Start receiving service broadcasts
D/PhoneWindow: windowLightStatusBar : false,disable View.SYSTEM_UI_flaG_LIGHT_STATUS_BAR
E/libc: access denied finding property "vendor.perf.gestureflingboost.enable"
D/OpenGLRenderer: Skia GL Pipeline
E/libc: access denied finding property "vendor.perf.gestureflingboost.enable"
D/NXP_NFC_libraRY: Android ID: 335850cfbb97fcf3
Build ID: unknown
D/NXP_NFC_libraRY: APK Size: 482076
D/com.github.skjolber.nfc.util.activity.NfcDetectoractivity: Detect NFC state changes while previously enabled
D/com.github.skjolber.nfc.util.activity.NfcDetectoractivity: NFC state remains enabled
D/com.github.skjolber.nfc.util.activity.NfcDetectoractivity: Ignore action android.intent.action.MAIN
E/libc: access denied finding property "vendor.perf.gestureflingboost.enable"
E/AndroidRuntime: FATAL EXCEPTION: Thread-3
Process: com.github.skjolber.nfc.external.nxpclient,PID: 26402
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/params/BasicHttpParams;
at com.nxp.nfclib.ˊ$if$1.run(:392)
Caused by: java.lang.ClassnotFoundException: Didn't find class "org.apache.http.params.BasicHttpParams" on path: DexPathList[[zip file "/data/app/com.github.skjolber.nfc.external.nxpclient-G_YNJnDMgVhy7ueHG1Y9Eg==/base.apk"],nativelibraryDirectories=[/data/app/com.github.skjolber.nfc.external.nxpclient-G_YNJnDMgVhy7ueHG1Y9Eg==/lib/arm,/system/lib,/product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.nxp.nfclib.ˊ$if$1.run(:392)
I/Process: Sending signal. PID: 26402 SIG: 9
每当我在 Android 手机上运行该应用程序时,该应用程序都会立即退出。但是,在出现错误之前,它必须连接到互联网,我这样做了,但并没有解决问题。有没有人知道如何解决这个运行时问题?