我最近将Google的智能锁密码功能集成到我的应用中,几乎所有内容都按预期顺利运行。
我只能解决一个小问题:在ResultCallback#onResult
中,如果status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED
,则以下命令会导致出现一个Google决议对话框,询问是否保存凭据如果智能锁中已保存多个凭据,则通过智能锁(请参阅附图)或要使用的凭据:
status.startResolutionForResult(getActivity(), REQUEST_CODE_READ);
当显示分辨率对话框,并且用户进行了一些方向更改时,分辨率对话框会相乘,每个对话框都会重叠。作为用户,您首先看不到对话框的多个副本,但是如果您关闭第一个对话框(通过点击“从不”或“保存密码”),则最上面的对话框将消失,从而在下面显示另一个相同的对话框。
答案 0 :(得分:6)
您可以通过在活动开始和停止之间保持某种状态来处理此问题。
请参阅此sample code中mIsResolving
变量的使用。只需保存调用onSaveInstanceState()
时是否已有待处理的对话框并在onCreate()
中恢复,并防止再次调用API,一旦收到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服务层支持此状态,但目前,使用活动的布尔值是维护解决方案的当前和一般建议状态。
答案 1 :(得分: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;
}
}