gpt4 book ai didi

android - 如何在没有 SyncAdapter 的情况下在 Android 上实现帐户

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:20 26 4
gpt4 key购买 nike

我正在使用内置帐户系统(使用 AccountManager API)为 Android 应用程序实现登录系统。

在 Android 2.2+ 上一切都很好,但在 Android 2.1 上不包括 SyncAdapter 会导致帐户设置屏幕重新启动(参见 http://code.google.com/p/android/issues/detail?id=5009AccountManager without a SyncAdapter?)

为了解决这个问题,我实现了一个 stub SyncAdapter,它只从 IBinder onBind(Intent intent) 返回 null,并将相关内容添加到 list 中。这解决了 Android 2.1 上的重启问题。

然而,它引入了一个进一步的问题:添加帐户后,Android 系统将在一段时间后启动帐户同步。虽然没有发生错误(实际上我的 SyncAdapter 什么都不做,除非返回 null,否则它无法导致错误),同步图标仍然停留在顶部的通知栏中。这导致 Android 同步系统保持永久唤醒锁定,防止设备休眠。

该帐户不会在帐户设置屏幕(在“数据和同步”标题下)中列出任何可同步的组件,并且始终在帐户列表中显示“同步已关闭”的同步状态(即使同步图标在通知栏中可见)。禁用帐户同步并不能解决问题。删除帐户可以解决问题。

我的猜测是我不应该返回 null。我应该返回 ThreadedSyncAdapter 的基本实现吗?非常感谢任何帮助在没有关联同步的情况下在 2.1 和 2.2+ 上正常工作的帐户系统。

最佳答案

因为这是我见过的唯一与此问题相关的问题,所以这是一个 > 晚了的答案。由于 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 中创建自定义帐户的代码 fragment :

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 的 stub 实现,它在它的 onBind 方法中返回一个 IBinder。最后但并非最不重要的一点是,它使用户无法启用同步或使用“立即同步” "此帐户的按钮,除非您已在您的应用程序中添加该功能。

关于android - 如何在没有 SyncAdapter 的情况下在 Android 上实现帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com