7

最近、Google の Smart Lock for Passwords 機能をアプリに統合しましたが、ほぼすべてが期待どおりにスムーズに動作しています。

まだ修正できていない小さな問題が 1 つありResultCallback#onResultますstatus.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED。 、Smart Lock に複数の認証情報が保存されている場合:

status.startResolutionForResult(getActivity(), REQUEST_CODE_READ);

Google Smart Lock ダイアログ: Smart Lock でパスワードを保存しますか?  パスワードを使用しない、またはパスワードを保存する

解像度ダイアログが表示され、ユーザーが向きを変更すると、解像度ダイアログが増加し、それぞれが他のダイアログと重なります。ユーザーとして、最初はダイアログの複数のコピーがあることはわかりませんが、最初のダイアログを閉じると ([しない] または [パスワードを保存] をタップして)、一番上のダイアログが消え、下に別の同じダイアログが表示されます。

4

2 に答える 2

6

これは、アクティビティの開始と停止の間の状態を維持することで処理できます。

このサンプル コードmIsResolvingでの変数の使用を参照してください。が呼び出されたときに保留中のダイアログが既に存在するかどうかを保存し、で復元します。存在する場合は、API を再度呼び出すことを防ぎます。目的のために受信した状態を一度クリアします。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 に答える