2016-04-26 161 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代码,一旦我解决了这个问题,现在它工作正常。 –

相关问题