【发布时间】:2017-03-27 05:49:26
【问题描述】:
我遇到了以下问题。
我的应用程序架构或多或少由 3 个主要部分组成:
- 设备视图(显示可用的 BLE 设备)
- BLE 服务(处理 BLE 连接和数据)
- 服务视图(显示特定设备的服务)
我的问题是第二次将 BluetoothGATTService 传递给意图(第一次有效)。
或多或少的动作是这样的:
- 选择要为其显示服务的设备
- 向 BLEService 发送带有设备和操作的意图
- BLEService 执行服务发现并将意图与服务一起发送回
- BroadcastReceiver 正确接收 Intent 并使用接收到的 Intent 中的数据开始新的活动。
最后一步出现问题,因为我无法将 ArrayList 放入意图/捆绑包,因为它会导致异常:
E/AndroidRuntime: 致命异常: main 进程:com.projects.dawid.gattclient,PID:4133 java.lang.RuntimeException:包裹:无法编组值 android.bluetooth.BluetoothGattService@ef62956 在 android.os.Parcel.writeValue(Parcel.java:1337) 在 android.os.Parcel.writeList(Parcel.java:711) 在 android.os.Parcel.writeValue(Parcel.java:1284) 在 android.os.Parcel.writeArrayMapInternal(Parcel.java:638) 在 android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313) 在 android.os.Bundle.writeToParcel(Bundle.java:1096) 在 android.os.Parcel.writeBundle(Parcel.java:663) 在 android.content.Intent.writeToParcel(Intent.java:7838) 在 android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2530)
对我来说这很奇怪,好像操作不受支持,那么我们会在从 BLEService 发送服务的 ArrayList 到 BroadcastReceiver 时得到这个异常,而不是现在。
源代码:
BLEService 广播接收器代码
private void notifyServicesDiscovered(BluetoothGatt gatt) {
Intent intent = new Intent();
intent.setAction(BLEService.RESPONSE);
intent.putExtra(BLEService.RESPONSE, BLEService.Responses.SERVICES_DISCOVERED);
intent.putExtra(BLEService.Responses.DEVICE, gatt.getDevice());
intent.putParcelableArrayListExtra(BLEService.Responses.SERVICES_LIST, getArrayListServices(gatt));
LocalBroadcastManager.getInstance(mServiceContext).sendBroadcast(intent);
}
@NonNull
private ArrayList<BluetoothGattService> getArrayListServices(BluetoothGatt gatt) {
ArrayList<BluetoothGattService> services = new ArrayList<>();
services.addAll(gatt.getServices());
return services;
}
这很好用。现在
广播接收器到新的活动代码
在识别处理此方法的正确意图后调用
private void createViewWithServices(Intent intent) {
Log.i(TAG, "creating new activity!");
BluetoothDevice device = intent.getParcelableExtra(BLEService.Responses.DEVICE);
ArrayList<BluetoothGattService> services = intent.getParcelableArrayListExtra(BLEService.Responses.SERVICES_LIST);
Intent serviceShowIntent = new Intent(mActivityContext, ServiceShowActivity.class);
serviceShowIntent.putExtra(BLEService.Responses.DEVICE, device);
serviceShowIntent.putParcelableArrayListExtra(BLEService.Responses.SERVICES_LIST, services); //this line causes error
mActivityContext.startActivity(serviceShowIntent); // here exception is thrown
}
谁能解释一下这背后的奥秘?我只是不明白为什么第一个代码很好,而第二个代码却因异常而失败。
已经尝试过很多不同的方法,但都失败了。我什至在意图之间交换包,因为它们的内容相同,但这也失败了,复制列表项没有区别。
编辑
指的是AndroidRuntime error: Parcel: unable to marshal value 错误。不同的是,我使用的是android本身提供的类的对象,即BluetoothGATTService,它确实实现了引用https://developer.android.com/reference/android/bluetooth/BluetoothGattService.html的parcelable接口
【问题讨论】:
-
我明白,但是 BluetoothGATTService 实现 parcelable 见developer.android.com/reference/android/bluetooth/…。
-
公平的,我会写一个正确的答案。
-
我已经详细说明了可能的原因,为什么您可以看到有问题的行为。我无法撤消标记,但我们希望版主决定支持保持问题开放。
标签: java android android-intent parcelable