2016-03-30 9 views
6

Funzionava quando stavo utilizzando GoogleApiClient in un'attività, ma lo ho spostato su un servizio e non è stato chiamato onConnected.GoogleApiClient onConnected non viene chiamato, utilizzando in un servizio

public class StepsMonitoringService extends Service implements GoogleApiClient.ConnectionCallbacks { 

private GoogleApiClient mClient; 

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

@Override 
public void onCreate() { 
    super.onCreate(); 
    mClient = new GoogleApiClient.Builder(this).addApi(Fitness.HISTORY_API) 
      .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ)) 
      .addConnectionCallbacks(this).build(); 
    mClient.connect(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 
    return START_STICKY;  
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mClient.disconnect(); 
} 

@Override 
public void onConnected(Bundle connectionHint) { 
    // NOT being called!! WHY?? 
} 

@Override 
public void onConnectionSuspended(int cause) { 
} 

}

Delle idee chiunque? Che cosa sto facendo di sbagliato? Qualcuno ha GoogleApiClient che lavora in un servizio?

Il servizio si chiama da un'attività

public class MainActivity estende FragmentActivity {

private TextView mStepsView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent intent = new Intent(this, StepsMonitoringService.class); 
    startService(intent); 

    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("StepMonitoringServiceIntent")); 

    mStepsView = (TextView) findViewById(R.id.steps); 
} 

private void displayOnUI(String msg) { 
    mStepsView.setText(msg + "\n" + mStepsView.getText()); 
} 

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     long steps = intent.getLongExtra("steps", 0); 
     displayOnUI(steps + " steps"); 
    } 
}; 

}

durante il debug posso vedere l'onCreate del Servizio viene chiamato, ma l'onConnected è mai chiamato. Niente di speciale nei registri da quello che posso vedere.

+0

Puoi mostrare come si avvia il servizio? Controlla anche eventuali errori nei log. –

+0

Vedere la mia modifica sopra – rukiman

risposta

2

Aggiungi addOnConnectionFailedListener a GoogleApiClient per tracciare l'errore. Come da documento addOnConnectionFailedListener chiamato in caso di errore nel collegamento del client al servizio.

public class StepsMonitoringService extends Service implements GoogleApiClient.ConnectionCallbacks { 

    private GoogleApiClient mClient; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mClient = new GoogleApiClient.Builder(this).addApi(Fitness.HISTORY_API) 
      .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ)) 
      .addConnectionCallbacks(this) 
      //Add Connection Failed Listener to track error. 
      .addOnConnectionFailedListener(this) 
      .build(); 
     mClient.connect(); 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     // NOT being called!! WHY?? 
    } 

    @Override 
    public void onConnectionSuspended(int cause) { 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     //Called called when there was an error connecting the client to the service. 
     Log.i(LOG_TAG,"onConnectionFailed:"+connectionResult.getErrorCode()+","+connectionResult.getErrorMessage()); 
    } 
} 
+0

I get onConnectionFailed: 4, null – rukiman

+0

Ah penso sia perché sto lavorando su un altro computer e quindi il certificato dello sviluppatore è diverso da quello che ho usato per attivare l'API di fitness di Google. Ci proverò. – rukiman

+0

Codice errore 4 significa. 'SIGN_IN_REQUIRED' –

0

provare questo.

public class StepsMonitoringService extends Service implements 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener { 

    /** 
    * Provides the entry point to Google Play services. 
    */ 
    protected GoogleApiClient mClient; 

    /** 
    * Builds a GoogleApiClient. Uses the addApi() method to request the 
    * Fitness API. 
    */ 
    protected synchronized void buildGoogleApiClient() { 
     mClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(Fitness.HISTORY_API) 
       .build(); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     if (mClient == null) { 
      buildGoogleApiClient(); 
     } 
     mClient.connect(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     return START_STICKY; 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     // NOT being called!! WHY?? 
    } 

    @Override 
    public void onConnectionSuspended(int cause) { 
     mClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     // Called called when there was an error connecting the client to the 
     // service. 
     Log.i(LOG_TAG, 
       "onConnectionFailed:" + connectionResult.getErrorCode() + "," + connectionResult.getErrorMessage()); 
    } 
} 
+1

Non è una buona idea, in quanto può essere chiamato più volte ... Vedi qui: http://stackoverflow.com/a/29712447 –

+0

@DanielNugent dopo aver riferito il tuo link. Sono d'accordo con te. –

0

Ho avuto lo stesso problema quando stavo usando useDefaultAccount() per creare un client. Ho quindi sostituito con setAccountName() e inizia a funzionare. Penso che per qualche ragione accountpicker non funzioni nel servizio è per questo che googleapiclient's connect() ha silenziosamente fallito dal momento che è necessario specificare quale account si utilizza per recuperare le informazioni di fitness. Si noti che è necessario avere un raccoglitore di account nella propria attività e passare l'account di posta elettronica al proprio servizio in qualche modo.

7

Prima implementare queste interfacce:

  1. GoogleApiClient.ConnectionCallbacks
  2. GoogleApiClient.OnConnectionFailedListener

Poi si dovrà aggiungere questi metodi per la classe:

  1. public void onConnected (bundle bundle finale)
  2. public void onConnectionSuspended (final int i)
  3. public void onConnectionFailed (finale ConnectionResult connectionResult)

Non appena ci si connette, la OnConnected metodo verrà chiamati. Con questo metodo puoi fare tutto ciò che vuoi, ad esempio ottenere la posizione corrente, l'indirizzo della posizione, aggiungere un indicatore per mappare, ecc.

Ma non puoi fare nulla senza stabilire una connessione al client API Google. Per connettersi a GoogleAPIClient, è possibile aggiungere questo metodo alla classe e chiamarlo nel metodo onCreate.

private synchronized void buildGoogleAPIClient(){ 
    googleApiclient = new GoogleApiClient.Builder(getActivity()) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    googleApiclient.connect(); 
    Toast.makeText(getActivity(), "connected", Toast.LENGTH_SHORT).show(); 
} 
+0

In su. Dimenticato di aggiungere googleApiclient.connect(); questa era la causa, una piccola causa. – CodeToLife

+0

hah hah Grazie per l'upvote bro :) felice codifica –

Problemi correlati