2016-05-18 18 views
3

私はAndroidアプリでgoogle fit apiを使用しようとしています。私はthisガイドをたどり、jdk 1.8 binフォルダのkeytool.exeを使ってSHA-1証明書を作成しました。 OauthクライアントID enter image description hereを作成しました。私のアプリでGoogle Oauth 2.0 Google Fit APIを使用しているときにRESULT_CANCELED

は、私がここに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"); 
    } 
} 

は最後の2日間から問題を把握しようとしています。 compile 'com.google.android.gms:play-services-fitness:8.4.0'

ビルクライアント::私はアンドロイドのスタジオで正しいプレイ・サービスのライブラリを追加した

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(); 
    } 
} 

コールバック:Gradleので

/** 
* 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()); 
      } 
     }); 
    } 
} 

:取得する

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クライアントIDの使用は何ですか?私はそれを作成しましたが、私はどこでもそれを使用していません –

答えて

5

今、この問題が発生しました。私は数時間後に分かったので、同じミスをした人たちを指摘したいと思います。

Google APIクライアントはプロダクションでしか接続できません。開発環境ではすべて正常に動作します。

これは、私のアプリが「App Signing」を使用するように設定されているためです。これにより、プロダクションキーストアのSHA1(または画像にアップロード証明書のSHA1)を使用してOauthクライアントIDを作成した場合、Googleはこの証明書を削除して「App Signing」証明書に変更するため、使用しません。

だから我々は問題を解決するために何をする必要があるか、単にそのようなこの新しいSHA1で新しいOAuthクライアントIDを作成しているApp Signing

enter image description here

問題は、いずれかの理由で最もに遭遇するのは非常に簡単です。チュートリアルでは、プロダクションSHA1を見つけて使用するよう指示しますそれはAPIコンソールにあります。ただし、「App signing」を使用する場合を除いて、それ以上は機能しません。

+0

私はこの問題で3日間立ち往生した。どうもありがとう! – kirtan403

2

一つの理由RESULT_CANCELEDはあなたのパッケージ名があなたが定義したものと異なる場合ですウルアプリ。

マニフェストで定義されているpackageと異なる可能性がある別のapplicationIdをbuild.gradleに設定しないことを再度確認します。

+3

パッケージ名はどこでも同じです(マニフェスト、グラデル、Googleデベロッパーコンソール –

+0

)結局どのように修正しましたか? –

1

最近この問題も発生しました。問題の内容はわかりませんが、Googleの更新プログラムであるGoogleAPIClientのライブラリと認証手順に起因している可能性があります。私も図書館のため

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

を使用してい https://developers.google.com/identity/sign-in/android/sign-in#before_you_begin

私はこのからGoogleのサインイン(アンドロイド)用の最新のドキュメントに自分の認証フローを更新する必要がありました。ここに私のコードの抜粋です:

//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つの引数は、 GoogleApiClient.ConnectionCallbacksとGoogleApiClient.OnConnectionFailedListener – c0deblooded

+0

の両方を実装するgoogleFitBuildとgoogleFitConnectをonStartで呼び出す必要があります。 onCreateで呼び出されると、出力はRESULT_CANCELEDのままです。 – suku

1

私のケースでは、apk名は変更しましたが、OAuth資格情報コンソールで更新できませんでした。その後、私のonActivityResultコードが私にRESULT_CANCELLEDを与えました。私がapkの名前を修正するとすぐに、すべてが再び働き始めました。

+0

私は同じ問題を抱えていました。私の場合、ワークステーションを変更してdebug.keystoreのシグネチャを変更したため、資格情報を更新する必要がありました。正しい方向に私を入れてくれてありがとう! – davis

関連する問題