4

我刚刚意识到,当我为 Android 应用程序进行重构时,smartlock api 不允许我将 Fragment 传递给 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);
}
4

1 回答 1

5

我同意 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 仅添加到FragmentAPI v24 中的本机类型,因此您可能需要改用支持Fragment实现。

我没有测试过这个,所以请让我知道它是否适合你。

于 2016-11-17T20:33:06.313 回答