如何使用片段开始 Smartlock 保存而不是使用 Activity

How to use a Fragment to start Smartlock saving instead of using an Activity

我刚意识到智能锁 api 不允许我在重构 android 应用程序时将片段传递给 ResolvingResultCallbacks 对象。

API 只允许我将 Activity 作为上下文传递,这意味着我需要处理 Activity 的 onActivityResult 中的凭据结果() 方法而不是 Fragment 的。但是在我们应用程序当前的设计中,我们希望 Fragment 来处理智能锁逻辑。

这是我的保存代码:

 Auth.CredentialsApi.save(mSmartLockApiClient, credential).setResultCallback(
     new ResolvingResultCallbacks<Status>(mActivity, RC_CREDENTIALS_SAVE) {
       @Override
       public void onSuccess(Status status) {                               
         mSmartLockSaveCallBack.onSuccess();
       }

       @Override
       public void onUnresolvableFailure(Status status) {}
     });

实际上对于请求凭据,我遇到了同样的问题,api 没有提供传递片段以启动解析的方法。但我找到了解决方法:

 if (status.hasResolution()) {
   mFragment.startIntentSenderForResult(
       status.getResolution().getIntentSender(), 
       RC_CREDENTIALS_READ, 
       null, 
       0, 
       0, 
       0, 
       null);
}

我同意 ResolvingResultCallbacks 不直接支持片段令人失望,但实现实际上非常简单。这是一个支持片段的变体:

public abstract class ResolvingResultCallbacks<R extends Result>
    extends ResultCallbacks<R> {
  private static final String TAG = "ResolvingResultCallback";

  private final Fragment mFragment;
  private final int mRequestCode;

  protected ResolvingResultCallbacks(
      @NonNull Fragment fragment, 
      int requestCode) {
    mFragment = fragment;
    mRequestCode = requestCode;
  }

  @Override
  public final void onFailure(@NonNull Status result) {
    if (result.hasResolution()) {
      try {
        mFragment.startIntentSenderForResult(
            result.getResolution().getIntentSender(),
            mRequestCode,
            null, // fillInIntent,
            0, // flagsMask,
            0, // flagsValues
            0, // extraFlags
            null); // options
      } catch (IntentSender.SendIntentException ex) {
        Log.e(TAG, "Failed to start resolution", ex);
        onUnresolvableFailure(
            new Status(CommonStatusCodes.INTERNAL_ERROR));
      }
    } else {
      onUnresolvableFailure(result);
    }
  }

  @Override
  public abstract void onSuccess(@NonNull R result);

  @Override
  public abstract void onUnresolvableFailure(@NonNull Status result);
}

startIntentSenderForResult 仅添加到 API v24 中的原生 Fragment 类型,因此您可能需要使用支持 Fragment 实现。

我还没有测试过,所以请告诉我它是否适合你。