2016-04-26 159 views
1

我正在嘗試將Google Fitness API集成到我的應用程序中。Google Fit用戶登錄授予訪問永遠不會通過

當它要求用戶登錄授予Google健身時,它永遠不會通過。 我總是得到RESULT_CANCELEDonActivityResult()

問題是什麼?

下面是我的實現。

// Google Fit Related 
public static final int REQUEST_OAUTH = 10101; 
private static final String AUTH_PENDING = "auth_state_pending"; 
private boolean authInProgress = false; 
private GoogleApiClient mGoogleApiClient; 
private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34; 


private void coonectGoogleFit() { 
    mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
      .addApi(Fitness.SENSORS_API) 
      .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 
} 


@Override 
public void onConnected(Bundle bundle) { 

    DataSourcesRequest dataSourcesRequest = new DataSourcesRequest.Builder() 
      .setDataTypes(DataType.TYPE_STEP_COUNT_DELTA) 
      .setDataSourceTypes(DataSource.TYPE_RAW) 
      .build(); 


    ResultCallback<DataSourcesResult> dataSourcesResultResultCallback = new ResultCallback<DataSourcesResult>() { 
     @Override 
     public void onResult(DataSourcesResult dataSourcesResult) { 
      for(DataSource dataSource : dataSourcesResult.getDataSources()) { 
       if(DataType.TYPE_STEP_COUNT_DELTA.equals(dataSource.getDataType())) { 
        registerFitnessDataListener(dataSource, DataType.TYPE_STEP_COUNT_DELTA); 
       } 
      } 
     } 
    }; 


    Fitness.SensorsApi.findDataSources(mGoogleApiClient, dataSourcesRequest) 
      .setResultCallback(dataSourcesResultResultCallback); 

} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 

    if(!authInProgress) { 
     try { 
      authInProgress = true; 
      Log.e("ConnectionResult", connectionResult+""); 
      connectionResult.startResolutionForResult(getActivity(), REQUEST_OAUTH); 
     } catch (IntentSender.SendIntentException e) { 
      Log.e("IntentSender", e.getMessage()); 
     } 
    } else { 
     Log.e("GoogleFit", "authInProgress"); 
    } 

} 

@Override 
public void onDataPoint(DataPoint dataPoint) { 
    for(final Field field : dataPoint.getDataType().getFields()) { 
     final Value value = dataPoint.getValue(field); 
     new Runnable() { 
      @Override 
      public void run() { 
       circleProgressBar.setProgressWithAnimation(value.asFloat(), 500); 
       circleProgressBar.setText(value.asFloat()+"", 72, Color.parseColor("#25DDA5")); 
      } 
     }; 
    } 
} 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == REQUEST_OAUTH) { 
     authInProgress = false; 
     Log.i("ResultCode", resultCode+""); 
     Log.i("CANCELED", getActivity().RESULT_CANCELED+""); 
     if(resultCode == getActivity().RESULT_OK) { 
      Log.e("GoogleFit", "RESULT_OK"); 
      if(!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { 
       mGoogleApiClient.connect(); 
      } 
     } else if(resultCode == getActivity().RESULT_CANCELED) { 
      Log.e("GoogleFit", "RESULT_CANCELED"); 
     } 
    } else { 
     Log.e("GoogleFit", "requestCode Not request_oauth"); 
    } 
} 


private void registerFitnessDataListener(DataSource dataSource, DataType dataType) { 

    SensorRequest request = new SensorRequest.Builder() 
      .setDataSource(dataSource) 
      .setDataType(dataType) 
      .setSamplingRate(1, TimeUnit.SECONDS) 
      .build(); 

    Fitness.SensorsApi.add(mGoogleApiClient, request, this) 
      .setResultCallback(new ResultCallback<Status>() { 
       @Override 
       public void onResult(Status status) { 
        if(status.isSuccess()) { 
         Log.i("GoogleFit", "Sensor Api successfully Added"); 
        } 
       } 
      }); 
} 

回答

0

您試過Getting Started on Android (GoogleFit)

基礎上谷歌的樣品實施的onActivityResult()

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
if (requestCode == REQUEST_CODE_PICK_ACCOUNT) { 
// Receiving a result from the AccountPicker 
if (resultCode == RESULT_OK) { 
mEmail = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
// With the account name acquired, go get the auth token 
getUsername(); 
} else if (resultCode == RESULT_CANCELED) { 
// The account picker dialog closed without selecting an account. 
// Notify users that they must pick an account to proceed. 
Toast.makeText(this, R.string.pick_account, Toast.LENGTH_SHORT).show(); 
} 
} else if ((requestCode == REQUEST_CODE_RECOVER_FROM_AUTH_ERROR || 
requestCode == REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR) 
&& resultCode == RESULT_OK) { 
// Receiving a result that follows a GoogleAuthException, try auth again 
getUsername(); 
} 
} 

有可能在你的應用程序沒有的OAuth /授權,你可以按照Get an OAuth 2.0 Client ID步驟來驗證是否已授權您的應用程序使用谷歌飛度。

我希望它有幫助。

+0

感謝您的回答。 我確實閱讀了[Google Fit](https://developers.google.com/fit/)上的入門指南。 最近,我發現我使用了錯誤的OAuth 2.0客戶端ID代碼,一旦我解決了這個問題,現在它工作正常。 –

相關問題