使用Google Fit api时,Google Oauth 2.0 RESULT_CANCELED

我想在我的Android应用程序中使用google fit api。 我按照本指南使用我的jdk 1.8 bin文件夹中的keytool.exe创建了SHA-1证书。 我现在已经创建了Oauth客户端ID 在此处输入图像描述

在我的应用中,我在这里得到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"); } } 

试着找出过去两天的问题。 我在android studio中添加了正确的播放服务库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(); } } 

回调:

 /** * 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 dataSourcesResultCallback = new ResultCallback() { @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' } 

我刚才遇到过这个问题。 花了几个小时才弄清楚,所以我想指出那些犯同样错误的人。

我的Google API客户端无法仅在生产环境中连接,在开发环境中一切正常。

这是因为我的应用程序设置为使用“App Signing”。 这样,如果您使用生产密钥库的SHA1(或图片中的上载证书的SHA1)创建了Oauth客户端ID,则不会使用它,因为谷歌将删除此证书并更改为“应用程序签名”证书

应用程序签名

因此,我们需要做的就是修复问题只需使用这个新的SHA1创建一个新的OAuth客户端ID,如下所示:

在此处输入图像描述

这个问题很容易遇到,因为大多数教程都会告诉您find您的Production SHA1并在API控制台中使用它。 但是,除非您使用“应用程序签名”,否则它将不再起作用。

获得RESULT_CANCELED一个原因是,您的包名称与您在应用中定义的包名称不同。

仔细检查您是否在build.gradle中设置了另一个可能与清单中定义的package不同的applicationId。

我最近也遇到了这个问题。 我不确定问题是什么,但可能源于Google对GoogleAPIClient库和身份validation程序的更新。

我必须将我自己的身份validation流程更新为Google Sign-Ins(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代码的东西,但它突然决定停止工作……至少可以说令人沮丧。

在我的情况下,我更改了apk名称但未能在OAuth凭据控制台中更新它。 然后我的onActivityResult代码给了我RESULT_CANCELLED。 一旦我更正了apk名称,一切都开始了。