需要做一个蓝牙软件,才开始学习Android
使用普通的蓝牙扫描 blueadapter.startDiscovery();可以正常获取,但是使用BLE扫描回调只能获取到地址不能获取到名字。谢谢各位的解答
以下是我的扫描以及回调代码:
```java
/**
* 开始扫描 10秒后自动停止
* */
private void scanDevice(){
if (!blueadapter.isEnabled()){
Toast.makeText(BlEbluetooth.this,"蓝牙未开启",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(BlEbluetooth.this,"正在搜索",Toast.LENGTH_SHORT).show();
if (Build.VERSION.SDK_INT >= 21) {//判断版本号5.0
isScaning=true;//标记当前扫面描状态
if (mBLEScanner == null)
{
mBLEScanner = blueadapter.getBluetoothLeScanner();
}
mBLEScanner.startScan(null,mScanSetting(),mScanCallback);
} else {
isScaning = true;
blueadapter.startLeScan(scanCallback);
}
//设置扫描结束
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//结束扫描
if(android.os.Build.VERSION.SDK_INT >= 21) {
//标记当前的为未扫描状态
isScaning = false;
mBLEScanner.stopScan(mScanCallback);
Toast.makeText(BlEbluetooth.this,"搜索结束",Toast.LENGTH_SHORT).show();
} else {
//标记当前的为未扫描状态
isScaning = false;
//5.0以下 停止扫描
blueadapter.stopLeScan(scanCallback);
Toast.makeText(BlEbluetooth.this,"搜索结束",Toast.LENGTH_SHORT).show();
}
}
},10000);
}
}
```java
BluetoothAdapter.LeScanCallback scanCallback=new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
Log.e(TAG, "正在搜索");
if (!mDatas.contains(device)){//判断设备是否加入
final BleAdvertisedData badata = BleUnit.parseAdertisedData(scanRecord);
String deviceName = device.getName();
if( deviceName == null ){
deviceName = badata.getName();//获取名字
}//看了其他人的添加的,可是没有用
DeviceInformation deviceInformation = new DeviceInformation(deviceName,device);
mDatas.add(deviceInformation);
listAdapter.notifyDataSetChanged();
}
}
};
ScanCallback mScanCallback = new ScanCallback() {
//当广播发现回调时
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
//扫描类型有开始扫描时传入的ScanSettings相关
//对扫描到的设备进行操作。如:获取设备信息。
BluetoothDevice device = result.getDevice();
String deviceName = device.getName();
if (!mDatas.contains(device)){//判断设备是否加入
DeviceInformation deviceInformation = new DeviceInformation(deviceName,device);
mDatas.add(deviceInformation);
listAdapter.notifyDataSetChanged();
}
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
//批量返回扫描结果
//@param results 以前扫描到的扫描结果列表。
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
//当扫描不能开启时回调
//扫描太频繁会返回ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED,表示app无法注册,无法开始扫描。
}
};
public ScanSettings mScanSetting(){
//创建ScanSettings的build对象用于设置参数
ScanSettings.Builder builder = new ScanSettings.Builder()
/**设置高功耗模式
* setScanMode() 设置扫描模式。ScanSettings.SCAN_MODE_LOW_POWER 低功耗模式(默认扫描模式,如果扫描应用程序不在前台,则强制使用此模式。)
*/
.setScanMode(SCAN_MODE_LOW_LATENCY);
//android 6.0添加设置回调类型、匹配模式等
if(Build.VERSION.SDK_INT >= 23) {
//定义回调类型
//数值1,寻找符合过滤条件的蓝牙广播,如果没有设置过滤条件,则返回全部广播包
builder.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES);
//设置蓝牙LE扫描滤波器硬件匹配的匹配模式
//MATCH_MODE_STICKY粘性模式,在通过硬件报告之前,需要更高的信号强度和目击阈值
builder.setMatchMode(ScanSettings.MATCH_MODE_STICKY);
}
//判断当前芯片是否支持批处理芯片上的扫描
if (blueadapter.isOffloadedScanBatchingSupported()) {
//设置蓝牙LE扫描的报告延迟的时间(以毫秒为单位)
//设置为0以立即通知结果
builder.setReportDelay(0L);
}
return builder.build();
}
你尝试下加入定位权限看有没有用,记得动态申请下权限。