Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用片段启动Smartlock保存而不是使用活动_Android_Android Fragments_Google Smartlockpasswords - Fatal编程技术网

Android 如何使用片段启动Smartlock保存而不是使用活动

Android 如何使用片段启动Smartlock保存而不是使用活动,android,android-fragments,google-smartlockpasswords,Android,Android Fragments,Google Smartlockpasswords,我刚刚意识到,在为android应用程序进行重构时,smartlock api不允许我向ResolvingResultCallbacks对象传递片段 API只允许我将活动作为上下文传递,这意味着我需要在活动的onActivityResult()方法而不是片段的方法中处理凭据结果。但在我们应用程序的当前设计中,我们希望片段能够处理smartlock逻辑 以下是我的保存代码: Auth.CredentialsApi.save(mSmartLockApiClient, credential).set

我刚刚意识到,在为android应用程序进行重构时,smartlock api不允许我向ResolvingResultCallbacks对象传递片段

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

以下是我的保存代码:

 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) {}
     });

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

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);
}
公共抽象类ResolvingResultCallbacks
扩展ResultCallbacks{
私有静态最终字符串TAG=“ResolvingResultCallback”;
私人最终碎片;
私人最终int mRequestCode;
受保护的ResolvingResultCallbacks(
@非空片段片段,
int请求代码){
mFragment=片段;
mRequestCode=请求代码;
}
@凌驾
公共最终void onFailure(@NonNull状态结果){
if(result.hasResolution()){
试一试{
mFragment.StartinentSenderForResult(
result.getResolution().getIntentSender(),
mRequestCode,
null,//fillinitent,
0,//flagsMask,
0,//标志值
0,//外部标志
null);//选项
}catch(IntentSender.SendIntentException ex){
Log.e(标签“未能启动解析”,ex);
无法解决的故障(
新状态(CommonStatusCodes.INTERNAL_ERROR));
}
}否则{
无法解决的故障(结果);
}
}
@凌驾
成功时公共摘要无效(@NonNull R result);
@凌驾
公共摘要void onnResolvableFailure(@NonNull Status result);
}
StartinentSenderForresult仅添加到API v24中的本机
片段
类型中,因此您可能需要使用支持
片段
实现


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

谢谢!它工作得非常好。除了MFFragment.StartinentSenderForResult中缺少一些参数之外。除息的
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);
}