7

同じアカウント タイプで動作する 2 つのアプリがあります。ユーザーが 2 つ目のアプリを初めて開いて、1 つのアカウントが存在するときに、以下のページが表示されるようにします。

ここに画像の説明を入力

しかし、このコードを実行しても何も起こりません:

final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, null, null);

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Bundle bnd = future.getResult();

            final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
            showMessage((authtoken != null) ? "SUCCESS!\ntoken: " + authtoken : "FAIL");
            Log.d("udinic", "GetToken Bundle is " + bnd);
        } catch (Exception e) {
            e.printStackTrace();
            showMessage(e.getMessage());
        }
    }
}).start();

上記のコードは、オーセンティケーターを持つアプリから実行すると正しく機能します。代わりに以下のコードを実行すると、クリックすると上の画像が表示されるという通知がシステムによって生成されます。

final AccountManagerFuture<Bundle> future = mAccountManager
        .getAuthToken(account, authTokenType, null, true,
                null, handler);

許可ボタンをクリックすると、AuthToken正しく返されます。getAuthTokenただし、通知をクリックするのではなく、呼び出し時に許可付与ページ (上の画像) を表示したい。どうやってやるの?

4

2 に答える 2

0

ここでいくつかのことを説明します。Android でスレッドを使用することは、一般的に悪い習慣と見なされます。Android のドキュメントによると、非同期タスクまたはハンドラーを使用することをお勧めします。Android ドキュメントごとの認証メッセージの場合、予想される出力は通知です。

getAuthToken(Account account, String authTokenType, Bundle options, boolean notifyAuthFailure, AccountManagerCallback<Bundle> callback, Handler handler)

特定のアカウントの指定されたタイプの認証トークンを取得し、オプションで、ユーザーが資格情報を入力する必要がある場合に通知を発生させます。

getAuthToken に Handler パラメータがあることに注目してください。これは、タスクの非同期を処理するための推奨される方法です。ここでの問題はyou CAN NOT have a full screen message on a handler thread, because it can't interrupt the UI thread.、最初の例では実際にUIスレッドで呼び出しを呼び出すmAccountManagerため、UIを引き継ぎ、全画面の許可または拒否メッセージを送信できますが、ハンドラーは使用できないため、これはハンドラーでは実行できませんUI スレッド (実行時にエラーをスローします)。

私の提案した解決策は?フルスクリーンの割り込みメッセージが必要な場合はハンドラーを使用しないでください。最初のコード スニペットと同様に、UI スレッドでアクションを実行してください。

AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, callback, null); 
//USE implements and implement a listener in the class declaration and 
//use 'this' in the callback param OR create a new callback method for it
于 2015-09-15T02:25:31.543 に答える