我正在使用内置帐户系统(使用AccountManager API)为Android应用程序实现一个登录系统。
在Android 2.2+上一切都很好,但是在Android2.1上没有在帐户设置屏幕中包含一个SyncAdapter原因重新启动(参见http://code.google.com/p/android/issues/detail?id=5009和AccountManager without a SyncAdapter?)。
为了解决这个问题,我实现了一个存根SyncAdapter,它只从IBinder onBind(Intent intent)返回null,并将相关内容添加到清单中。这解决了Android2.1上的重新启动问题。
然而,它带来了另一个问题:在添加了一个帐户之后,Android系统将在稍后的某个时候启动一个帐户同步。虽然没有发生错误(实际上,我的SyncAdapter什么也不做,但它无法导致错误,除非返回null),同步图标停留在顶部的通知栏中。这将导致Android同步系统维护永久锁锁,从而防止设备休眠。
帐户不列出帐户设置屏幕中的任何同步组件(在“数据和同步”标题下),并且始终显示帐户列表中同步状态的“同步关闭”(即使同步图标在通知栏中可见)。禁用帐户同步不会消除问题。删除帐户将停止问题。
我猜我不应该返回null。我应该返回ThreadedSyncAdapter的基本实现吗?任何帮助获得一个帐户系统,没有关联的同步正常工作在2.1和2.2+是非常感谢的。
发布于 2011-03-21 20:35:43
我在某种程度上解决了自己的问题:不能从服务的null方法返回onBind --必须返回AbstractThreadedSyncAdapter的IBinder。
这有一种意想不到的效果,就是在帐户设置页面的数据和同步部分添加一个条目,即使我的AbstractThreadedSyncAdapter实现什么也不做;我希望避免这种情况。
总之,为了使用Android中的帐户系统,您必须:
android.content.SyncAdapter.
onBind方法返回AbstractThreadedSyncAdapter实现的IBinder。ContentProvider (可以只是一个存根实现),在SyncAdapter XML文件中称为contentAuthority。H 218H 119这是ContentProvider在帐户设置页面的数据和同步头下列出的另一面。H 220F 221发布于 2012-11-07 09:19:37
由于这是我见过的唯一与这个问题有关的问题,所以这是一个>年后的答案。我还遇到了永久的唤醒锁定问题,因为android系统自动同步我的自定义帐户。
处理这一问题的最佳方法是,它需要最少的代码,并且实际上是这样做的,除非在代码中专门调用同步,否则帐户永远不会同步:
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);现在,这要求您在创建帐户时调用此静态方法。第一个参数是要设置此设置的帐户,第二个参数是使用的内容提供程序的权限,第三个参数是当设置为正数时启用同步的整数,当设置为0时禁止同步,而设置为任何其他参数则会使其未知。使用权限可以在sync_something.xml属性下的“contentAuthority”中找到,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>这是我用来在LoginActivity中创建自定义帐户的代码片段:
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);
}
}最重要的是,当系统尝试同步服务时,它首先检查服务是否是同步的,如果它设置为false,则取消同步。现在,您不必创建自己的ContentProvider,也不必在数据和同步下显示您的ContentProvider。然而,需要有一个AbstractThreadedSyncAdapter的存根实现,它在它的onBind方法中返回一个IBinder。,最后但并非最不重要的是,它使用户无法启用同步或使用这个帐户的“同步”按钮,除非您在应用程序中添加了功能。
https://stackoverflow.com/questions/5358391
复制相似问题