使用定位服务更新 google 地图

Update google map using location service

我有一个 LocationService,它在后台获取用户位置并向 activity 发送带有纬度和经度的广播。 这是在这个问题的已接受答案中找到的代码 Background service with location listener in android

我使用 Android Studio 提供的 Google 地图 Activity 创建了项目。在地图中Activity 我得到这样的广播额外内容

public class newMessage extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equalsIgnoreCase(LocationService.BROADCAST_ACTION)) {
                Bundle extra = intent.getExtras();
                latitude = extra.getDouble("Latitude");
                longitude = extra.getDouble("Longitude");

                System.out.println("Latitude: "+latitude);
                System.out.println("Longitude: "+longitude);

                LatLng newLocation = new LatLng(latitude,longitude);
            }
        }
    }

我现在想用新位置更新地图,但我不知道该怎么做。我当前的设置是否可行?

您需要创建一个 locationService,您可以在其中获取当前位置。检查这个例子:

public class LocationService extends Service implements
        LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    private static final String TAG = LocationService.class.getSimpleName();
    protected GoogleApiClient mGoogleApiClient;
    protected LocationRequest mLocationRequest;
    protected Location mCurrentLocation;

    @Override
    public void onCreate() {

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        buildGoogleApiClient();
        mGoogleApiClient.connect();
        return START_NOT_STICKY;
    }

    @Override
    public void onConnected(Bundle bundle) {
        Log.i("fixedrec", TAG + ">Connected to GoogleApiClient");
        if (mCurrentLocation == null) {
            mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
        }
        startLocationUpdates();
    }

    @Override
    public void onConnectionSuspended(int i) {

    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
        mGoogleApiClient.disconnect();
        Log.d("fixedrec", TAG+ ">StoppingService");
        mNM.cancel(NOTIFICATION);
        stopForeground(true);
    }

    @Override
    public void onLocationChanged(Location location) {
       //plase where you get your locations
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.d("fixedrec", TAG + "> Connection failed: ConnectionResult.getErrorCode() = "
                + connectionResult.getErrorCode());
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    protected void startLocationUpdates() {
        LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient, mLocationRequest, this);
        Log.i("fixedrec", TAG + "> StartLocationUpdates");
    }


    protected synchronized void buildGoogleApiClient() {
        Log.i("fixedrec", TAG + "> Building GoogleApiClient");
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10000);
        mLocationRequest.setFastestInterval(5000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }
}

要在应用程序中广播您的位置,您可以使用 BroadCastReceiver 或像 Otto 这样的 EventBus。 然后只需创建一个 googleMap 并向其添加一个带有获取位置的标记。

如果您正在处理 SDK >=23

,请不要忘记在您的清单文件和代码中写入 locationPermissions

你也可以研究这个项目。 Fixedrec3

这里应有尽有。

在activity中声明广播接收器并显示当前位置的标记

public BroadcastReceiver locationUpdateReceiver = new  BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {
            //show current location marker
mMap.addMarker(new MarkerOptions().position(/*your lat long*/).title("My Location")));
        }
    };