Android 在谷歌地图中,当应用程序从最小化状态最大化时,为什么不再调用OnLocationChanged()?
我正在开发一个Android应用程序。我将谷歌地图集成到一个片段中 我的问题Android 在谷歌地图中,当应用程序从最小化状态最大化时,为什么不再调用OnLocationChanged()?,android,google-maps,android-fragments,gps,google-maps-android-api-2,Android,Google Maps,Android Fragments,Gps,Google Maps Android Api 2,我正在开发一个Android应用程序。我将谷歌地图集成到一个片段中 我的问题 在地图中,在正常运行状态下,OnLocationChanged函数由LocationListener调用,我的地图标记正在正确移动 但是,如果我最小化了应用程序,在我最大化它之后,标记就不会移动了。我检查发现,在最大化应用程序后,OnLocationChanged不会被调用 所以我在onLocationChanged中放了一些Log.D命令,然后重新运行它 在最小化应用程序之前,每个位置上的日志都会更改。但在我最小化和
在地图中,在正常运行状态下,
OnLocationChanged
函数由LocationListener
调用,我的地图标记正在正确移动
但是,如果我最小化了应用程序,在我最大化它之后,标记就不会移动了。我检查发现,在最大化应用程序后,OnLocationChanged不会被调用
所以我在onLocationChanged中放了一些Log.D命令,然后重新运行它
在最小化应用程序之前,每个位置上的日志都会更改。但在我最小化和最大化应用程序后,日志打印停止,标记停止移动
我解决问题的努力我尝试在片段中实现OnResume方法,但它没有被调用 所以我在网上搜索。根据这些建议,我在片段父活动的onResume方法上重新创建了片段 在那之后,即使在恢复之后,跟踪仍然有效。但我遇到了另一个问题 当在父活动的onResume()中重新创建片段时,映射将从头开始加载。那是显示全世界地图的地图。。。。。然后它慢慢地移动到当前位置,清除旧标记,重新绘制新标记。在那之后,标记开始移动 所以这个过程需要很长时间 现在我不能再往前走了。因为我不熟悉谷歌地图,所以无法修复它 我的代码: Map_Fragment.java
/**
* A simple {@link Fragment} subclass.
*/
public class Map_Fragment extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, LocationSource,
GoogleApiClient.OnConnectionFailedListener, GeoQueryEventListener, ValueEventListener,LocationListener {
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;
private GoogleMap mMap;
LocationManager locationManager;
RelativeLayout toolbarLayout;
String driverId = "5acgh565733";
RelativeLayout progressLayout1, progresslayout, onlinelay;
String tripState, onlinecheck;
FrameLayout fragmentcontainer;
TextView onlineTxt;
SharedPreferences.Editor editor;
String onlinestatus;
View mapView;
Bitmap mapBitmap;
Marker mCurrLocationMarker;
CameraUpdate cameraUpdate = null;
Location mLastLocation;
private GoogleApiClient mGoogleApiClient;
private OnLocationChangedListener mMapLocationListener = null;
LocationRequest mLocationRequest;
Dialog d, dialogTripSummary, dialog;
ProgressWheel pwOne;
ImageView requestMapView;
ArrayList<LatLng> MarkerPoints;
Location mCurrentLocation, lStart, lEnd;
RelativeLayout FAB;
GeoFire geoFire;
BottomBar bottomBar;
boolean clicked = false;
public Map_Fragment() {
// Required empty public constructor
}
@SuppressLint("CommitPrefEdits")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_map, container, false);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
toolbarLayout = view.findViewById(R.id.toolbar);
onlinelay = view.findViewById(R.id.onlinelay);
onlineTxt = view.findViewById(R.id.onlineTxt);
FAB = view.findViewById(R.id.myLocationButton);
toolbarLayout.setVisibility(View.VISIBLE);
bottomBar=(BottomBar)getActivity().findViewById(R.id.bottomBar);
editor = this.getActivity().getSharedPreferences(Constants.MY_PREFS_NAME, getActivity().MODE_PRIVATE).edit();
if(mCurrentLocation!=null){
LatLng latLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
System.out.println("INSIDE LOCAION CHANGE" + mCurrentLocation.getLatitude() + mCurrentLocation.getLongitude());
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(latLng) // Sets the center of the map to current location
.zoom(15)
.tilt(0) // Sets the tilt of the camera to 0 degrees
.build();
mMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.mipmap.car))
.position(latLng));
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
checkOnlineStatus();
}
fabmethod();
onlinelay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Toast.makeText(getActivity(), "Online Clicked", Toast.LENGTH_SHORT).show();
setOnlineStatus();
}
});
return view;
}
@Override
public void onConnected(@Nullable Bundle bundle) {
if(mCurrentLocation!=null){
LatLng latLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
System.out.println("INSIDE LOCAION CHANGE" + mCurrentLocation.getLatitude() + mCurrentLocation.getLongitude());
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(latLng) // Sets the center of the map to current location
.zoom(15)
.tilt(0) // Sets the tilt of the camera to 0 degrees
.build();
mMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.mipmap.car))
.position(latLng));
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
}
@Override
public void onConnectionSuspended(int i) {}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {}
@Override
public void onLocationChanged(Location location) {
mCurrentLocation = location;
Log.D(TAG,"You moved.. The current lat is "+location.getLatitude());
if (mCurrLocationMarker != null) {
mCurrLocationMarker.remove();
}
//Place current location marker
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title("Current Position");
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.car));
mCurrLocationMarker = mMap.addMarker(markerOptions);
updateLocationToFirebase(location);
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mMapLocationListener = onLocationChangedListener;
}
@Override
public void deactivate() {}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.getMinZoomLevel();
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
mMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
@Override
public void onCameraMove() {
FAB.setVisibility(View.INVISIBLE);
toolbarLayout.setVisibility(View.INVISIBLE);
bottomBar.setVisibility(View.GONE);
}
});
mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
@Override
public void onCameraIdle() {
FAB.setVisibility(View.VISIBLE);
bottomBar.setVisibility(View.VISIBLE);
toolbarLayout.setVisibility(View.VISIBLE);
}
});
//Initialize Google Play Services
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
//Location Permission already granted
buildGoogleApiClient();
// mMap.setMyLocationEnabled(true);
} else {
//Request Location Permission
checkLocationPermission();
}
} else {
buildGoogleApiClient();
//mMap.setMyLocationEnabled(true);
}
// System.out.println("INSIDE LOCAION CHANGE" + mCurrentLocation);
if(mCurrentLocation!=null){
LatLng latLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
System.out.println("INSIDE LOCAION CHANGE" + mCurrentLocation.getLatitude() + mCurrentLocation.getLongitude());
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(latLng) // Sets the center of the map to current location
.zoom(15)
.tilt(0) // Sets the tilt of the camera to 0 degrees
.build();
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, Map_Fragment.this);
}
}
}
Toast.makeText(getActivity(),"Retriving current location. Please Wait...",Toast.LENGTH_LONG).show();
}
@Override
public void onDataChange(DataSnapshot dataSnapshot) {}
@Override
public void onCancelled(DatabaseError databaseError) {}
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
}
public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
private void checkLocationPermission() {
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)) {
new AlertDialog.Builder(getActivity())
.setTitle("Location Permission Needed")
.setMessage("This app needs the Location permission, please accept to use location functionality")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//Prompt the user once explanation has been shown
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_LOCATION );
}
})
.create()
.show();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_LOCATION );
}
}
}
public void fabmethod() {
FAB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCurrentLocation != null) {
LatLng latLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
System.out.println("INSIDE LOCAION CHANGE" + mCurrentLocation.getLatitude() + mCurrentLocation.getLongitude());
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(latLng) // Sets the center of the map to current location
.zoom(15)
.tilt(0) // Sets the tilt of the camera to 0 degrees
.build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
else{
Toast.makeText(getApplicationContext(),"mmap not Added", Toast.LENGTH_SHORT).show();
}
}
});
}
public void onPause() {
super.onPause();
//stop location updates when Activity is no longer active
if (mGoogleApiClient != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
}
}
}
在上面的程序中,onResume()方法重新创建映射,因为
碎片重新生成。因此,加载地图需要时间。
最后一句话
请帮助我在最大化应用程序后继续启用跟踪位置
if ( mGoogleApiClient!=null && mLocationRequest!=null )
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
在MapActivity的onResume()方法中添加此代码 你有没有花时间研究这个?这里有一个问题看起来可能会有所帮助:@TimBiegeleisen当我使用RequestLocationUpdate时,它显示requestlocationupdates()将错误显示为“无法解析方法”requestlocationupdates(java.lang.String,int,int,driver.arcreloaded.cogzidel.com.arcnereloaded_driver.Map_片段)..@TimBiegeleisen..上面的问题说明onLocationChanged只在时间上调用..但我的问题不同。在我最小化和最大化应用程序之前,它会一直调用。也就是说,如果我不最小化应用程序,就不会发生问题。onLocationChanged称为perfectlyYour fragment(Map_fragment.java)通过删除位置更新来实现“onPause”,这样当最小化时它自然会停止提供位置更新。假设未调用onResume片段(看起来很奇怪)然后,与其在活动的onResume中重新创建片段,不如在片段中添加一个方法,以注册位置更新并在活动的onResume中调用。创建片段时,请保留该片段引用。如果活动最终再次执行onCreate,则必须在所有状态c下重新创建片段-添加调试全能球员。
if ( mGoogleApiClient!=null && mLocationRequest!=null )
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);