Android:持续位置更新

时间:2015-08-13 01:28:51

标签: android location android-pendingintent

我是Android的新手,正在处理我的第一个应用程序。我正在开发一个应用程序,它需要连续的位置更新并在谷歌地图上显示。这意味着无论应用程序是在前台还是在后台。

同样我使用的是融合位置API的requestLocationUpdates。同一个viz有两个版本:

  1. 当app位于前台时使用LocationListener
  2. 当app进入后台时使用pendingIntent。
  3. 因此,根据我的理解,我必须使用两者,因为我需要持续更新。所以我在我的应用程序中使用两者,因为我需要不断更新。

    但令人惊讶的是,我通过pendingIntent获得了requestLocationUpdates,并在前台提供了位置更新。所以我在这里很困惑,有时候将Location定位为NULL。

    请告诉我requestLocationUpdates与pendingIntent的确切行为是什么。它对前景和背景都有效吗?如果是,那么为什么我在某个时候将位置变为NULL。

    当我使用Locationreveiver时,另一个问题是,当应用程序处于前台时,我能够进行正确的位置更新,而我正在googlemap上绘制一条线。但我注意到我的线路与googlemap路线不同步。这是曲折的。所以我在这里感到困惑如果我得到持续更新,那么为什么m route与google route同步。

    我正在附加我的位置类的complecode。请帮忙

    public class LocationMapsActivity extends FragmentActivity implements
            LocationListener,
            OnMapReadyCallback,
            GoogleApiClient.ConnectionCallbacks,
            ComponentCallbacks2,
            GoogleApiClient.OnConnectionFailedListener {
    
    //*******************************member variables*********************************************
        private static final String TAG = "LocationActivity";
        private static final long INTERVAL = 1000 *02; //   1000*60*1  = 1 minute
        private static final long FASTEST_INTERVAL = 1000 *01 ;// 10 sec
        public  static LatLng mPrev = null;
        private double mCurrentDistance = 0;
        private double mTotalDistance = 0;
        private double mCurrentSpeed = 0;
        public static String stateOfLifeCycle = "";
        public static boolean wasInBackground = false;
        LocationRequest mLocationRequest;
        GoogleApiClient mGoogleApiClient;
        Location mCurrentLocation;
        Location mStartLocation;
        GoogleMap googleMap;
    
    
    //********************************************
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "onCreate ...............................");
    
            wasInBackground = false;
            stateOfLifeCycle = "Create";
    
            //show error dialog if GoolglePlayServices not available
            if (!isGooglePlayServicesAvailable()) {
                finish();
            }
            createLocationRequest();
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
    
            setContentView(R.layout.activity_map_location);
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
        }
        //*******************ComponentCallbacks2*************************
        @Override
        public void onTrimMemory(int level) {
            if (stateOfLifeCycle.equals("Stop")) {
            wasInBackground = true;
            }
            super.onTrimMemory(level);
            Toast.makeText(getApplicationContext(),
                    "Application OnTrimmemory ", Toast.LENGTH_SHORT)
            .show();
    
            }
    
    //****************Activity****************************
            @Override
        public void onStart() {
            Toast.makeText(getApplicationContext(),"OnStart ", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onStart fired ..............");
    
            stateOfLifeCycle = "Start";
            if (wasInBackground) {
                Toast.makeText(getApplicationContext(),"Application came to foreground",Toast.LENGTH_SHORT).show();
               wasInBackground = false;
            }
            super.onStart();
                if(!mGoogleApiClient.isConnected())
                   mGoogleApiClient.connect();
        }
    //********************Activity************************
        @Override
        public void onStop() {
            stateOfLifeCycle = "Stop";
            Log.d(TAG, "onStop fired ..............");
            stopLocationUpdates();
          //  mGoogleApiClient.disconnect();
            super.onStop();
            Toast.makeText(getApplicationContext(), "OnStop ", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "isConnected ...............: " + mGoogleApiClient.isConnected());
        }
        //**************Activity******************************
        @Override
        protected void onPause() {
            stateOfLifeCycle = "Pause";
            super.onPause();
            Toast.makeText(getApplicationContext(), "OnPause ", Toast.LENGTH_SHORT) .show();
        }
        //*******************Activity*************************
        @Override
        public void onResume() {
            Toast.makeText(getApplicationContext(),"OnResume ", Toast.LENGTH_SHORT).show();
    
            stateOfLifeCycle = "Resume";
            super.onResume();
            if (mGoogleApiClient.isConnected()) {
                startLocationUpdates();
                Log.d(TAG, "Location update resumed .....................");
            }
        }
        //*****************Activity***************************
        @Override
        public void onDestroy()
        {
            wasInBackground = false;
            stateOfLifeCycle = "Destroy";
            super.onDestroy();
            Toast.makeText(getApplicationContext(), "Application OnDestroy ", Toast.LENGTH_SHORT).show();
        }
        //******************OnMapReadyCallback**************************
        @Override
        public void onMapReady(GoogleMap map) {
            googleMap = map;
            googleMap.setMyLocationEnabled(true);
            googleMap.getUiSettings().setZoomControlsEnabled(true);
            //googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        }
        //*******************GoogleApiClient.ConnectionCallbacks*************************
        @Override
        public void onConnected(Bundle bundle) {
            Log.d(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
            startLocationUpdates();
        }
    
        //*******************GoogleApiClient.ConnectionCallbacks*************************
        @Override
        public void onConnectionSuspended(int i) {
    
        }
    
        //*****************GoogleApiClient.ConnectionCallbacks***************************
        @Override
        public void onConnectionFailed(ConnectionResult connectionResult) {
            Log.d(TAG, "Connection failed: " + connectionResult.toString());
        }
    
        //*****************LocationListener***************************
        // @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "Firing onLocationChanged..............................................");
            mCurrentLocation = location;
    
            LatLng current = new LatLng(location.getLatitude(), location.getLongitude());
            if(mPrev == null)  //when the first update comes, we have no previous points,hence this
            {
                mPrev=current;
                mStartLocation = location;
                addMarker();
            }
            else {
                CameraUpdate update = CameraUpdateFactory.newLatLngZoom(current, 17);
                googleMap.animateCamera(update);
    
                PolylineOptions pOptions = new PolylineOptions()
                        .width(7)
                        .color(Color.BLUE)
                        .visible(true);// .geodesic(true)
    
                pOptions.add(mPrev);
                pOptions.add(current);
                googleMap.addPolyline(pOptions);
    
                mPrev = current;
                current = null;
            }
        }
        //********************************************
        protected void createLocationRequest() {
            mLocationRequest = new LocationRequest();
            mLocationRequest.setInterval(INTERVAL);
            mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
            mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        }
    
    //********************************************
        private boolean isGooglePlayServicesAvailable() {
            int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
            if (ConnectionResult.SUCCESS == status) {
                Log.d(TAG, "isGooglePlayServicesAvailable ...............: SUCCESS"  );
                return true;
            } else {
                GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
                return false;
            }
        }
    
        //********************************************
        protected void startLocationUpdates() {
    
            //Get foreground location update
           /* PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
                    mGoogleApiClient, mLocationRequest, this);*/
    
            //Get background location update
    
            String proximitys = "ACTION";
            IntentFilter filter = new IntentFilter(proximitys);
            getApplicationContext().registerReceiver(new LocationReceiver() , filter);
            Intent intent = new Intent(proximitys);
    
            //  Intent intent = new Intent(this, LocationReceiver.class);
            PendingIntent locationIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, locationIntent);
    
        }
        //********************************************
    
        public void HandleLocationChanged(Location location) {
            Log.d(TAG, "Firing HandleLocationChanged..............................................");
           // Toast.makeText(getApplicationContext(), "HandleLocationChanged", Toast.LENGTH_LONG).show();
    
            if(location == null)
            {
                Toast.makeText(getApplicationContext(), "location is null", Toast.LENGTH_LONG).show();
                return;
            }
            mCurrentLocation = location;
    
            LatLng current = new LatLng(location.getLatitude(), location.getLongitude());
            if(mPrev == null)  //when the first update comes, we have no previous points,hence this
            {
                mPrev=current;
                mStartLocation = location;
                addMarker();
            }
            else {
                CameraUpdate update = CameraUpdateFactory.newLatLngZoom(current, 17);
                googleMap.animateCamera(update);
    
                PolylineOptions pOptions = new PolylineOptions()
                        .width(7)
                        .color(Color.BLUE)
                        .visible(true);// .geodesic(true)
    
                pOptions.add(mPrev);
                pOptions.add(current);
                googleMap.addPolyline(pOptions);
    
                mPrev = current;
                current = null;
            }
        }
    
    
    //********************************************
        public String getAddress( )
        {
            Geocoder geocoder = new Geocoder(this);
            String addressLineTemp=null;
            List<Address> addresses;
            try {
                addresses = geocoder.getFromLocation(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude(), 1);
                if (addresses.size() > 0) {
                    addressLineTemp = addresses.get(0).getAddressLine(0);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return addressLineTemp;
        }
    //********************************************
        private void addMarker() {
    
            MarkerOptions options = new MarkerOptions();
            LatLng currentLatLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
            options.position(currentLatLng);
            Marker mapMarker = googleMap.addMarker(options);
            mapMarker.setTitle(getAddress());
            Log.d(TAG, "Marker added.............................");
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng,
                    13));
            Log.d(TAG, "Zoom done.............................");
        }
    
    //********************************************
        protected void stopLocationUpdates() {
            LocationServices.FusedLocationApi.removeLocationUpdates(
                    mGoogleApiClient, this);
            Log.d(TAG, "Location update stopped .......................");
        }
    
    
    //********************************************
    
      public  class LocationReceiver extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent)
            {
    
                Log.d(TAG, "Firing LocationReceiver....onReceive..........................................");
                Location location = (Location) intent.getExtras().get(LocationServices.FusedLocationApi.KEY_LOCATION_CHANGED);
                HandleLocationChanged(location);
            }
        }
    

0 个答案:

没有答案