在服务中实施Google Location Services API

时间:2017-12-10 14:38:00

标签: android android-studio android-service android-location google-location-services

我已在服务中实施了Google位置服务,以便我可以在后台获取位置更新(以便在用户锁定屏幕,切换片段等时不会停止更新)。但我收到一条奇怪的错误消息,阻止我实现它。

在线: “LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,locationRequest,this);”

它告诉我第2个参数'this'是不允许的,应该转换为(com.google.android.gms.location.LocationListener)。但在每个例子中,我都看到情况并非如此。当我投射它时,它不起作用

以下是我的代码,麻烦在于onConnected方法

public class LocationTrackingService extends Service implements LocationListener, ConnectionCallbacks, OnConnectionFailedListener {
    GoogleApiClient googleApiClient = null;
    LocationRequest locationRequest;

    Location currentLocation;

    static final int INTERVAL = 2000;
    static final int FASTEST_INTERVAL = 500;
    static final int PRIORITY = LocationRequest.PRIORITY_HIGH_ACCURACY;

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

    @Override
    public void onCreate() {
        super.onCreate();

        setupGoogleApiClient();
        createLocationRequest(INTERVAL, FASTEST_INTERVAL, PRIORITY);
        googleApiClient.connect();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (!googleApiClient.isConnected()) {
            googleApiClient.connect();
        }

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        //TODO maybe dont need this
        googleApiClient.disconnect();

        super.onDestroy();
    }

    @Override
    public void onLocationChanged(Location location) {
        //updating current location
        currentLocation = location;

        //TODO will be writing directly to database here
        //broadcasting intent
        Intent publishLocationUpdate = new Intent("location_update");
        publishLocationUpdate.putExtra("current_location", currentLocation);
        sendBroadcast(publishLocationUpdate);
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    //if location tracking is not enabled
    @Override
    public void onProviderDisabled(String s) {
        Intent toSettings = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        toSettings.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(toSettings);
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        //sets location to last known location
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }

        currentLocation = FusedLocationApi.getLastLocation(googleApiClient);

        //request updates
        LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);


    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    // Create an instance of GoogleAPIClient which we call to recieve location information
    void setupGoogleApiClient(){
        if (googleApiClient == null) {
            googleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }
    }

    //set request settings, interval: how soon until new request is made, priority affects batterylife (using GPS, netowork, data...)
    void createLocationRequest(int interval, int fastestInterval, int priority) {
        locationRequest = new LocationRequest();
        locationRequest.setInterval(interval);
        locationRequest.setFastestInterval(fastestInterval);
        locationRequest.setPriority(priority);
        //can also use PRIORITY_LOW_POWER, PRIORITY_BALANACED_POWER_ACCURACY, PRIORITY_NO_POWER
    }
}

我在我的片段中检查onResume中的意图,代码如下:

if(broadcastReceiver == null){
            broadcastReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    Location currentLocation;
                    currentLocation = (Location) intent.getExtras().get("current_location");

                    currentAltitudeTextView.setText(String.valueOf(currentLocation.getLatitude()));
                    currentSpeedTextView.setText(String.valueOf(currentLocation.getLongitude()));
                }
            };
        }


        context.registerReceiver(broadcastReceiver, new IntentFilter("location_update"));

0 个答案:

没有答案