我在使用Samsung Galaxy s5扫描设备时遇到了一些问题。
我在Android 6.0上设置了我的应用程序的权限,可以这样扫描:
<table class="center">
<thead>
<tr>
<th scope="col">Year</th>
<th scope="col">Plaintiff</th>
<th scope="col">Defendant</th>
<th scope="col">Link to More Info</th>
</tr>
</thead>
<tbody>
<tr>
<td scope="row">2015</td>
<td>US DOJ</td>
<td>YAKIMA COUNTY</td>
<td><a href="http://www.ada.gov/yakima_co_pca/yakima_sa.html">http://www.ada.gov/yakima…</a>
</td>
</tr>
</tbody>
</table>
我认为这是正常的,因为我得到了弹出窗口,要求我接受的权限。
我的扫描功能:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
// Android M Permission check
if (this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs location access");
builder.setMessage("Please grant location access so this app can devices.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
}
});
builder.show();
}
现在它停止并开始正确扫描,因为Logcat给了我日志。但它并没有找到任何非常奇怪的设备,因为我坐在笔记本电脑旁边,第二部手机都支持蓝牙。
顺便说一下,如果有人有兴趣,我的回调是:
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
Log.i("start" , "Stopping scan...");
mBluetoothLeScanner.stopScan(mScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
Log.i("start" , "Starting scan...");
mBluetoothLeScanner.startScan(mScanCallback);
} else {
mScanning = false;
mBluetoothLeScanner.stopScan(mScanCallback);
}
}
现在您可以看到扫描没有失败,因为Logcat没有给我扫描失败的日志,但显然它也没有找到任何设备......
logcat的:
Private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
System.out.println("BLE// onScanResult");
Log.i("callbackType", String.valueOf(callbackType));
Log.i("result", result.toString());
BluetoothDevice btDevice = result.getDevice();
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
System.out.println("BLE// onBatchScanResults");
for (ScanResult sr : results) {
Log.i("ScanResult - Results", sr.toString());
}
}
@Override
public void onScanFailed(int errorCode) {
System.out.println("BLE// onScanFailed");
Log.e("Scan Failed", "Error Code: " + errorCode);
}
};
我已为我的Manifest添加了正确的权限:
06-07 17:13:02.622 16802-16802/com.example.joey.findmycar I/start: Starting scan...
06-07 17:13:02.802 16802-16802/com.example.joey.findmycar W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
06-07 17:13:02.882 16802-16802/com.example.joey.findmycar I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@c8fddba time:699666571
06-07 17:13:14.632 16802-16802/com.example.joey.findmycar I/start: Stopping scan...
我已经尝试了几乎所有的可能性,并开始认为手机上的蓝牙可能会被破坏,这很奇怪,因为我可以手动检测并连接到Android设置中的设备。
答案 0 :(得分:2)
我在Android 6.0 API updates中找到了这个:
改进蓝牙低功耗扫描
如果您的应用执行蓝牙低功耗扫描,请使用新的setCallbackType()方法指定您希望系统在第一次找到或在很长一段时间后看到与设置的ScanFilter匹配的广告数据包时通知回调。这种扫描方法比以前的平台版本提供的功率效率更高。
答案 1 :(得分:2)
如果您正在扫描心率监测器或接近传感器等BLE设备,您的代码应该可以正常工作。问题可能在于,使用此代码,您的应用程序是GATT客户端,并且正在搜索GATT服务器。
因此,如果您想连接到另一部手机,您可以编写GATT服务器应用程序并在另一部手机上运行(如上一段here所示)
答案 2 :(得分:1)