Google Oauth 2.0 RESULT_CANCELED 同时使用 Google Fit api
Google Oauth 2.0 RESULT_CANCELED while using Google Fit api
我正在尝试在我的 android 应用程序中使用 google fit api。我关注了 this guide and created SHA-1 certificate using keytool.exe in my jdk 1.8 bin folder. I have now created 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'
}
获得 RESULT_CANCELED
的一个原因是您的包名称与您在应用程序中定义的名称不同。
仔细检查您没有在您的 build.gradle 中设置另一个 applicationId
,它可能与清单中定义的 package
不同。
我运行最近也遇到了这个问题。我不确定问题出在哪里,但它可能源于 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 代码的工作,但它突然决定停止工作......至少可以说令人沮丧。
就我而言,我更改了 apk 名称但未能在 OAuth 凭据控制台中更新它。然后我的onActivityResult代码给了我RESULT_CANCELLED。一旦我更正了 apk 名称,一切又开始工作了。
我刚才遇到了这个问题。我花了几个小时才弄明白,所以我想指出那些犯同样错误的人。
我的 Google API 客户端无法仅在生产环境中连接,在开发环境中一切正常。
这是因为我的应用设置为使用“应用签名”。这样一来,如果您使用 Production Keystore 的 SHA1(或图片中的上传证书的 SHA1)创建了 Oauth Client ID,它将不会被使用,因为 google 将删除此证书并更改为“App Signing”证书
所以我们需要做的是解决这个问题:只需像这样用这个新的 SHA1 创建一个新的 OAuth 客户端 ID:
这个问题很容易遇到,因为大多数教程都会告诉您找到生产 SHA1 并在 API 控制台中使用它。但除非您使用“应用程序签名”,否则它将不再起作用。
如果上述解决方案对您没有帮助,那么您绝对应该考虑一次此解决方案。为了弄清楚这一点,我真的很费力。所以我认为,我的发现将帮助其他人避免同样的挣扎和挫折。
我已按照 google 指南 设置 GFit 身份验证。但是完成后,我注意到当我的应用程序请求用户许可时,它会弹出身份验证屏幕。但是当用户选择一个帐户时,它只是 onActivityResult()
中的 returns RESULT_CANCELED
而不是 RESULT_OK
。其背后的原因是证书不匹配。我使用项目的 keystore 文件来生成 OAuth 令牌生成所需的 SHA-1
指纹。但是我正在部署的构建是 debug
一个。当我尝试使用 release
构建时,它运行良好。其背后的原因是,Android Studio 默认使用 debug.keystore
文件来签署 debug
构建,这与项目的 密钥库 文件。这就是它在调试模式下不起作用的原因。当我将项目的 debug
配置更改为使用项目的 keystore 文件时,效果非常好。所以,我建议先检查这个用例。大多数情况下,这是实际问题。您可以找到另一个解决此问题的 Whosebug 问题 。
要了解更多关于如何为您的构建change/modify签名配置,请参阅this。
我遇到了同样的问题,错误是我使用的是最终更改包名称的构建风格(完整、模拟)。
因此,在控制台中,我必须输入包的味道,而不是清单的味道。
希望这有帮助:)
我有类似的问题并通过在 build.gradle
文件中统一 fitness
和 auth
依赖项的版本号来解决。
implementation "com.google.android.gms:play-services-fitness:18.0.0"
implementation "com.google.android.gms:play-services-auth:18.0.0"
之前我使用的是 auth:17.0.0
,这导致该功能在随机基础上失败(是的,它有时有效,但有时会失败)。
因此,如果上述解决方案没有帮助,我认为值得检查您的依赖关系。
在我的例子中,我尝试重用 Firebase 生成的 OAuth 客户端,但没有创建新客户端。这样做通常似乎没问题,但是,我从未在 Firebase.
中启用 Google 身份验证(事实上,甚至没有启用 Firebase 身份验证)
我从没想过您还必须这样做,但事实证明,这对我有用!
要在 Firebase 中启用 Google 身份验证,请执行以下操作:
- 在 Firebase 中展开左侧边栏并点击“身份验证”。
- 如果尚未启用,请启用身份验证。
- 在“登录方式”选项卡中点击“Google”并启用它。
我正在尝试在我的 android 应用程序中使用 google fit api。我关注了 this guide and created SHA-1 certificate using keytool.exe in my jdk 1.8 bin folder. I have now created 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'
}
获得 RESULT_CANCELED
的一个原因是您的包名称与您在应用程序中定义的名称不同。
仔细检查您没有在您的 build.gradle 中设置另一个 applicationId
,它可能与清单中定义的 package
不同。
我运行最近也遇到了这个问题。我不确定问题出在哪里,但它可能源于 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 代码的工作,但它突然决定停止工作......至少可以说令人沮丧。
就我而言,我更改了 apk 名称但未能在 OAuth 凭据控制台中更新它。然后我的onActivityResult代码给了我RESULT_CANCELLED。一旦我更正了 apk 名称,一切又开始工作了。
我刚才遇到了这个问题。我花了几个小时才弄明白,所以我想指出那些犯同样错误的人。
我的 Google API 客户端无法仅在生产环境中连接,在开发环境中一切正常。
这是因为我的应用设置为使用“应用签名”。这样一来,如果您使用 Production Keystore 的 SHA1(或图片中的上传证书的 SHA1)创建了 Oauth Client ID,它将不会被使用,因为 google 将删除此证书并更改为“App Signing”证书
所以我们需要做的是解决这个问题:只需像这样用这个新的 SHA1 创建一个新的 OAuth 客户端 ID:
这个问题很容易遇到,因为大多数教程都会告诉您找到生产 SHA1 并在 API 控制台中使用它。但除非您使用“应用程序签名”,否则它将不再起作用。
如果上述解决方案对您没有帮助,那么您绝对应该考虑一次此解决方案。为了弄清楚这一点,我真的很费力。所以我认为,我的发现将帮助其他人避免同样的挣扎和挫折。
我已按照 google 指南 设置 GFit 身份验证。但是完成后,我注意到当我的应用程序请求用户许可时,它会弹出身份验证屏幕。但是当用户选择一个帐户时,它只是 onActivityResult()
中的 returns RESULT_CANCELED
而不是 RESULT_OK
。其背后的原因是证书不匹配。我使用项目的 keystore 文件来生成 OAuth 令牌生成所需的 SHA-1
指纹。但是我正在部署的构建是 debug
一个。当我尝试使用 release
构建时,它运行良好。其背后的原因是,Android Studio 默认使用 debug.keystore
文件来签署 debug
构建,这与项目的 密钥库 文件。这就是它在调试模式下不起作用的原因。当我将项目的 debug
配置更改为使用项目的 keystore 文件时,效果非常好。所以,我建议先检查这个用例。大多数情况下,这是实际问题。您可以找到另一个解决此问题的 Whosebug 问题
要了解更多关于如何为您的构建change/modify签名配置,请参阅this。
我遇到了同样的问题,错误是我使用的是最终更改包名称的构建风格(完整、模拟)。 因此,在控制台中,我必须输入包的味道,而不是清单的味道。 希望这有帮助:)
我有类似的问题并通过在 build.gradle
文件中统一 fitness
和 auth
依赖项的版本号来解决。
implementation "com.google.android.gms:play-services-fitness:18.0.0"
implementation "com.google.android.gms:play-services-auth:18.0.0"
之前我使用的是 auth:17.0.0
,这导致该功能在随机基础上失败(是的,它有时有效,但有时会失败)。
因此,如果上述解决方案没有帮助,我认为值得检查您的依赖关系。
在我的例子中,我尝试重用 Firebase 生成的 OAuth 客户端,但没有创建新客户端。这样做通常似乎没问题,但是,我从未在 Firebase.
中启用 Google 身份验证(事实上,甚至没有启用 Firebase 身份验证)我从没想过您还必须这样做,但事实证明,这对我有用!
要在 Firebase 中启用 Google 身份验证,请执行以下操作:
- 在 Firebase 中展开左侧边栏并点击“身份验证”。
- 如果尚未启用,请启用身份验证。
- 在“登录方式”选项卡中点击“Google”并启用它。