gpt4 book ai didi

java - 蓝牙 GATT 尝试在空对象引用上调用虚拟方法 'void android.content.Context.sendBroadcast(android.content.Intent)'

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:39 27 4
gpt4 key购买 nike

我正在编写我的第一个 Android 应用程序,但没有成功 - 我在蓝牙 GATT 的读写可靠性方面遇到了很大的问题。 30 分钟前,我能够从手机向外围设备写入一个字节,并看到它已收到。我现在不可以。我开始认为这种间歇性错误是导致问题的原因:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.Context.sendBroadcast(android.content.Intent)' on a null object reference
at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:376)
at com.znewsham.skiday.adapters.BluetoothLeService.broadcastUpdate(BluetoothLeService.java:152)
at com.znewsham.skiday.adapters.BluetoothLeService.access$100(BluetoothLeService.java:50)
at com.znewsham.skiday.adapters.BluetoothLeService$1.onServicesDiscovered(BluetoothLeService.java:118)
at android.bluetooth.BluetoothGatt$1.onSearchComplete(BluetoothGatt.java:304)
at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:217)
at android.os.Binder.execTransact(Binder.java:454)

我从 android 开发人员示例中获得了大部分代码,但根据我的需要对其进行了修改。如果我在此处删除对 broadcastUpdate 的调用,或将其包装在 try block 中,则错误将在不同的位置(例如 onServicesDiscovered)发生相同的错误,但它只出现一次。

这是我绑定(bind)服务的地方:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == DEVICE_SCAN){
address = data.getStringExtra("address");
Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);
startService(gattServiceIntent);
bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
}
}

这是服务:

private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
boolean connected;
do {
bluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();
bluetoothLeService.attachBase(ViewSkiDayActivity.this);
if (!bluetoothLeService.initialize()) {
Log.e("", "Unable to initialize Bluetooth");
finish();
}
// Automatically connects to the device upon successful start-up initialization.
connected = bluetoothLeService.connect(address);
}while(connected == false);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
bluetoothLeService = null;
}
};

这是发生错误的回调处理程序:

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
String intentAction;
if (newState == BluetoothProfile.STATE_CONNECTED) {
intentAction = ACTION_GATT_CONNECTED;
mConnectionState = STATE_CONNECTED;
try{
broadcastUpdate(intentAction);
}
catch(Exception e){

}
Log.i(TAG, "Connected to GATT server.");
// Attempts to discover services after successful connection.
Log.i(TAG, "Attempting to start service discovery:" + mBluetoothGatt.discoverServices());

} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
intentAction = ACTION_GATT_DISCONNECTED;
mConnectionState = STATE_DISCONNECTED;
Log.i(TAG, "Disconnected from GATT server.");
try{
broadcastUpdate(intentAction);
}
catch(Exception e){

}
}
}

@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
} else {
Log.w(TAG, "onServicesDiscovered received: " + status);
}
}

@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
}

@Override
public void onCharacteristicChanged(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}

@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
Log.w("BLARG", "write callback");
}
};

广播更新:

private void broadcastUpdate(final String action) {
final Intent intent = new Intent(action);
sendBroadcast(intent);
}

我很困惑,我什至不确定解决这个问题是否能解决我的问题

最佳答案

我不知道这是否对您有帮助,但我收到了完全相同的错误消息。关于我的问题的一些上下文:我在我的自定义对象中的 Activity 之外调用“sendBroadcast”。我能够通过替换这个来解决:

sendBroadcast(intent);

用这个:

context.sendBroadcast(intent);

不用说,当 Activity 第一次实例化所述对象时,我通过将其传递给对象的构造函数来在我的对象中保留对上下文的引用:

new MyObject(this);

希望对你有帮助。

关于java - 蓝牙 GATT 尝试在空对象引用上调用虚拟方法 'void android.content.Context.sendBroadcast(android.content.Intent)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28402728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com