Android NFC-NdefRecord构造错误

Android NFC-NdefRecord构造错误,android,nfc,ndef,Android,Nfc,Ndef,我正在尝试使用NdefRecord/NdefMessage编写NFC标记 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, uriB

我正在尝试使用
NdefRecord
/
NdefMessage
编写NFC标记

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);
这就是我如何创建我的
ndefreRecord
,由于兼容性问题,我无法使用
createUri()
createUri()
自API14起可用,我需要API11兼容…)

它对棒棒糖(在5.0.2上测试)和KitKat(在4.4.3上测试)非常有效

我的一个用户在创建
ndefreRecord
时发生崩溃:

NdefRecord record = new NdefRecord(
    NdefRecord.TNF_WELL_KNOWN,
    NdefRecord.RTD_URI,
    null,
    recordBytes);
他在ICS4.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
java.lang.RuntimeException:无法启动活动组件信息{com.your.application/com.your.application.NFCWriter}:java.lang.IllegalArgumentException:非法的空参数
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)上
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)上
在android.app.ActivityThread.access$600(ActivityThread.java:127)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:4448)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:823)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.IllegalArgumentException:非法空参数
位于android.nfc.NdefRecord(NdefRecord.java:242)
位于android.nfc.NdefRecord(NdefRecord.java:233)
位于com.your.application.NFCWriter.onCreate(未知源)
位于android.app.Activity.performCreate(Activity.java:4465)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
... 还有11个

我想我找到了答案

即使API文档说对
类型
id
有效载荷
使用
null
是可以的,但事实并非如此。-->

这是真的,因为只有Android 4.1.1,对于那些感兴趣的人来说,这里是源代码:

null
被一个
空字节数组
替换(这是一个
新字节[0]

当使用
null
作为参数时,抛出一个
IllegalArgumentException

因此,如果您想要向后兼容并构造NdefRecord,永远不要提供
null
作为参数,请使用
newbyte[0]
代替

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
的线索,这很有帮助。

代码看起来不错。我建议你添加更多关于“崩溃”的细节,否则这个问题可能会偏离主题。例如,你可以使用bug报告中的堆栈跟踪(如果你的应用程序在Play Store上),或者在你的应用程序中实现你自己的异常处理程序,为你提供调试信息,该应用程序不在play store上,因为它是在我的工作场所内部使用的,因此我无法访问错误报告。我知道问题来自此语句,因为用户能够设置断点以在崩溃时进行检查,但我没有他的堆栈跟踪。。。添加一个处理程序来发送调试信息听起来是个不错的主意,但我如何通过应用程序获取调试信息(然后发送它)?肯定是离题的,但您想要搜索的神奇术语是
UncaughtExceptionHandler
setDefaultUncaughtExceptionHandler
。您可以使用它来收集导致崩溃的异常的数据,并将该数据发送给您(或将该数据打包到用户可以手动发送给您的文件中)。如果您可以记录在问题中收到的异常,那就太好了。我在问题中添加了堆栈跟踪。