我正在尝试为我的Android应用创建一个SyncAdapter,以显示来自某个特定频道的YouTube视频.这些视频属于公共领域,因此我不希望用户登录,创建帐户,验证自己,上传数据或使用联系人数据库.我只是希望SyncAdapter定期使用该频道的最新视频元数据更新我的应用程序数据库.我已经构建了一个ContentProvider来访问我的数据库.我确实喜欢这样一个事实,即SyncProvider将处理关闭同步,调度和重试退避机制以进行更新的能力.
我早些时候问过SyncAdapter是不是我的用例的好选择,我被告知它是.我观看了Google I/O视频,阅读了文档,阅读了博客......(参见下面的列表).我一直都无法工作.我得到的最好的方法是让SyncAdapter帐户显示在全局"帐户和同步设置"中,但不起作用.即使这有效,但它还不够理想,因为我更喜欢用户除了从我的应用程序内部看不到帐户.如果没有其他选项,这是可以接受的,只要他们不需要访问它来设置它,因为一切都会默认为每天一次自动同步.
我甚至试图按原样使用SampleSyncAdapter并在验证代码部分中放置断点.没有一个断点被击中,所以我看不到触发调用的内容或包含的数据.我原本以为我至少会得到那么多.
尽管有这样的建议,我开始认为使用SyncAdapter是一个坏主意.我还没有找到一个接近我想要的例子,更不用说教程或完整,有组织和清晰的文档了.这似乎应该是许多应用程序想要做的常见任务.
请在此帖子上添加有关此用例的任何好文档.我什么都找不到.
如果没有这个,我认为建议所有人不要在这个用例中使用SyncAdapters是公平的.我不是在为其他用例说话,所以如果它不像我的那样,请不要继续使用它对你的用例有用.
了解为黄金时段准备的API级别的版本也很有帮助.有关版本号的问题已经发布了很多.我试图保持尽可能低的最多用户.我目前的API目标是7.
这里是我尝试无效的链接列表,其他人可能会发现这些更有帮助:
http://developer.android.com/resources/samples/SampleSyncAdapter/index.html
http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html
http://naked-code.blogspot.com/2011/05/revenge-of-syncadapter-synchronizing.html
http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/
http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-2/
http://www.finalconcept.com.au/article/view/android-account-manager-step-by-step
http://www.finalconcept.com.au/article/view/android-account-manager-step-by-step-1
http://www.finalconcept.com.au/article/view/android-account-manager-step-by-step-2
我已经创建了一个自定义帐户类型,我可以在android ContactsContract ContentProvider中成功创建该类型的联系人.但是,在编辑默认联系人应用程序中的联系人时,我很难弄清楚如何获取我的自定义帐户标签和图标.
编辑自定义联系人类型时,标签应为"联系人",右侧是应用程序图标.相反,编辑我的类型的联系人始终显示"仅限电话,未同步的联系人"标签.有关示例,请参见下面的第一个屏幕截图
奇怪的是,它确实提取了我的帐户名称,您可以在错误标签下面的屏幕截图中看到它(以"+1415"开头).
我已经在帐户下的设置应用程序中成功显示了我的应用程序的标签和图标,所以我知道我正在做正确的事情.请参阅下面的第二个屏幕截图,以获取相关证明(帐户标签为"Bolt").

我有以下authenticator.xml:
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="@string/account_type"
android:label="@string/app_name"
android:icon="@drawable/app_icon"
android:smallIcon="@drawable/app_icon" />
Run Code Online (Sandbox Code Playgroud)
这是我的syncadapter.xml:
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="@string/contacts_content_authority"
android:accountType="@string/account_type"
android:userVisible="true"
android:allowParallelSyncs="false"
android:isAlwaysSyncable="true"
android:supportsUploading="false" />
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出我哪里出错吗?我可以根据需要提供更多信息.我尝试使用CLIENT_IS_SYNCADAPTER参数从我的SyncAdapter中创建联系人但没有改变任何内容.我也尝试过其他一些东西,但还没有任何工作.
android android-syncadapter android-contacts android-account
是否可以检索帐户上次同步的时间,例如系统设置 - >帐户和同步应用程序?我使用的是Android 2.2.
查看2.2源代码AccountSyncSettings.java,我看到状态是使用以下方法检索的:
SyncStatusInfo status = ContentResolver.getSyncStatus(account, authority);
Run Code Online (Sandbox Code Playgroud)
但是SyncStatusInfo和getSyncStatus似乎不是公共API的一部分(用@hide标记).有没有其他方法来获取此信息?
我正在寻找一种方法来启用/禁用"常规同步设置"中的"自动同步"复选框.
股票电源控制小部件也具有此功能.如果这个小部件可以做,那么我也应该有一个解决方案,对吗?请各位帮助我,我正在拼命寻找网络上的解决方案但没有成功.
此操作是否可能必须进行用户交互?我知道我可以发送一个Intent打开同步视图,但这不是我的意图!
我不是在寻找特定帐户的同步设置,就像我在这个论坛中找到的那样
ContentResolver.setSyncAutomatically(Account account, String authority, boolean sync);
Run Code Online (Sandbox Code Playgroud) 我正在为我的应用实现同步适配器以与appengine后端同步.在appengine上我使用内置的User api进行身份验证.有一个帖子这里告诉你如何做到这一点,但是应用程序是在Gmail帐户下.理想情况下,我的应用程序将列在帐户中.我不想要求用户输入用户名和密码,只需使用现有的Google帐户进行身份验证即可.有没有人这样做过?
更新:我一直在努力,看起来我可以实现AuthenticationService并存储用户帐户名并将密码保留为空字符串.在getAuthToken()方法中,我应该能够简单地返回google身份验证令牌.一旦我进一步发展就会发布...
我对android上的"USE_CREDENTIALS"权限有一些疑问:
它似乎用于使用你自己的syncadapter.它还可以用于与属于其他应用程序的其他syncaAdapter(或其内容提供商)进行通信吗?
如果#1的答案为否,那么为什么它存在于第一位,如果它是你自己的syncAdapter呢?
除syncAdapter之外还有其他用途吗?
如果我不需要任何身份验证,是否可以在没有此权限的情况下使用syncAdapter?
即使不使用syncAdapter,也可以访问已同步的帐户,使用他们的凭据并对其进行特殊处理(例如,收集最近同步的数据),假设您拥有此权限(和/或其他人)?
permissions android credentials android-contentprovider android-syncadapter
据我所知,在SyncService中定义的一个SyncAdapter仅限于接收一个要处理的ContentProvider权限.
但是,与此同时,它可以访问ContentResolver,它允许在其他ContentProviders上运行查询.如果需要开发人员为SyncAdapter提供单一内容权限,我无法理解这个特定的设计概念,尽管如此,她仍然能够在她有权访问的任何ContentProvider上做任何她想做的事情.我的问题是:忽略onPerformSync的参数有什么后果:字符串权限和ContentProviderClient提供程序以及纯ContentResolver?
我的应用程序(实际上是它的SyncService)的想法很简单:查询日历服务器(在我的情况下为OwnCloud)不仅可以获取事件(与com.android.calendar同步),还可以获取VTODOS,然后可以在各种任务管理应用程序之间分配,我可以获取源代码和/或ContentProviderContract.我还想到了我自己的"Hub"ContentProvider,它具有基本的VTODO/Task结构,并且是与服务器相比唯一的一个.它应该能够与任务管理应用程序的不同内容提供程序同步2路,然后它与服务器同步.
我已阅读使用ContentProviderClient和ContentResolver访问内容提供商,我想我理解其中的区别.我现在感到困惑的是为什么Android SDK中有如此强烈的建议在单个SyncAdapter中使用单个ContentProvider但你可以使用ContentResolver来绕过这个限制.
我花了一整天的时间来搞清楚这一点并在此问题上搜索了数百个SO/Google资源(其中一些是多次).我还看到了有关使用一个SyncAdapter来同步多个ContentProviders的问题,但没有一个答案与使用ContentResolver的建议相近.
android android-contentresolver android-contentprovider android-syncadapter
无论如何要告诉java rx使用observeOn函数中的当前线程?我正在为android syncadapter编写代码,我希望在同步适配器线程中观察结果,而不是在主线程中.
使用Retrofit + RX Java的示例网络调用看起来像这样:
MyRetrofitApi.getInstance().getObjects()
.subscribeOn(Schedulers.io())
.observeOn(<current_thread>)
.subscribe(new Subscriber<Object>() {
//do stuff on the sync adapter thread
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用
...
.observeOn(AndroidSchedulers.handlerThread(new Handler(Looper.myLooper())))
...
Run Code Online (Sandbox Code Playgroud)
这是相同的方式安卓RX创建主线程调度程序,但只要我代替不工作Looper.myLooper()的Looper.getMainLooper().
我可以使用Schedulers.newThread(),但作为其复杂的同步代码与许多服务器调用我将不断创建一个新的线程,只是为了触发新的网络调用,再次创建新的线程,以启动更多的网络调用.有没有办法做到这一点?或者我的方法本身是完全错误的?
我正在尝试将我的应用程序设置为"帐户部分".因此,当用户点击添加帐户时,我的应用名称可见.完整的代码可以在这里找到 我创建了一个身份验证服务.这就是我的清单的样子
<service android:name=".AuthenticatorService">
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator" />
</service>
Run Code Online (Sandbox Code Playgroud)
我还创建了一个"authenticator.xml"
<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.udinic.auth_example"
android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher"
android:label="testing"
android:accountPreferences="@xml/prefs"/>
Run Code Online (Sandbox Code Playgroud)
但我仍然没有在帐户下看到我的应用程序.我正在关注本教程, 但它不起作用.你能告诉我我做错了什么吗?
我按照此说明添加了我的同步适配器.
但是有一个小问题:-(
当我打开设置 - >帐户 - >添加帐户并选择我的帐户时,我收到此错误消息
java.lang.IllegalArgumentException: addAccount not supported
at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2147)
at android.accounts.AccountManager.-wrap0(AccountManager.java)
at android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:1993)
at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69)
at android.os.Binder.execTransact(Binder.java:453)
Run Code Online (Sandbox Code Playgroud)
看起来这次崩溃来自将Authenticator Java类转换为Kotlin类.
Java类就像这样锁定
public class Authenticator extends AbstractAccountAuthenticator {
private final Context mContext;
// Simple constructor
public Authenticator(Context context) {
super(context);
mContext = context;
}
// Editing properties is not supported
@Override
public Bundle editProperties(AccountAuthenticatorResponse response,
String accountType) {
throw new UnsupportedOperationException();
}
@Override
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
String authTokenType, String[] requiredFeatures, Bundle options) …Run Code Online (Sandbox Code Playgroud)