如何使用碎片启动智能锁保存而不是使用活动

4
我刚刚意识到,智能锁 API 不允许我在重构 Android 应用程序时将 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);
}
1个回答

5

我同意ResolvingResultCallbacks不直接支持Fragment令人失望,但实现其实非常简单。下面是一个支持Fragment的变体:

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实现。

我没有测试过这个,所以如果它对您有用,请告诉我。


谢谢! 它完美地运行。除了在mFragment.startIntentSenderForResult中缺少一些参数。XD - Qing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接