gpt4 book ai didi

android - 在 Google map 中,当应用程序从最小化状态最大化时,为什么不再调用 OnLocationChanged()?

转载 作者:行者123 更新时间:2023-11-29 02:32:24 24 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序。在那里,我将 Google map 集成到一个 Fragment 中。

我的问题
在 map 中,在正常运行状态下,LocationListener 调用的 OnLocationChanged 函数和我的 map 标记正在正确移动。

但是,如果我将应用程序最小化并在最大化之后,标记不会移动。我检查并发现,在最大化应用程序后没有调用 OnLocationChanged。

所以我在 onLocationChanged 中放置了一些 Log.D commended 并重新运行它。

直到最小化应用程序,日志表彰在每个位置发生变化。但是在我最小化和最大化应用程序之后,日志打印停止并且标记停止移动。

我努力解决
我尝试在 Fragment 中实现 OnResume 方法,但它没有被调用。

所以我在网上搜索了一下。根据建议,我在 Fragment 的父 Activity 的 onResume 方法上重新创建了 Fragment。

在那之后,跟踪即使在恢复后也能正常工作。但是我陷入了另一个问题。

当 Fragment 在父 Activity 的 onResume() 中重新创建时,Map 从头开始​​加载。那是显示整个世界地图的 map ..... 然后它慢慢地转到当前位置,清除旧标记并再次绘制新标记。在该标记开始移动之后。

所以这个过程需要很长时间。

现在我不能再往前走了。由于我是 Google map 的新手,我无法修复它..

我的代码:

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);
}
}

}

In the above Program , the onLocationChanged not called after resuming.


主 Activity .java

public class MainActivity extends FragmentActivity {

BottomBar bottomBar;
Fragment fragment =null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
bottomBar = (BottomBar) findViewById(R.id.bottomBar);
bottomBar.setVisibility(View.VISIBLE);
bottomBar.setOnTabSelectListener(new OnTabSelectListener() {
@Override
public void onTabSelected(@IdRes int tabId) {
if (tabId == R.id.tab_profile) {
fragment = new Viewprofile_Fragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();

}

if (tabId == R.id.tab_rating) {

fragment = new Ratings_Fragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();
}

if (tabId == R.id.tab_earning) {

fragment = new Earnings_Fragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();
}
if (tabId == R.id.tab_home) {
fragment = new Map_Fragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();
}
}
});
}

@Override
public void onResume(){
super.onResume();
fragment = new Map_Fragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();
}
}

In the above program, the onResume() ,method recreates the Map since the Fragment recreated. So the Map takes time to load.


最后的话
请帮助我即使在最大化应用程序后也能持续启用跟踪位置

最佳答案

 if ( mGoogleApiClient!=null  && mLocationRequest!=null )  
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

将此代码添加到 MapActivity 的 onResume() 方法中。

关于android - 在 Google map 中,当应用程序从最小化状态最大化时,为什么不再调用 OnLocationChanged()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48839065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com