我想在我的
Android应用程序中使用google fit api.我按照
this指南,使用我的jdk 1.8 bin文件夹中的keytool.exe创建了SHA-1证书.我现在已经创建了Oauth Client 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<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' }
解决方法
我刚才遇到过这个问题.花了几个小时才弄清楚,所以我想指出那些犯同样错误的人.
我的Google API客户端无法仅在生产环境中连接,在开发环境中一切正常.
这是因为我的应用程序设置为使用“App Signing”.这样,如果您使用生产密钥库的SHA1(或图片中的上载证书的SHA1)创建了Oauth客户端ID,则不会使用它,因为谷歌将删除此证书并更改为“应用程序签名”证书
因此,我们需要做的就是修复问题只需使用这个新的SHA1创建一个新的OAuth客户端ID,如下所示:
这个问题很容易遇到,因为大多数教程都会告诉您找到您的Production SHA1并在API控制台中使用它.但是,除非您使用“应用程序签名”,否则它将不再起作用.