2015-03-03 77 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