在谷歌地图中,​​当应用程序从最小化状态最大化时,为什么不再调用OnLocationChanged()?

时间:2018-02-17 07:33:34

标签: android google-maps android-fragments gps google-maps-android-api-2

我正在开发Android应用程序。我将谷歌地图集成在片段中。

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

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

所以我在onLocationChanged中添加了一些Log.D表示并重申它。

在最小化应用程序之前,日志表示对每个位置的记录都有所改变。但在我最小化并最大化应用程序后,日志打印停止并且标记停止移动。

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

所以我搜索了互联网。基于这些建议,我在Fragment的父Activity的onResume方法上重新创建了Fragment。

之后,即使在恢复后,跟踪仍然有效。但我陷入了另一个问题。

当Fragment在父Activity的onResume()中重新创建时,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);
        }
    }

} 
  

在上面的程序中,恢复后没有调用onLocationChanged。


MainActivity.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();
    }
}
  

在上面的程序中,onResume()方法重新创建了Map   片段重新创建。因此Map需要时间来加载。   


最后的话
即使在最大化应用程序

之后,请帮助我连续启用跟踪位置

1 个答案:

答案 0 :(得分:0)

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

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