Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BluetoothLescan()找不到任何设备_Java_Android_Android Ble - Fatal编程技术网

Java BluetoothLescan()找不到任何设备

Java BluetoothLescan()找不到任何设备,java,android,android-ble,Java,Android,Android Ble,我在使用三星Galaxy s5进行蓝牙设备扫描时遇到了一些问题 我使用的是Android 6.0,并已设置我的应用程序的扫描权限,如下所示: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) // Android M Permission check if (this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE

我在使用三星Galaxy s5进行蓝牙设备扫描时遇到了一些问题

我使用的是Android 6.0,并已设置我的应用程序的扫描权限,如下所示:

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();
            }
我认为这是正确的工作,因为我得到了弹出窗口,要求我接受的权限

我的扫描功能:

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正在给我日志。但它只是找不到任何真正奇怪的设备,因为我坐在笔记本电脑和第二部手机旁边,这两部手机都启用了蓝牙

顺便说一下,如果有人感兴趣,这是我的回电:

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);
    }
};
我已将正确的权限添加到清单中:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />


我尝试了几乎所有的可能性,并开始认为我手机上的蓝牙可能会以某种方式被破坏,这很奇怪,因为我可以在Android设置中手动检测并连接到设备。

我在Android 6.0 API中发现了这一点:

改进的蓝牙低能量扫描


如果您的应用程序执行蓝牙低能量扫描,请使用新的setCallbackType()方法指定您希望系统在首次找到或很长时间后看到与set-ScanFilter匹配的广告包时通知回调。这种扫描方法比以前的平台版本更省电。

如果您正在扫描诸如心率监视器或接近传感器之类的BLE设备,您的代码应该可以正常工作。问题可能是,使用此代码,您的应用程序就是GATT客户端,正在搜索GATT服务器


因此,如果你想连接到另一部手机,你可以编写一个GATT服务器应用程序,并在另一部手机上运行它(如最后一段所示)

谷歌提供了完整的文档,你可以查看它:


既然你已经在安卓6上试过了,你也试过给予定位许可吗?从安卓6开始,在扫描可移动设备时必须启用定位。因此,您需要为location请求运行时权限,同时确保location services也已启用(设置>位置>打开),就好像该功能已关闭一样,即使您具有位置“权限”,您也不会收到任何扫描结果。看起来您的超时设置为大约10秒,对吗?如果在调用其中一个回调之前让它继续,会发生什么情况?@kcoppock我尝试过启用它,但这似乎并不重要,扫描时仍然没有结果。@DanielNugent Ye过去扫描大约10秒,尝试将其增加到100,没有什么不同。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />