Android 如何使用片段启动Smartlock保存而不是使用活动
我刚刚意识到,在为android应用程序进行重构时,smartlock api不允许我向ResolvingResultCallbacks对象传递片段 API只允许我将活动作为上下文传递,这意味着我需要在活动的onActivityResult()方法而不是片段的方法中处理凭据结果。但在我们应用程序的当前设计中,我们希望片段能够处理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
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);
}