从Activity调用服务但没有在logcat中获取任何内容?

时间:2015-06-24 16:57:10

标签: java android service google-api-java-client

这是一个转发,我很抱歉,但是我最后一次发布它时,我以为我把它弄下来但显然没有。当我尝试调用服务时,我使用此错误导致:java.lang.IllegalStateException: GoogleApiClient is not connected yet. 因为我试图在GoogleApiClient连接之前调用LocationServices。所以在稍微更改代码之后我就不再收到错误了,事实上我在logcat中没有得到任何东西了。 这是我从SearchActivity.class启动我的服务的方式:

SearchActivity.class

 button = (Button)findViewById(R.id.buttonPressed);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startService(new Intent(getBaseContext(), LocationService.class));

        }
    });

这是服务:

LocationService.class

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

    // LogCat tag
    private static final String TAG = LocationService.class.getSimpleName();

    private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 1000;

    private Location mLastLocation;

    // Google client to interact with Google API
    private GoogleApiClient mGoogleApiClient;

    // boolean flag to toggle periodic location updates
    private boolean mRequestingLocationUpdates = false;

    private LocationRequest mLocationRequest;

    // Location updates intervals in sec
    private static int UPDATE_INTERVAL = 10000; // 10 sec
    private static int FATEST_INTERVAL = 5000; // 5 sec
    private static int DISPLACEMENT = 10; // 10 meters


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

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API).build();


    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (mGoogleApiClient != null) {
            if(mGoogleApiClient.isConnected()) {
                if (mLocationRequest != null) {
                    togglePeriodicLocationUpdates();
                }
            }
        }



        return START_NOT_STICKY;
    }

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

    protected void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL);
        mLocationRequest.setFastestInterval(FATEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
    }

    private void togglePeriodicLocationUpdates() {
        mGoogleApiClient.connect();
        if(mGoogleApiClient.isConnected()) {
            if (!mRequestingLocationUpdates) {

                mRequestingLocationUpdates = true;

                startLocationUpdates();

                Log.d(TAG, "Periodic location updates started!");

            } else {

                mRequestingLocationUpdates = false;

                // Stopping the location updates
                stopLocationUpdates();

                Log.d(TAG, "Periodic location updates stopped!");
            }
        }
    }

    protected void stopLocationUpdates() {
        LocationServices.FusedLocationApi.removeLocationUpdates(
                mGoogleApiClient, this);
    }

    protected void startLocationUpdates() {
        mGoogleApiClient.connect();
        if(mGoogleApiClient.isConnected()) {
            LocationServices.FusedLocationApi.requestLocationUpdates(
                    mGoogleApiClient, mLocationRequest, this);
        }
    }

    @Override
    public void onConnected(Bundle arg0) {
        createLocationRequest();
    }

    @Override
    public void onConnectionSuspended(int arg0) {
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = "
                + result.getErrorCode());
    }

@Override
public void onLocationChanged(Location location) {
    // Assign the new location
    mLastLocation = location;

    Toast.makeText(getApplicationContext(), "Location changed!",
            Toast.LENGTH_SHORT).show();
}

@Override
public boolean stopService(Intent name) {
    return super.stopService(name);
}

的AndroidManifest.xml

    </activity>
    <service android:name=".LocationService">
    </service>

编辑:

好吧我想办法让它运转起来。 但是现在我面临着在正常启动之前必须单击按钮2次的问题。只需稍微改变onStartCommand()。

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (mGoogleApiClient != null) {
            mGoogleApiClient.connect();
            if(mGoogleApiClient.isConnected()) {

                if (mLocationRequest != null) {

                    togglePeriodicLocationUpdates();
                }
            }
        }



        return START_NOT_STICKY;
    }

1 个答案:

答案 0 :(得分:0)

您应该阅读GoogleApiClient上的文档,特别是(对于手头的问题)connect() method。我突出了相关部分:

  

将客户端连接到Google Play服务。 此方法返回   立即,并在后台连接到服务。如果   连接成功,onConnected(Bundle)被调用并入队   项目被执行。失败时,onConnectionFailed(ConnectionResult)   被称为。

     

如果客户端已连接或已连接,则此方法可以   什么都没有。

因此,这是您的代码目前发生的事情:

  1. 您点击按钮即可启动该服务。
  2. 您在onCreate()中创建了GoogleApiClient。
  3. 您在onStartCommand中调用connect(),并在后台连接时立即返回。
  4. 您检查isConnected(),但是,由于连接仍在继续,您什么都不做,并从onStartCommand返回。
  5. 稍后,您再次单击按钮启动服务。
  6. 由于它已经创建,因此直接进入onStartCommand。
  7. 到目前为止,GoogleApiClient已经连接,所以其他一切都按预期工作。
  8. 你应该做的是实现onConnected()。从那里,调用togglePeriodicLocationUpdates()而不是在onStartCommand()中执行此操作。这将完成你想要的:

    1. 点击按钮启动服务。
    2. 服务在onCreate()中创建GoogleApiClient。
    3. 服务在onStartCommand()中启动连接。
    4. 将来某个时候,建立连接并从onConnected()调用togglePeriodicLocationUpdates()。