7

我最近将 Google 的 Smart Lock for Passwords 功能集成到我的应用程序中,几乎一切都按预期顺利运行。

只有一个小问题我还无法解决:在ResultCallback#onResult中,如果status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED以下命令导致显示一个谷歌解析对话框,询问是否通过 Smart Lock 保存凭据(见附图)或使用哪些凭据,如果 Smart Lock 中已经保存了多个凭据:

status.startResolutionForResult(getActivity(), REQUEST_CODE_READ);

Google Smart Lock 对话框:使用 Smart Lock 保存密码? 从不或保存密码

当分辨率对话框出现时,用户做了一些方向改变,那么分辨率对话框就会成倍增加,每个对话框都与其他对话框重叠。作为用户,您首先看不到对话框有多个副本,但如果您关闭第一个(通过点击“从不”或“保存密码”),那么最上面的对话框就会消失,下面会显示另一个相同的对话框。

4

2 回答 2

6

您可以通过在活动开始和停止之间保持某种状态来处理此问题。

请参阅此示例代码mIsResolving中变量的使用。只需保存在被调用时是否已经存在待处理的对话框并在中恢复,如果是,请注意不要再次调用API,为intent接收到一次清除状态。onSaveInstanceState()onCreate()onActivityResult()

private void resolveResult(Status status, int requestCode) {
    // We don't want to fire multiple resolutions at once since that can result
    // in stacked dialogs after rotation or another similar event.
    if (mIsResolving) {
        Log.w(TAG, "resolveResult: already resolving.");
        return;
    }
    if (status.hasResolution()) {
        try {
            status.startResolutionForResult(MainActivity.this, requestCode);
            mIsResolving = true;
...

@Override
protected void onCreate(Bundle savedInstanceState) {
...
    if (savedInstanceState != null) {
        mIsResolving = savedInstanceState.getBoolean(KEY_IS_RESOLVING);
    }
...

@Override
protected void onSaveInstanceState(Bundle outState) {
...
    outState.putBoolean(KEY_IS_RESOLVING, mIsResolving);
...

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
...
            mIsResolving = false;
...

这是许多应用程序的常见缺陷,因此我们将研究是否可以在 Play Services 层中支持此状态,但目前,为活动使用布尔值是维护分辨率状态的当前和一般建议。

于 2016-03-23T18:46:36.320 回答
0

我知道,这是一个老问题,但最近我不得不解决这个问题,在我的情况下,我status.startResolutionForResult()在自定义类中使用并且我没有任何访问权限onSaveInstanceState()(我可以使用接口进行一些自定义回调,但我没有'不想),但在我的自定义类中我有一个活动的实例,所以总是在调用之前startResolutionForResult()我检查mActivity.hasWindowFocus()活动是否失去焦点,因为显示的对话框,如果它是真的,那么我打电话startResolutionForResult(),否则我没做什么

@Override
public void onResult(@NonNull LocationSettingsResult result) {

    final Status status = result.getStatus();
    switch (status.getStatusCode()){
        case LocationSettingsStatusCodes.SUCCESS:

            getLocation();
            break;
        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

            if (mActivity.hasWindowFocus()) {
                try {
                    status.startResolutionForResult(mActivity, SETTINGS_CHECK);
                } catch (IntentSender.SendIntentException e) {
                    e.printStackTrace();
                }
            }
            break;
        case  LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

            mReceiver.unableToObtainLocation();
            break;
    }
}
于 2017-03-19T12:32:31.203 回答