Возвращает нулевой указатель в методе getCurrrentLocation()
. Как это исправить в моем случае?
Заранее благодарю за помощь!
Код:
public class CreateRoom extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
GoogleMap.OnMarkerDragListener,
GoogleMap.OnMapLongClickListener,
GoogleMap.OnMarkerClickListener,
View.OnClickListener {
private static final String STATUS_FAIL = "failed";
private static final String STATUS_SUCCESS = "success";
EditText editTextNewRoomTitle;
GoogleMap mMap;
private GoogleApiClient googleApiClient;
AsyncHttpClient client = new AsyncHttpClient();
LocationRequest locationRequest;
User user;
Room room = null;
private double longitude;
private double latitude;
LocationManager locationManager;
public static CreateRoom newInstance() {
CreateRoom fragment = new CreateRoom();
fragment.setArguments(new Bundle());
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i("fg", "onCreate");
super.onCreate(savedInstanceState);
user = getArguments().getParcelable("user");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i("fg", "onCreateView");
View view = inflater.inflate(R.layout.create_room, container, false);
editTextNewRoomTitle = (EditText) view.findViewById(R.id.editTextNewRoomTitle);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager()
.findFragmentById(R.id.mapToday);
mapFragment.getMapAsync(this);
return view;
}
@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
Log.i("fg", "onViewCreated");
googleApiClient = new GoogleApiClient.Builder(getContext())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public void onStart() {
Log.i("fg", "onStart");
super.onStart();
googleApiClient.connect();
}
@Override
public void onMapReady(GoogleMap googleMap) {
Log.i("fg", "onMapReady");
mMap = googleMap;
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
mMap.setOnMarkerDragListener(this);
mMap.setOnMapLongClickListener(this);
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.i("fg", "onConnected");
getCurrentLocation();
}
@Override
public void onClick(View v) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onMapLongClick(LatLng latLng) {
mMap.addMarker(new MarkerOptions().position(latLng).draggable(true));
}
@Override
public boolean onMarkerClick(Marker marker) {
return true;
}
@Override
public void onMarkerDragStart(Marker marker) {
}
@Override
public void onMarkerDrag(Marker marker) {
}
@Override
public void onMarkerDragEnd(Marker marker) {
latitude = marker.getPosition().latitude;
longitude = marker.getPosition().longitude;
//move to current position
moveMap();
}
private void getCurrentLocation() {
if (ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
//Getting longitude and latitude
longitude = location.getLongitude();
latitude = location.getLatitude();
//moving the map to location
moveMap();
}
}
@Override
public void onStop() {
super.onStop();
googleApiClient.disconnect();
}
private void moveMap() {
Log.i("fg", "moveMap");
/**
* Creating the latlng object to store lat, long coordinates
* adding marker to map
* move the camera with animation
*/
LatLng latLng = new LatLng(latitude, longitude);
mMap.addMarker(new MarkerOptions()
.position(latLng)
.draggable(true)
.title(""));
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
mMap.animateCamera(CameraUpdateFactory.zoomTo(15));
mMap.getUiSettings().setZoomControlsEnabled(true);
}
}
Manifest permissions:
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<!--
The following two permissions are not required to use
Google Maps Android API v2, but are recommended.
-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<permission
android:name="com.example.uncolor.lobsang.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.uncolor.lobsang.permission.MAPS_RECEIVE" />
Для того, чтобы можно было использовать последнее местоположение нужно заранее получить первоначальное местоположение.
Теперь к сути
1 момент:
getCurrentLocation()
- хорошее название для метода, а главное логичное, но код, который в нем лежит, а именно:
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
//Getting longitude and latitude
longitude = location.getLongitude();
latitude = location.getLatitude();
//moving the map to location
moveMap();
}
Должен находится в заведомо готовом методе OnLocationChanged()
OnLocationChanged()
- Вызывается автоматически, когда местоположение изменилось.
@Override
public void onLocationChanged(Location location) {
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
//Getting longitude and latitude
longitude = location.getLongitude();
latitude = location.getLatitude();
//moving the map to location
moveMap();
}
}
P.S. предварительно implements LocationListener
2 момент:
Отсутствует: mMap.setMyLocationEnabled(true);
в методе onMapReady()
.
Вообще отсутствует...
3 момент:
Не наблюдаю в коде запроса на обновление местоположения.
@Override
public void onConnected(@Nullable Bundle bundle) {
mLocationRequest = new LocationRequest().setInterval(1).setFastestInterval(1).setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте, не могу найти файл и вызвать егоесть проект структура папок -
Я использую web-socket и необходимо получить объект который будет доступен и в @ClientEndpoint и @ServerEndpoint и желательно не статическийВозможно ли это...
Здравствуйте, я пытаюсь зашифровать некую строку текста encrypt а затем расшифровать decrypt, попробовав пример кода в Intellij IDEA все сработало замечательно,...