如何使用片段开始 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
实现。
我还没有测试过,所以请告诉我它是否适合你。
我刚意识到智能锁 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
实现。
我还没有测试过,所以请告诉我它是否适合你。