gpt4 book ai didi

android - 使用 Google Fit api 时 Google Oauth 2.0 RESULT_CANCELED

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:02 24 4
gpt4 key购买 nike

我正在尝试在我的 Android 应用程序中使用 google fit api。我关注了this在我的 jdk 1.8 bin 文件夹中使用 keytool.exe 指导并创建 SHA-1 证书。我现在已经创建了 Oauth 客户端 ID enter image description here .

在我的应用中,我在这里得到 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 客户端无法仅在生产环境中连接,在开发环境中一切正常。

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

App Signing

所以我们需要做的是解决这个问题:只需像这样用这个新的 SHA1 创建一个新的 OAuth 客户端 ID:

enter image description here

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

关于android - 使用 Google Fit api 时 Google Oauth 2.0 RESULT_CANCELED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37289028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com