Android找不到任何BLE设备

Pat*_*cks 2 android bluetooth bluetooth-lowenergy

这是他的问题。我为iOS开发了一个应用程序,用于控制BLE LED设备(以及其他一些东西)。一切正常且流畅。现在我想为Android开发同一个应用程序,但是我在扫描BLE设备时已经失败了。我已经尝试了一些教程和示例代码,但是无论如何我都找不到任何设备。我正在玩Moto G4 Play。蓝牙可以使用,我可以在设置中配对设备,但无法与我尝试过的任何示例代码/教程一起使用。例如以下示例:https : //github.com/kaviles/BLE_Tutorials

我按原样构建了此应用,但找不到任何东西。

因此,我从Playstore下载了BLE扫描仪,该扫描仪可以很好地工作并找到所有设备。

我知道没有任何示例代码很难说,但是我已经尝试了很多,而且我不确定是否会错过一些基本的东西。

zed*_*zed 5

如评论中所述,如果targetSdk为23+或其他,则必须相应地设置权限。定位服务必须打开。

API 23+的清单权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Run Code Online (Sandbox Code Playgroud)

要检查蓝牙权限:

    public boolean hasBlePermissions() {
        if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED ||
                ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION)
                        != PackageManager.PERMISSION_GRANTED) {
            return false;
        } else {
            return true;
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用以下命令请求运行时权限:

public void requestBlePermissions(final Activity activity, int requestCode) {
    ActivityCompat.requestPermissions(activity,
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
            requestCode);
}
Run Code Online (Sandbox Code Playgroud)

然后查看来自的资助结果OnRequestPermissionResult

public boolean checkGrantResults(String[] permissions, int[] grantResults) {
    int granted = 0;

    if (grantResults.length > 0) {
        for(int i = 0; i < permissions.length ; i++) {
            String permission = permissions[i];
            if (permission.equals(Manifest.permission.ACCESS_FINE_LOCATION) ||
                    permission.equals(Manifest.permission.ACCESS_COARSE_LOCATION)) {
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    granted++;
                }
            }
        }
    } else { // if cancelled
        return false;
    }

    return granted == 2;
}
Run Code Online (Sandbox Code Playgroud)

检查定位服务:

public boolean areLocationServicesEnabled(Context context) {
    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    try {
        return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
                locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)