Как обсуждалось в комментариях, вы должны соответствующим образом настроить разрешения, если ваш targetSdk равен 23+ или другому. Услуги определения местоположения должны быть включены.
Manifest разрешений для 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"/>
Для проверки прав доступа Bluetooth:
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;
}
}
Просить разрешения во время выполнения с:
public void requestBlePermissions(final Activity activity, int requestCode) {
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
requestCode);
}
Затем, чтобы проверить результаты грантов от 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;
}
услуги Проверить местоположение:
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;
}
}
Проверьте разрешения приложения. Проверьте разрешения SDK 23, потому что вам нужны разрешения на размещение. Убедитесь, что службы определения местоположения включены. Кроме этого, проверьте, что ваш код в порядке! – zed
Я установил все разрешения, но это все равно не сработает. В соответствии с этим: https://code.google.com/p/android/issues/detail?id=196485 кажется, что это довольно проблема. – Patricks
Это не проблема, это предполагаемое поведение, потому что устройства BLE могут выдавать Информация о местонахождении. Вы должны добавить разрешения служб местоположения, а если вы создаете против API 23+, вы должны запросить разрешения во время выполнения. – zed