0

まず、動機:

から恩恵を受ける可能性のあるアプリを構築していますが、絶対に必要というわけではありませんAccountManager. GET_ACCOUNTSそのため、権限なしでアプリUSE_CREDENTIALSをビルドし、代わりにService、ユーザーがオプションでインストールできる承認用のプラグインをビルドすることを選択しました。現在、このプラグインは、1 つの明白な問題を除いて、完全に意図したとおりに機能します。最初の承認を要求するIntentから返されたものを開始できますが、完了するのを待ちきれません。getAuthToken(...)

ではなくgetAuthToken(...)から呼び出したい理由がわかったので、トークンを返す前に承認が完了するのを待つ方法を知っている人はいますか? 基本的に、以下のコードでは、完了するまで戻るのを延期する方法を知っている人はいますか?ServiceActivityIntenttokenauthIntent

...
AccountManagerFuture<Bundle> accountManagerFuture;
accountManagerFuture = accountManager.getAuthToken(accounts[0], "android", true, null, null);
Bundle authTokenBundle = accountManagerFuture.getResult();
if (authTokenBundle.containsKey(AccountManager.KEY_AUTHTOKEN))
    token = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString();
else if (authTokenBundle.containsKey(AccountManager.KEY_INTENT)) {
    Intent authIntent = (Intent) authTokenBundle.getParcelable(AccountManager.KEY_INTENT);
    authIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(authIntent);
    ...
    // I know that I wouldn't set token here; this is just to emphasize
    // that I want to set it after authIntent completes
    token = ???
}

また、知っておくと便利な場合は、上記のコードはAsyncTask. 醜いかもしれませんが、 ?getAuthToken(...)が返されなくなるまでポーリングできるかもしれません。Intentしかし、それよりも良い解決策があると信じなければなりません。

4

1 に答える 1

0

これは最良の答えではありませんが、私の特定の状況ではうまくいくはずです。つまり、次の制約が適用されます。

  1. Serviceプラグインは、親アプリとのインターフェースのみを目的として設計されています。
  2. 親アプリは継続的にプラグインを呼び出しません。
  3. Intentによって返される承認は、getAuthToken(...)まれに (おそらく 1 回だけ) 呼び出されます。
  4. Intentfromが実行されるgetAuthToken(...)と、後続の呼び出しは有効なトークン (ユーザーが権限を付与した場合) または無効なトークン (ユーザーが権限を付与しなかった場合) のいずれかを返します。
  5. 認証プロンプトが表示されている間、親アプリは一時停止します。

上記のすべてを考えると、認証プロンプトがフォーカスされたときに親アプリをunbindService(...)呼び出すことができると思います。onPause()認証プロンプトが完了したら、 を呼び出しbindService(...)て、後続の時間にonResume()関連付けられたタスクを呼び出すことができます。getAuthToken(...)その時点で、承認プロンプトは既に適用されているため (通常のユーザー操作を想定)、親アプリは が完了Serviceするのを待っていたかのように (有効または無効な) トークンを取得しIntentます。

このアプローチで見られる問題は、ユーザーが最初に認証を終了せずに親アプリを戻すことに関係していますIntent。私はまだそのケースをテストしていませんがgetAuthToken(...)Intent.

とにかく、それは私が持っているものです。その他の提案/懸念事項は大歓迎です。

于 2014-10-03T03:29:14.147 に答える