2つの別々のAndroidプロジェクトがあります。1つはデバイスのユーザーアカウントを管理するためのAbstractAccountAuthenticatorの実装であり、もう1つはAccountAuthenticatorからトークンを取得して使用するプッシュアプリケーションです。
AbstractAccountAuthenticatorの実装は機能しており、[設定]メニューの[アカウントと同期]セクションから呼び出されるとアカウントが追加されますが、プッシュアプリからaddAccount()を呼び出すと、[アクセスが拒否されました:checkComponentPermission()]とアプリはそこで死にます。
ソースコードを公開することは私の力ではないので、私はソースコードの多くを提供することはできませんが、それらが「スタンドアロン」の方法で機能することを保証します。
さまざまなアプリケーションからAccountManagerの正しい使用例を検索しましたが、見つかりませんでした。freenodeでも運がない。
AccountAuthenticator内から(Intent.FLAG_NEW_TASKとcontext.startActivity(intent)を使用して)アクティビティを開始するとうまくいくことがわかりましたが、これはaddAccount()がAccountManagerに戻らないことを意味します。 AccountManagerの使用の流れを妨げるため、開発中のガイドラインに合わせてください。もう1つの方法は、ユーザーの資格情報を要求するときに使用されるAcitivityをエクスポートすることです。ただし、これはセキュリティの問題である可能性があると思います。これは、外部からではなく、AccountManagerによって呼び出される必要があるためです。
あなたがこれについて持っているかもしれないどんな考えにも感謝します。
PS:
アプリ間で機能することに気付いていない特別な権限が必要な場合を除いて、すべての権限が正しく使用されます。
コードの断片を使用して、懸念している行をここに表示できるかどうかを尋ねます。
ここに投稿された最初の質問、私はここで(m)ルールを破っていないことを願っています(私はこことグーグルで検索しましたが、役に立たなかったので尋ねました)。
ありがとうございました。
Googleのログインサービスを深く掘り下げて設定クラスに出くわした後、私は解決策として私が考えるものを見つけました。
ものをエクスポートしないでください。AccountManagerをバイパスして、実装の何かを呼び出したり、サービスやアクティビティにしたりすることはセキュリティの問題だと私は考え続けています。
Intent.FLAG_NEW_TASK
を使用しないstartActivity()
でくださいAbstractAccountAuthenticator
。予期しない動作が発生する可能性があります。
これを行う方法は、実際には非常に簡単です。
Intent i = new Intent( Settings.ACTION_ADD_ACCOUNT );
i.putExtra( Settings.EXTRA_AUTHORITIES, new String[] { "com.exaple.yourauth" } );
contextVar.startActivity( i );
このように、表示する権限を持つ文字列であるEXTRA_AUTHORITIESパラメータを追加しているため、新しいアカウント、バスの可能な権限のリストを上げるように設定に要求しています。これにより、オプションが必要なものに制限されます。1つだけが追加に一致する場合、アカウントマネージャとログインアクティビティは適切な方法で呼び出されます。
これが周りの他の人に役立つことを本当に願っています。