Я использую Android Beacon Library. Начиная с Marshmallow, я вижу следующую ошибку, как ожидалось и задокументировано.
Отказ в разрешении: требуется разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION для получения результатов сканирования
У меня есть код ранжирования во фрагменте, и RuntimeException выдается, когда фрагмент отображается на экране, как и ожидалось, поскольку я не запрашиваю разрешение. Если я нажимаю кнопку «Домой», вызывается Pause, и я отключаю beaconManager, и исключение больше не генерируется, как и ожидалось. Возвращаясь к Activity из предыдущего списка приложений, исключение RuntimeException выдается снова при каждом сканировании.
Почему возникает исключение, когда на переднем плане, даже если я добавил разрешение в AndroidManifest?
Согласно документации ЗДЕСЬ, вам нужно только предложить пользователю разрешение местоположения, если вы выполняете сканирование в фоновом режиме?
вы получите следующую ошибку в LogCat, когда попытаетесь выполнить сканирование Bluetooth в фоновом режиме, и маяки не будут обнаружены
Означает ли это ТОЛЬКО фоновое сканирование, или я неверно истолковываю документацию, и вы все равно должны запрашивать? Я хочу избежать дополнительных (возможно, отталкивающих нервных пользователей) запроса разрешения внутри приложения, если этого можно избежать !!
Мой манифест содержит -
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Мой фрагмент кода из фрагмента -
public class NearMeNowFragment extends Fragment implements BeaconConsumer {
//Beacon manager stuff
private BeaconManager beaconManager;
<SNIP>
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
beaconManager = BeaconManager.getInstanceForApplication(getActivity());
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.near_me_now, container, false);
//Set up beacon stuff if Bluetooth available
if (verifyBluetooth(false)) {
beaconManager.bind(this);
}
<SNIP>
return rootView;
}
/***************************
Beacon config methods
****************************
*/
@Override
public void onBeaconServiceConnect() {
//update all scan periods
beaconManager.setForegroundScanPeriod(1100l);
beaconManager.setForegroundBetweenScanPeriod(8900l);
beaconManager.setAndroidLScanningDisabled(true);
try {
beaconManager.updateScanPeriods();
} catch (RemoteException e) {
e.printStackTrace();
}
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
<SNIP>
//handling beacons here
...
} else {
Log.i(TAG, "ZERO BEACONS IN SCAN");
}
}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region(TAG, null, null, null));
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public Context getApplicationContext() {
return getActivity().getApplicationContext();
}
@Override
public void unbindService(ServiceConnection serviceConnection) {
getActivity().unbindService(serviceConnection);
}
@Override
public boolean bindService(Intent intent, ServiceConnection serviceConnection, int mode) {
return getActivity().bindService(intent, serviceConnection, mode);
}
@Override
public void onPause() {
super.onPause();
if(beaconManager.isBound(this)){
beaconManager.unbind(this);
}
}
@Override
public void onResume() {
super.onResume();
beaconManager.bind(this);
}
@Override
public void onDestroy() {
super.onDestroy();
if(beaconManager.isBound(this)){
beaconManager.unbind(this);
}
}
}
Моя фактическая ошибка Logcat
W / Binder ﹕ Обнаружено исключение RuntimeException из реализации заглушки связующего. java.lang.SecurityException: требуется разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION для получения результатов сканирования