- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在一个简单的安卓应用程序中实现一个 BLE 扫描仪。我一直在关注: startLeScan replacement to current api和 https://developer.android.com/guide/topics/connectivity/bluetooth-le
不幸的是,我的 BLEScanCallback 类的回调函数似乎没有被调用。我一直在尝试使用 Log.e 来查看是否有任何一个被调用。
我调试了应用程序,应用程序进入 bluetoothLeScanner.stopScan(scanCallback);在 run() 函数中。
我已将 BLUETOOTH、BLUETOOTH_ADMIN 和 ACCESS_COARSE_LOCATION 添加到 list 中。
我不太确定我在这里做错了什么。对此的任何帮助将不胜感激。
谢谢
相关代码如下:
public class DiscoverActivity extends AppCompatActivity {
private BluetoothAdapter bluetoothAdapter;
private boolean scanning;
private Handler handler;
static int REQUEST_ENABLE_BT = 1001;
private static final long SCAN_PERIOD = 10000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_discover);
handler = new Handler();
scanning = false;
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
}
public boolean onOptionsItemSelected(MenuItem item) {
boolean ret;
int id = item.getItemId();
switch (id){
case R.id.scan:
Log.e("test", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
scanBLEDevices(true);
ret = true;
break;
default:
ret = super.onOptionsItemSelected(item);
}
return ret;
}
private void scanBLEDevices(final boolean enable){
final BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();
final BLEScanCallback scanCallback = new BLEScanCallback();
if (enable){
// Stops scanning after a pre-defined scan period.
handler.postDelayed(new Runnable() {
@Override
public void run() {
scanning = false;
bluetoothLeScanner.stopScan(scanCallback);
}
}, SCAN_PERIOD);
scanning = true;
bluetoothLeScanner.startScan(scanCallback);
}else{
scanning = false;
bluetoothLeScanner.stopScan(scanCallback);
}
}
public class BLEScanCallback extends ScanCallback{
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
Log.e("Scan Success", "Scan Success");
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
Log.e("Scan Success", "Scan Success Batch");
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
Log.e("Scan Failed", "Error Code: " + errorCode);
}
}
最佳答案
事实证明,即使我从 list 中添加了 ACCESS_COURSE_LOCATION 权限,但这对于 API 23+ 来说还是不够的。我认为在较低的 api 版本中, list 中的请求就足够了。
我必须补充:
if (Build.VERSION.SDK_INT >= 23) {
if (this.checkSelfPermission(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 detect peripherals.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
}
});
builder.show();
}
}
关于java - 为什么 BluetoothLEScanner 不调用它的 ScanCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50242755/
我的蓝牙应用程序有问题。当我在启动应用程序之前启用蓝牙时,一切正常。但是当我不这样做时,我的应用程序会通过 turnOn 方法请求启用蓝牙的权限。但是当我按下我的 onScan 按钮时,我收到一条错误
我对 Android 和 Kotlin 很陌生,所以我可能会遇到一些非常简单的错误,但据我所知,当我调用 BluetoothLeScanner.startScan() 时,我创建的 ScanCallb
所以我尝试实现一个 BLE 扫描器。唯一的问题是我无法让它给我任何输出。这是我的代码: MainActivity.java public class MainActivity extends
我正在尝试实现一个应用程序,当拿着手机的人移动时启动 BLE 扫描,如果超过 10 秒没有移动则自动关闭,而移动检测工作正常 BLEscanner 出了点问题这是代码 import android.a
我想用 BluetoothLeAdvertiser 通过 android 传输 iBluetooth来自 android.bluetooth.le 的类(class).但我似乎无法设置某些制造商规范数
我正在 android 上使用 BLE 实现一个简单的广告 + 扫描功能,由于某种原因,我收到了很多通过同一设备的 onScanResult 回调调用。 用于广告: //Advertise setti
我正在尝试在一个简单的安卓应用程序中实现一个 BLE 扫描仪。我一直在关注: startLeScan replacement to current api和 https://developer.and
我正在使用我自己的 BLE 设备。在监听这些设备时,我想使用 ScanFilter,所以我只得到我感兴趣的设备。我现在的解决方案是在回调内部进行过滤,但如果可以进行这种过滤会更好更早并且根据规范应该是
我正在研究低蓝牙室内定位系统,并且一直在使用 https://github.com/inthepocket/ibeacon-scanner-android用于计算我的移动设备和多个 BLE 信标之间的
由于我在 Android Lollipop 上遇到蓝牙问题,我尝试更改扫描仪方法。 所以我尝试使用新包。 在以前的版本中,我调用了 startScan(mLeScanCallback) 并且一切正常,
我有一个 Android 应用用例,需要“连续”扫描 BLE 设备。 仅此一项要求就可能让我成为受虐狂,我猜这会让 Android 成为我的施虐狂。 我知道[我相信]仍未正式记录“30 秒内扫描不超过
我有一个 Android 应用用例,需要“连续”扫描 BLE 设备。 仅此一项要求就可能让我成为受虐狂,我猜这会让 Android 成为我的施虐狂。 我知道[我相信]仍未正式记录“30 秒内扫描不超过
在 Android 6.0 版本(API 23)中,我注意到 BluetoothLeScanner.startScan() 需要新的权限; ACCESS_COARSE_LOCATION 和/或 ACC
我正在尝试使用函数 BluatoothLeScanner.startScan 而不是已弃用的 BluetoothAdapter.startLeScan。昨天我将我的 Nexus 5 更新到了 Andr
我是一名优秀的程序员,十分优秀!