У меня есть приложение, которое получает текущее местоположение пользователей, а затем загружает карту Google и отображает маркеры, представляющие интерес в их районе. Он работает безупречно на всем, что находится ниже Зефира. Я добавил проверку разрешений во время выполнения, и они устанавливаются по мере того, как я получаю приглашение, и после того, как я нажал кнопку «Принять», я вижу разрешение, указанное в описании приложения, в настройках телефона. Тем не менее, я не могу за всю жизнь понять, почему я не возвращаюсь назад.Android Marshmallow getLastLocationLocation/LocationListeners не работает
Я использую пример, как показано здесь https://developer.android.com/training/location/retrieve-current.html
Я все разрешения, установленные с тегом в манифесте. У меня даже есть Fragment, реализующий LocationListener. Однако метод onLocationChanged никогда не вызван. Я зову его в методе onConnected от клиента API Google, как показано ниже ..
@Override
public void onConnected(@Nullable Bundle bundle) {
try {
Log.d("MYAPPTAG","isConnected: " + mGoogleApiClient.isConnected());
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
myLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
} catch (SecurityException ex) {
myLocation = null;
}
}
onConnected метод не дозвонились, потому что я получаю свой лог в консоль. Однако myLocation всегда имеет значение null. Я получаю сообщение в консоли каждый раз я называю getLastLocation, что говорит
No Location to return for getLastLocation()
GoogleSignatureVerifier: com.myappname.android signature not valid. Found: LONG KEY HERE
Есть ли что-то особенное, что нужно сделать в Зефир?
мой метод OnLocationChanged
@Override
public void onLocationChanged(Location location) {
myLocation = location;
Log.d("MYAPPTAG", "LocatinChngListner, loc: " + location.getLatitude() + "," + location.getLongitude());
}
AndroidManifest.xml - права раздела (выше узла)
<!--- App permissions -->
<permission android:name="com.myappname.android.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
<uses-permission android:name="com.myappname.android.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.myappname.android.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myappname.android.permission.C2D_MESSAGE"/>
OnCreate Метод фрагмент
createLocationRequest();
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
createLocationRequest метод
private void createLocationRequest(){
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(5000);
mLocationRequest.setFastestInterval(1000);
}
OnStart() OnStop() методы
@Override
public void onStart() {
if (!mGoogleApiClient.isConnected()) mGoogleApiClient.connect();
super.onStart();
}
@Override
public void onStop() {
if (mGoogleApiClient.isConnected()) mGoogleApiClient.disconnect();
super.onStop();
}
Я называю этот код ниже сразу после метода Фрагмент OnCreate
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1 && (ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)) {
requestPermissions(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }, REQUEST_PERMISSION_USER_LOCATION);
} else {
googleMapsLocationPermissionContainer.setVisibility(View.GONE);
getUserLocationAndInitializeMap();
}
googleMapsLocationPermissionContainer является просто макет, который я накладываю на карту, пока не будут предоставлены разрешения.
getUserLocationAndInitializeMap()
try {
MapsInitializer.initialize(getActivity());
// Set reference for map object
if (map == null) {
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
// Here I set the map to invisible then after I plot all the markers I set it to visible again
mapFragment.getView().setVisibility(View.INVISIBLE);
}
} catch (Exception e) {
// Show the google maps alert dialog
showGoogleMapsErrorDialog();
}
Показать больше кода. Я делаю приложение с местоположением и отлично работает на 6.0. Моя первоначальная догадка заключается в том, что вам нужны разрешения манифеста для android 6.0. В Android-23 это совсем другое дело. –
@AndreiT - какие разрешения явных в 23+? – Phil
Что-то вроде этого: https://developer.android.com/training/permissions/requesting.html. У меня также было все, и в Android-6 он просто не работал, потому что мне не хватало разрешений и т. Д. –