2015-03-03 78 views
1

我正在尝试使用NdefRecord/NdefMessage编写NFC标签。NFC - NdefRecord错误构造

byte prefix = 0x04; // https:// 
byte[] uriBytes = "whatever.anywhere.com".getBytes(); 
byte[] recordBytes = new byte[uriBytes.length + 1]; 
recordBytes[0] = prefix; 
System.arraycopy(uriBytes, 0, recordBytes, 1, uriBytes.length); 

NdefRecord record = new NdefRecord(
    NdefRecord.TNF_WELL_KNOWN, 
    NdefRecord.RTD_URI, 
    null, 
    recordBytes); 

这是我创造我的NdefRecord,我不能用createUri()由于兼容性问题(createUri()是因为API14上市,我需要API11 COMPAT ...)

它的棒棒糖的伟大工程(在5.0.2上测试)和KitKat上的事件(在4.4.3上测试)。

的事情,我的用户之一创建NdefRecord时有崩溃:

NdefRecord record = new NdefRecord(
    NdefRecord.TNF_WELL_KNOWN, 
    NdefRecord.RTD_URI, 
    null, 
    recordBytes); 

他是ICS 4.0.2,我真的不能调试这个问题,因为我不知道这样的免费电话我不能用AVD来模拟这个问题。

有没有人看到我做什么错了?还是有另一种/更好的方式来做到这一点?

编辑: 下面是有关这个错误

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.application/com.your.application.NFCWriter}: java.lang.IllegalArgumentException: Illegal null argument 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992) 
     at android.app.ActivityThread.access$600(ActivityThread.java:127) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4448) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalArgumentException: Illegal null argument 
     at android.nfc.NdefRecord.<init>(NdefRecord.java:242) 
     at android.nfc.NdefRecord.<init>(NdefRecord.java:233) 
     at com.your.application.NFCWriter.onCreate(Unknown Source) 
     at android.app.Activity.performCreate(Activity.java:4465) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931) 
     ... 11 more 
+0

代码看起来没问题。我建议你增加一些关于“崩溃”的更多细节,否则这个问题很可能成为焦点话题。例如,您可以使用bug报告中的堆栈跟踪(如果您的应用程序位于Play商店)或在您的应用程序中实现自己的异常处理程序,该应用程序为您提供调试信息。 – 2015-03-03 17:01:19

+0

这是一个棘手的部分,应用程序不在游戏商店中,因为它是供我的工作场所内部使用的,所以我无法访问错误报告。 – 2015-03-03 17:43:14

+0

我知道这个问题来自这个声明,因为用户能够设置断点来检查它何时崩溃,但我没有他的堆栈跟踪,但... 添加处理程序来发送调试信息听起来像一个好主意,但我怎样才能通过应用程序获取调试信息(然后发送它)? – 2015-03-03 17:50:56

回答

2

我猜我发现我的回答堆栈跟踪。

即使API文档说,使用nulltypeid或​​是确定的,事实并非如此。 - > API Reference

的事情是真实的,因为安卓4.1.1只,对于那些有兴趣在这里是源代码:

NdefRecord Constructor (4.1.1_r1) nullEMPTY_BYTE_ARRAY取代(这是一个new byte[0]仍然)

虽然NdefRecord Constructor (4.0.4_r2.1)使用null作为参数抛出IllegalArgumentException

所以,如果你想成为巴ckward兼容,并构建NdefRecord,永远不要PROVIDE null AS参数,请使用new byte[0] INSTEAD

byte prefix = 0x04; // https:// 
byte[] uriBytes = "whatever.anywhere.com".getBytes(); 
byte[] recordBytes = new byte[uriBytes.length + 1]; 
recordBytes[0] = prefix; 
System.arraycopy(uriBytes, 0, recordBytes, 1, uriBytes.length); 

NdefRecord record = new NdefRecord(
    NdefRecord.TNF_WELL_KNOWN, 
    NdefRecord.RTD_URI, 
    new byte[0], 
    recordBytes); 

这就是它。

谢谢@ michael-roland在UncaughtExceptionHandler上的线索,它有帮助。

+0

如果您能记录您在问题中收到的异常,那将会很棒。 – 2015-03-04 14:08:51

+1

我在问题中添加了堆栈跟踪。 – 2015-03-04 14:27:25