因为我在安卓棒棒糖上使用蓝牙时遇到了问题,所以我试着改变了扫描方式。
所以我试着使用新的包。在以前的版本中,我调用了startScan(mLeScanCallback),一切都正常,但是现在,当我调用startScan(mScanCallback)时,我得到了错误:"D/BluetoothLeScanner:找不到回调包装“。
找不到任何设备,并且我用来显示设备的ListAdapter为空。
注释行是前面的代码(并且它起作用了!)。这是我的代码:
public class Selection extends ListActivity implements ServiceConnection {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
// Initializes a Bluetooth adapter through BluetoothManager.
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
getApplicationContext().bindService(new Intent(this, MetaWearBleService.class), this, Context.BIND_AUTO_CREATE);
}
private void scanLeDevice(final boolean enable) {
final BluetoothLeScanner bluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
if (enable) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
//mBluetoothAdapter.stopLeScan(mLeScanCallback);
bluetoothLeScanner.stopScan(mScanCallback);
setListAdapter(listAdapter);
}
}, SCAN_PERIOD);
//mBluetoothAdapter.startLeScan(mLeScanCallback);
bluetoothLeScanner.startScan(mScanCallback);
} else {
//mBluetoothAdapter.stopLeScan(mLeScanCallback);
bluetoothLeScanner.stopScan(mScanCallback);
setListAdapter(listAdapter);
}
}
private ScanCallback mScanCallback =
new ScanCallback() {
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
listAdapter.addDevice(device);
}
});
}
};相反,ListAdapter扩展了BaseAdapter并使用了ViewHolder。如果有必要,我会把它贴出来。
那么"D/BluetoothLeScanner:找不到回调包装器“是什么意思呢?出什么问题了?
否则我怎么解决不了用安卓棒棒糖扫描的问题呢?在棒棒糖中,我经常会有关于BluetoothGatt的错误。我不知道如何缩小它(或解决它)。
谢谢
发布于 2017-03-16 05:45:21
每当安卓的蓝牙扫描app被告知顶部停止扫描应用程序时,当他们认为扫描还没有启动时,日志消息D/BluetoothLeScanner: could not find callback wrapper就会出现。你可以通过查看Android的BluetoothLeScanner here的源代码来了解这一点。
忽略通常是安全的,因为有很多原因导致扫描实际上尚未开始(它已停止、蓝牙关闭、未授予权限等)。执行扫描的客户端软件通常会在计时器上停止扫描,而不管它是否已成功启动,或者是否在计时器关闭之前手动停止。Android的示例代码(以及上面显示的代码)就是这样做的,通常会导致显示这些日志消息。
如果您真的想最小化这些消息,您需要跟踪扫描是否实际开始,并仅在扫描确实开始时才停止扫描。不幸的是,如果扫描成功启动,就不会得到返回码;如果不能成功启动,就只会得到对onScanFailed(errorCode)的异步回调。因此,一种方法是在调用start scan时设置scanStartCount++;,并在收到onScanFailed(errorCode)回调时设置scanStartCount--;。然后,当计时器停止扫描时,只有在scanStartCount >0时才停止扫描。
请记住,您只能最小化来自应用程序的这些消息。手机上执行蓝牙扫描的其他应用程序可能也会导致这些消息被发送。
发布于 2017-04-01 17:14:22
我在安卓m.It上也遇到了同样的问题,那是因为我没有permissions.Make来确保你进入设置并授予你的应用程序定位权限
发布于 2019-05-07 16:06:05
对于相同的问题
我刚刚添加了权限:
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.
Manifest.permission.
Manifest.permission.BLUETOOTH_PRIVILEGED,在您的活动中调用以下方法:
checkPermissions(MainActivity.this, this);
public static void checkPermissions(Activity activity, Context context){
int PERMISSION_ALL = 1;
String[] PERMISSIONS = {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.BLUETOOTH_PRIVILEGED,
};
if(!hasPermissions(context, PERMISSIONS)){
ActivityCompat.requestPermissions( activity, PERMISSIONS, PERMISSION_ALL);
}
}
public static boolean hasPermissions(Context context, String... permissions) {
if (context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}希望能帮上忙
https://stackoverflow.com/questions/40862767
复制相似问题