Rap*_*sus 2 crash android bluetooth-lowenergy
我有android和BLE的问题,任何时候我扫描我的应用程序崩溃,我不知道原因.我用startLeScan()这可能是这个原因吗?这是我的代码示例.
这里是我为api 18初始化的地方
//API 18
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
Sensortag sensortag = new Sensortag(device, SensortagScanner.this,
mSensortagScannerCallback);
synchronized (this) {
for (Sensortag other : mDiscoveredDevices) {
if (sensortag.getName().equals(other.getName())) {
Log.i("SensortagScanner",
"Discovered duplicate device: "
+ other.getName());
return;
}
}
}
mDiscoveredDevices.add(sensortag);
Log.i("SensortagScanner",
"Discovered a device named " + device.getName() + ".");
mCallback.onSensorDiscovered(sensortag);
}
};
Run Code Online (Sandbox Code Playgroud)
这里是我初始化ScanCall的地方,看起来错误java nulle exception // API 21似乎是错误的
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void initScanCallback() {
if (scanCallback != null)
return;
this.scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
// Do whatever you want
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
Log.d(TAG, "Batch scan results: ");
for (ScanResult result : results) {
Log.d(TAG, "Batch scan result: " + result.toString());
// Do whatever you want
}
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
// scanListener.onScanFinished();
Log.d(TAG, "Scan failed");
}
};
}
Run Code Online (Sandbox Code Playgroud)
这是我开始扫描的地方
@Override
public void startScan(SensorScannerCallback callback) {
mCallback = callback;
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
callback.onScannerUnavailable(this);
return;
}
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
stopScan();
}
}, SCAN_PERIOD);
Log.i("SensortagScanner", "Starting scan...");
mScanning = true;
// ////////////POUR API 21//////////////
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mBluetoothAdapter.getBluetoothLeScanner().startScan(scanCallback);
}
// /////////POUR API <18////////////////
else {
mBluetoothAdapter.startLeScan(mLeScanCallback);
}
}
Run Code Online (Sandbox Code Playgroud)
尝试使用Android 5的方法,如下面的代码段所示.它可能有所帮助.如果没有,请显示更多代码以及崩溃发生时的错误.
首先,你需要一个回调,所以根据android版本正确初始化它.
private void initScanCallback(){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
initCallbackLollipop();
}else{
initScanCallbackSupport();
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void initCallbackLollipop(){
if(scanCallback != null) return;
this.scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
//Do whatever you want
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
Log.d(TAG, "Batch scan results: ");
for (ScanResult result: results){
Log.d(TAG, "Batch scan result: " + result.toString());
//Do whatever you want
}
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
Log.d(TAG, "Scan failed");
}
};
}
private void initScanCallbackSupport(){
if(callback != null) return;
this.callback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, final byte[] scanRecord) {
String address = device.toString();
String name = device.getName();
// parse uuids according to another stackoverflow post
//List<UUID> uuids = parseUuids(scanRecord);
// TODO Compare detected UUIDs with the uuidFilter
//for(UUID discUUID : uuids)
// for(UUID uuid : BLEScanService.this.uuidFilter)
// if(discUUID.equals(uuid))
BLEScanService.this.scanListener.onDeviceScanned(address, name, uuids, rssi);
}
};
}
Run Code Online (Sandbox Code Playgroud)
然后你可以根据android版本开始扫描:
public void startScanWithServices(List<String> uuidFilters){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
scanLollipop(uuidFilters);
}else{
scanSupport(uuidFilters);
}
// Store filters for later filtering
int size = uuidFilters.size();
this.uuidFilter = new ArrayList<UUID>();
for(int i = 0; i<size; i++){
this.uuidFilter.add(UUID.fromString(uuidFilters.get(i)));
}
if(BuildConfig.DEBUG) Log.d(TAG, "BLE Scan started");
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void scanLollipop(List<String> uuidFilters){
if(scanCallback == null)
initCallbackLollipop();
List<ScanFilter> filters = new ArrayList<ScanFilter>();
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // or BALANCED previously
.setReportDelay(0)
.build();
bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, scanCallback);
//bluetoothAdapter.getBluetoothLeScanner().startScan(scanCallback);
}
private void scanSupport(List<String> uuidFilters){
if(callback == null)
initScanCallbackSupport();
//start scan
//boolean success = bluetoothAdapter.startLeScan(uuids, callback);
boolean success = bluetoothAdapter.startLeScan(callback);
//check scan success
if(!success) {
if(BuildConfig.DEBUG) Log.d(TAG, "BLE Scan failed");
scanListener.onScanFinished();
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样停止扫描:
public void stopScan(){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// Stop scan and flush pending scan
bluetoothAdapter.getBluetoothLeScanner().flushPendingScanResults(scanCallback);
bluetoothAdapter.getBluetoothLeScanner().stopScan(scanCallback);
}else{
bluetoothAdapter.stopLeScan(callback);
}
if(BuildConfig.DEBUG) Log.d(TAG, "BLE Scan stopted");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1258 次 |
| 最近记录: |