SyncadapterなしでAndroidにアカウントを実装するにはどうすればよいですか
質問
組み込みのアカウントシステム(AccountManager APIを使用)を使用してAndroidアプリケーション用のログインシステムを実装しています。
Android 2.2+ではすべてが順調で良好ですが、Android 2.1にはSyncadapterが含まれていないため、アカウント設定画面に再起動が発生します(参照 http://code.google.com/p/android/issues/detail?id=5009 と SyncadapterのないAccountManager?)
これを回避するために、私はStub Syncadapterを実装しました。 null
から IBinder onBind(Intent intent)
, 、および関連するものをマニフェストに追加しました。これにより、Android 2.1の再起動問題が解決されます。
ただし、さらなる問題が発生します。アカウントが追加された後、Androidシステムはしばらくして、アカウントの同期を開始します。エラーは発生しませんが(実際、私のSyncadapterは何もしませんが、返却しない限りエラーを引き起こす方法はありません null
)、同期アイコンは、上部の通知バーに詰まったままです。これにより、Android同期システムが維持されます 永続的なウェイクロック, 、デバイスの睡眠を防ぎます。
アカウントは、アカウント設定画面(「データと同期」ヘッダーの下)に同期可能なコンポーネントをリストしておらず、アカウントのリストの同期ステータスの場合は常に「同期がオフ」に表示されます(同期アイコンが表示されている場合でも、通知バー)。アカウントの同期を無効にしても、問題は削除されません。アカウントを削除すると、問題が停止します。
私の推測では、私はヌルを返すべきではありません。 threadedsyncadapterの基本的な実装を返す必要がありますか? 2.1および2.2+で適切に動作する関連同期なしでアカウントシステムを取得するのに役立つことは大歓迎です。
解決 2
私は自分の問題を解決しました:あなたは戻ることができません null
から onBind
サービスの方法 - 返品する必要があります IBinder
の AbstractThreadedSyncAdapter
.
これには、アカウント設定ページのデータと同期セクションへのエントリを追加することが望ましくない効果があります。 AbstractThreadedSyncAdapter
何もしません。私はこれを避けたいと思っていました。
要約するには、Androidのアカウントシステムを使用するには、次のことが必要です。
- を持っているサービスを実装します
IntentFilter
為にandroid.content.SyncAdapter
. - このサービスは返品する必要があります
IBinder
のAbstractThreadedSyncAdapter
それからの実装onBind
方法。 - これにより、あなたが持っている必要があります
ContentProvider
(単にスタブ実装になることができます)と呼ばれるcontentAuthority
syncadapter xmlファイルで。 - これには、ContentSproviderがアカウント設定ページのデータと同期ヘッダーの下にリストされているというダウンサイドがあります。
他のヒント
これは私がこの問題に関連して見た唯一の質問なので、これは> Year Detwed回答です。また、Androidシステムがカスタムアカウントを自動的に同期するため、永続的なウェイクロックの問題にも出会いました。
これを処理するための最良の方法。これは最小コードを必要とし、実際にそれを作成するため、コードで同期するように特別に呼び出されない限り、アカウントが同期しないようにします。
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
これには、アカウントを作成した瞬間にこの静的方法と呼ばれる必要があります。最初のパラメーターはこの設定を設定するためのアカウントであり、2番目のパラメーターは使用されたContentSproviderの権限であり、3番目は正の数値に設定されたときに同期を有効にすると、0に設定すると同期を無効にし、他のものに設定したときに整数です。それを不明にします。使用する権限は、contentAuthority属性の下で「sync_something.xml」内にあります。これは、syncadapterで使用されています。
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.contacts"
android:accountType="com.myapp.account"/> <!-- This being your own account type-->
上記のXMLファイルは、AndroidManifest.xmlのサービス部分内で指定されています。
<service android:name=".DummySyncAdapterService"
exported="true"
android:process=":contacts">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapter"
android:resource="@xml/sync_something" /> <!--This points to your SyncAdapter XML-->
</service>
これは、ログニタビティ内でカスタムアカウントを作成するために使用するコードスニペットです。
Account account = new Account("John Doe", "com.myapp.account");
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
AccountManager am = AccountManager.get(LoginActivity.this);
boolean accountCreated = am.addAccountExplicitly(account, "Password", null);
Bundle extras = LoginActivity.this.getIntent().getExtras();
if(extras != null){
if (accountCreated) {
AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, "John Doe");
result.putString(AccountManager.KEY_ACCOUNT_TYPE, "com.myapp.account");
response.onResult(result);
}
}
これの大部分は、システムがサービスを同期しようとすると、最初にサービスが同期できるかどうかをチェックすることです。虚偽に設定されている場合、同期をキャンセルすることです。今、あなたはあなた自身を作成する必要はありません ContentProvider
あなたもそうではありません ContentProvider
データと同期の下に表示されます。 ただし、onbindメソッド内にibinderを返すabstractthreadedsyncadapterのスタブ実装が必要です。 そして最後になりましたが、アプリ内に機能を追加しない限り、ユーザーがこのアカウントの「今すぐ同期」ボタンを有効にしたり、使用したりすることができないようにします。