如何从应用程序本身禁用Google Fit并撤消权限

我已经设置了连接到Google Fit的应用,可以读取和写入有关用户身体的一些数据。 当用户在应用设置中停用Google健身时,我会尝试通过以下方式撤消我的应用权限:

public void disableGoogleFit(){ if(!mClient.isConnected()){ Log.e(TAG, "Google Fit wasn't connected"); return; } PendingResult pendingResult = Fitness.ConfigApi.disableFit(mClient); pendingResult.setResultCallback(new ResultCallback() { @Override public void onResult(Status status) { if(status.isSuccess()) { Log.i(TAG, "Google Fit disabled"); }else{ Log.e(TAG, "Google Fit wasn't disabled " + status); } } }); } 

即使我可以成功读取/写入数据,禁用Fit也会返回错误:

 Google Fit wasn't disabled Status {statusCode=unknown status code: 5010, resolution=null} 

Edit1:添加了整个方法,其中可见,该客户端在我尝试禁用Fit时连接。

我也遇到过类似的问题。

如果应用程序未在Google开发人员控制台中正确注册,则会出现此问题。

我认为您已经使用生产密钥库证书指纹(SHA1)在Google开发人员控制台上注册了应用程序,您在具有调试密钥库的应用程序上进行测试。

执行以下步骤:

  1. 使用调试密钥库证书指纹(SHA1)再创建一个客户端ID。
  2. 卸载现有应用。
  3. 安装应用并连接到Google适合。
  4. 在google fit app下检查并确保您的应用程序列为已连接的应用程序(…>设置>已连接的应用程序>已连接的应用程序和设备)。
  5. 现在运行上面的代码,它会工作!

如果我撤消了操作的Google Fit方面的访问而不是调用disableFit()方法,我遇到了这个问题。 当使用disableFit()方法时,事情变得很糟糕,重新连接是一个蛋糕步行。 但是当Google Fit撤销访问时,它并没有消除现有的OAuth,因此您陷入了困境。 Limbo因为您已断开连接但未发出OAuth质询,因此您不断收到5010错误。

我想出的唯一解决方案是通过连接到另一个帐户来进行OAuth挑战。 那你很好。 这听起来像是Google Fit上的一个问题,而客户端则没有任何问题。

目前有15.0.1 lib,可以轻松完成:

 fun disconnect(context: Context) { val fitnessOptions = FitnessOptions.builder() .addDataType(DataType.TYPE_WORKOUT_EXERCISE, FitnessOptions.ACCESS_READ) .build() val signInOptions = GoogleSignInOptions.Builder().addExtension(fitnessOptions).build() val client = GoogleSignIn.getClient(context, signInOptions) client.revokeAccess() } 

根据Android开发者论坛

https://developer.android.com/reference/com/google/android/gms/fitness/ConfigApi.html

public static final int APP_NOT_FIT_ENABLED

状态代码表示在Google健身中的已连接应用列表中找不到应用。 表示已撤消对应用程序的访问权限,或者未在开发人员控制台上注册该应用程序。

常数值:5010(0x00001392)

并且要调用disableFit客户端必须在呼叫时连接

 public abstract PendingResult disableFit (GoogleApiClient client) 

禁用Google Fit适用于某款应用。 可用于撤消应用程序中所有已授予的OAuth访问权限,从而删除应用程序的所有现有订阅和注册。

参数

客户端现有的GoogleApiClient。 必须在此通话时连接

禁用通话后

 mClient.disconnect(); 

这对我有用