【问题标题】:Multiple Smart Lock dialogs on orientation change关于方向更改的多个 Smart Lock 对话框
【发布时间】:2016-03-23 17:28:38
【问题描述】:

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

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

status.startResolutionForResult(getActivity(), REQUEST_CODE_READ);

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

【问题讨论】:

    标签: android google-api google-smartlockpasswords


    【解决方案1】:

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

    查看此sample codemIsResolving 变量的使用。只需保存在调用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 Services 层中支持此状态,但目前,为 Activity 使用布尔值是维持分辨率状态的当前和一般建议。

    【讨论】:

      【解决方案2】:

      我知道,这是一个老问题,但最近我不得不解决这个问题,在我的情况下,我在自定义类中使用 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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 1970-01-01
        相关资源
        最近更新 更多