2016-03-23 4 views
6

私は最近、GoogleのSmart Lock for Passwords機能を自分のアプリに統合しました。ほとんどのものは期待通りに動作しています。オリエンテーションの変更に関する複数のスマートロックダイアログ

ResultCallback#onResultでは、status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIREDの場合、次のコマンドを実行すると、スマートロックを使用してクレデンシャルを保存するかどうかを尋ねるGoogle解決ダイアログが表示されます(添付の画像を参照)。 )、または使用する資格情報、そこスマートロックで保存された複数の資格情報に既にある場合:

status.startResolutionForResult(getActivity(), REQUEST_CODE_READ); 

Google Smart Lock dialog: Save password with Smart Lock? Never or Save Password

は解像度ダイアログが提示され、ユーザーは、いくつかの向きの変更、そして解像度ダイアログ乗算を行います、 それぞれのそれらは他のものと重なっている。ユーザーとしては、最初にダイアログのコピーが複数あることは確認できませんが、最初に「Never」または「Save Password」をタップすると、一番上のダイアログが消え、以下の同じダイアログが表示されます。

答えて

5

これは、アクティビティの開始と停止の間で何らかの状態を維持することで対応できます。

この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; 
... 

これは、多くのアプリケーションのための共通の落とし穴であるので、我々は我々がプレイサービス層で、この状態をサポートできるかどうかに見ていきますが、今のために、活動のためのブール値を使用するため、現在および一般的な推奨事項であります解決状態を維持する。

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; 
    } 
} 
関連する問題