Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在谷歌地图中,当应用程序从最小化状态最大化时,为什么不再调用OnLocationChanged()?_Android_Google Maps_Android Fragments_Gps_Google Maps Android Api 2 - Fatal编程技术网

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

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命令,然后重新运行它 在最小化应用程序之前,每个位置上的日志都会更改。但在我最小化和

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

我的问题
在地图中,在正常运行状态下,
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);