2013-04-03 138 views
0

在一个Android应用程序,我试图从包中提取额外的类似如下:Landroid.os.Parcelable ClassCastException异常

Parcelable p = intent.getExtras().getParcelable("android.nfc.extra.NDEF_MESSAGES"); 

但我得到下面的异常

Key android.nfc.extra.NDEF_MESSAGES expected Parcelable but value was a [Landroid.os.Parcelable;. The default value <null> was returned. 
Attempt to cast generated internal exception: 
java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to android.os.Parcelable 
    at android.os.Bundle.getParcelable(Bundle.java:1179) 
    at com.example.nfcmessenger.MainActivity.onNewIntent(MainActivity.java:77) 
    at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1154) 
    at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2299) 
    at android.app.ActivityThread.performNewIntents(ActivityThread.java:2312) 
    at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2321) 
    at android.app.ActivityThread.access$1400(ActivityThread.java:141) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5041) 
    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:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    at dalvik.system.NativeStart.main(Native Method) 

什么这是Landroid.os.Parcelable? Parcelable的正常进口只是android.os.Parcelable

回答

2

Official documentation状态:

额外含有NdefMessage存在于所发现的标签阵列。

对于ACTION_NDEF_DISCOVERED意图,此额外是强制性的,并且对于ACTION_TECH_DISCOVEREDACTION_TAG_DISCOVERED意向是可选的。

当这个额外的存在时,总会有至少一个NdefMessage元素。大多数NDEF标签只有一个NDEF消息,但是我们使用一个数组来实现未来的兼容性。

常数值:“android.nfc.extra.NDEF_MESSAGES”

看来您检索Parcelable对象,而不是一个单一的对象的数组。 将您的代码更改为类似于:

Parcelable[] pArray = intent.getExtras().getParcelableArray("android.nfc.extra.NDEF_MESSAGES");  
Parcelable p = pArray[0];