2016-05-18 2 views
3

Я пытаюсь использовать google fit api в своем приложении для Android. Я последовал за this руководством и создал сертификат SHA-1, используя keytool.exe в моей папке bin jdk 1.8. Теперь я создал идентификатор клиента Oauth enter image description here.Google Oauth 2.0 RESULT_CANCELED при использовании Google Fit api

В моем приложении, я получаю RESULT_CANCELED здесь:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == REQUEST_OAUTH) { 
     authInProgress = false; 
     if(resultCode == RESULT_OK) { 
      if(!mClient.isConnecting() && !mClient.isConnected()) { 
       mClient.connect(); 
      } 
     } else if(resultCode == RESULT_CANCELED) {/// HERE 
      Toast.makeText(MainActivity.this,"RESULT_CANCELED",Toast.LENGTH_SHORT).show(); 
      Log.e("GoogleFit", "RESULT_CANCELED"); 
      Log.e("GoogleFit", data.getExtras().toString()); 
     } 
    }else if(requestCode == CALL_END){ 
     if (resultCode == Activity.RESULT_OK){ 
      //pass 
     }else{ 

     } 
    } else { 
     Log.e("GoogleFit", "requestCode NOT request_oauth"); 
    } 
} 

Пытаясь выяснить проблему с двух последних дней. Я добавил правильную библиотеку игровых услуг в андроиде студии как: compile 'com.google.android.gms:play-services-fitness:8.4.0'

Building Клиент:

private void buildFitnessClient() { 

    if (mClient == null && checkPermissions()) { 
     Log.i(TAG, "Building Fitness Client"); 
     mClient = new GoogleApiClient.Builder(this) 
       .addApi(Fitness.SENSORS_API) 
       .addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE)) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
     mClient.connect(); 
    } 
} 

Callbacks:

/** 
* GOOGLE FIT METHODS 
*/ 
@Override 
public void onConnected(@Nullable Bundle bundle) { 
    DataSourcesRequest dataSourceRequest = new DataSourcesRequest.Builder() 
      .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE) 
      .setDataSourceTypes(DataSource.TYPE_RAW) 
      .build(); 

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

    Fitness.SensorsApi.findDataSources(mClient, dataSourceRequest) 
      .setResultCallback(dataSourcesResultCallback); 
} 
@Override 
public void onConnectionSuspended(int i) { 

} 
@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    if(!authInProgress) { 
     try { 
      authInProgress = true; 
      connectionResult.startResolutionForResult(MainActivity.this, REQUEST_OAUTH); 
     } catch(IntentSender.SendIntentException e) { 

     } 
    } else { 
     Log.e("GoogleFit", "authInProgress"); 
    } 
} 
@Override 
public void onDataPoint(DataPoint dataPoint) { 
    for(final Field field : dataPoint.getDataType().getFields()) { 
     final Value value = dataPoint.getValue(field); 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(getApplicationContext(), "Field: " + field.getName() + " Value: " + value, Toast.LENGTH_SHORT).show(); 
       HealthRecordFragment.mStepsWalking.setText(value.toString()); 
      } 
     }); 
    } 
} 

В Gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.1" 

    defaultConfig { 
     applicationId "com.xxxx.xxxx" 
     minSdkVersion 15 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 
    signingConfigs { 
     release { 
      storeFile file("C:\\Users\\xxxxx\\AndroidStudioProjects\\HBEAT2\\app\\hbeat_android") 
      storePassword "password" 
      keyAlias "hbeat_android" 
      keyPassword "password" 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.google.android.gms:play-services-fitness:8.4.0' 
    compile 'com.android.support:appcompat-v7:23.1.1' 
    compile "com.android.support:design:23.2.1" 
    compile 'com.github.rahatarmanahmed:circularprogressview:2.4.0' 
    compile 'de.timroes.android:EnhancedListView:0.3.0' 
} 
+0

Что вы хотите, чтобы получить запрос? Это может быть так, если вы не отправляете правильные данные. – MiltoxBeyond

+0

см. Код выше .. Вот как я строю клиента –

+0

Также используется идентификатор клиента Oauth. Я создал его, но я его нигде не использую –

ответ

5

Я столкнулся с этой проблемой только сейчас. Мне потребовалось несколько часов, чтобы понять, поэтому я хотел бы указать на тех, кто совершает ту же ошибку.

Мой клиент Google API не может подключиться только к Production, все отлично работает в среде разработки.

Это потому, что мое приложение было настроено на использование «Подписи к приложению».При этом, если вы создали идентификатор клиента Oauth с использованием SHA1 SHY1 (или SHA1 сертификата доставки) на изображении, он не будет использоваться, потому что Google удалит этот сертификат и изменит сертификат «Подписать подписку»

App Signing

так что нам нужно сделать, чтобы решить эту проблему, просто создать новый OAuth идентификатор клиента с новым SHA1, как так:

enter image description here

вопрос довольно легко столкнуться, потому что большинство из любой учебник расскажет вам, чтобы найти ваше производство SHA1 и использовать это в консоли API. Но кроме того, если вы используете «Подписание приложений», то он больше не будет работать.

+0

Я застрял в этом вопросе в течение 3 дней. Большое спасибо! – kirtan403

2

Одна из причин, чтобы получить RESULT_CANCELED - это если ваше имя пакета отличается от того, которое вы определяете в летнее время ур.

Двойная проверка, что вы не устанавливаете другой applicationId в своем build.gradle, который может отличаться от package, определенного в вашем манифесте.

+3

имя пакета такое же везде, то есть манифест, град и консоль разработчика Google –

+0

Итак, в конце концов, как вы это исправили? –

1

Недавно я столкнулся с этой проблемой. Я не уверен, в чем проблема, но это может быть связано с обновлениями Google в библиотеке GoogleAPIClient и процедурами проверки подлинности.

я должен был обновить свой собственный поток аутентификации к последней документации для Google оповещения (Android) от этого: https://developers.google.com/identity/sign-in/android/sign-in#before_you_begin

Я также использую

compile 'com.google.android.gms:play-services-auth:9.0.0' 
    compile 'com.google.android.gms:play-services-fitness:9.0.0' 

для библиотек. Вот отрывок из моего кода:

//runs an automated Google Fit connect sequence 
public static GoogleApiClient googleFitBuild(Activity activity, GoogleApiClient.ConnectionCallbacks connectionCallbacks, GoogleApiClient.OnConnectionFailedListener failedListener){ 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      //.requestServerAuthCode(activity.getString(R.string.server_client_id), false) 
      .requestEmail() 
      .requestScopes(new Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE), new Scope(Scopes.FITNESS_BODY_READ_WRITE), 
        new Scope(Scopes.FITNESS_NUTRITION_READ_WRITE), new Scope(Scopes.FITNESS_LOCATION_READ_WRITE)) 
      .build(); 
    return new GoogleApiClient.Builder(activity) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .addConnectionCallbacks(connectionCallbacks) 
       .addOnConnectionFailedListener(failedListener) 
       //.addApi(Plus.API) 
       .addApi(Fitness.CONFIG_API) 
       .addApi(Fitness.HISTORY_API) 
       .addApi(Fitness.SESSIONS_API) 
       .addApi(Fitness.RECORDING_API) 
       .addApi(Fitness.BLE_API) 
       .addApi(Fitness.SENSORS_API) 
       .build(); 
} 

//runs an automated Google Fit connect sequence 
public static void googleFitConnect(final Activity activity, final GoogleApiClient mGoogleApiClient){ 
    if(!mGoogleApiClient.isConnected() && !mGoogleApiClient.isConnecting()) { 
     mGoogleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
      @Override 
      public void onConnected(Bundle bundle) { 
       Log.i(TAG, "Google API connected"); 
       Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
       activity.startActivityForResult(signInIntent, FragmentLogin.REQUEST_OAUTH); 
      } 
      @Override 
      public void onConnectionSuspended(int i) { 

      } 
     }); 
     mGoogleApiClient.connect(GoogleApiClient.SIGN_IN_MODE_OPTIONAL); 
    } 
} 

GoogleApiClient googleApiClient = googleFitBuild(activity, (MainActivity)activity, (MainActivity)activity); 
googleFitConnect(activity, googleApiClient); 

Я также имел что-то близкое к коду OP работает и раньше, но он внезапно решил прекратить работу ... расстраивает, мягко говоря.

+0

'GoogleApiClient googleApiClient = googleFitBuild (активность, активность MainActivity), (MainActivity) активность;' эта строка дает ошибку, поскольку ее аргументы не соответствуют аргументам функции. – suku

+0

. Последние 2 аргумента должны быть классом (вероятно, Activity или фрагмент), который реализует как GoogleApiClient.ConnectionCallbacks, так и GoogleApiClient.OnConnectionFailedListener – c0deblooded

+0

googleFitBuild и googleFitConnect должны быть вызваны в onStart. Когда они вызываются в onCreate, выход все равно RESULT_CANCELED. – suku

1

В моем случае я изменил имя apk, но не смог его обновить в консоли учетных данных OAuth. Тогда мой код onActivityResult дал мне RESULT_CANCELLED. Как только я исправил имя apk, все снова заработало.

+0

У меня была такая же проблема. В моем случае я сменил рабочую станцию ​​и изменил подпись debug.keystore, поэтому учетные данные должны были быть обновлены. Спасибо, что поставили меня в правильном направлении! – davis

Смежные вопросы