7

同じアカウントタイプで動作する2つのアプリがあります。私は、ユーザーが初めて二アプリを開いたときに表示されるページの下にしたいとつのアカウントが存在します。別のアプリからカスタムアカウントのAuthTokenを取得できない

enter image description here

しかし、私はこのコードを実行したときに何も起こりません:

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を呼び出すときに、許可の許可ページ(上記の画像)を見たいと思っています。どうやってやるの?

答えて

1

私の代わりに前のもので、この方法を使用し、今私は確認ダイアログを参照してください。第二アプリが異なるの署名を持っていなければならないこと

accountManager.getAuthToken(account, AUTH_TOKEN_TYPE_FULL_ACCESS, null, true, new AccountManagerCallback<Bundle>() { 
      @Override 
      public void run(AccountManagerFuture<Bundle> future) { 
       try { 
        Bundle bundle = future.getResult(); 
        String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN); 

       } catch (OperationCanceledException | IOException | AuthenticatorException e) { 

       } 
      } 
}, null); 

注意を。両方のアプリの署名が同じ場合、確認は不要でauthTokenが検索されます。

+0

AUTH_TOKEN_TYPE_FULL_ACCESSの値は何ですか?私の場合、アプリが最初にインストールされたときに上記の画面が表示されますが、何も起こらないことを許可した後は、「フルアクセス」ですか? –

0

ここに行くにはいくつかあります。 Androidでのスレッドの使用は、一般的に悪い習慣と考えられています。Androidドキュメントごとに、AsyncタスクまたはHandlerを使用することをお勧めします。 AndroidドキュメントごとのAuthメッセージの場合、期待される出力は通知です。

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

ユーザが認証情報を入力する必要がある場合 は、必要に応じて通知を上げ、特定のアカウントのために指定されたタイプの認証トークンを取得します。

getAuthTokenにHandlerパラメータがどのように設定されていますか。これは、タスクasyncを処理するための優先メソッドです。ここでの問題は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 
+0

また、コールバックがあなたに探しているメッセージを与える天気を見るためにテストできるように、コールバックパラメータを試してみることを検討してください。コールバックは重要です。なぜなら、プロセスが完了したときに、別のスレッドにあったとしてもそれが通知されるからです。これにより、あなた(またはAndroidシステム)は、あなたがしようとしているように結果に基づいてUIプロンプトを表示することができます。 –

+0

私はあなたのソリューションをテストしましたが、 'getAuthToken'を呼び出しても何も起こらなかった。 callbackの内部でメソッドを呼び出すことはありません。 –

+0

私はあなたが理解しているとは思わないし、あなたの特定の状況を試してみるのに十分なコードがここにはありません。あなたが望むものを得るためには、UIスレッド上でそれをしなければなりません。 a)UIスレッドで操作全体を実行することができます。これははるかに簡単です。b)ハンドラを使用し、コールバックがメッセージを表示するまで待ちます。私はこのメッセージがAndroidのメッセージに組み込まれていると仮定しているので、コールバックでそれを行うことを願っていなければなりません。さもなければ、あなたはUIスレッドに固執しています。 –

関連する問題