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
。您可以使用它来收集导致崩溃的异常的数据,并将该数据发送给您(或将该数据打包到用户可以手动发送给您的文件中)。如果您可以记录在问题中收到的异常,那就太好了。我在问题中添加了堆栈跟踪。