Android - 设置同步适配器时启用自动同步
Android - Enable automatic sync when sync adapter is setup
我正在编写一个使用同步适配器同步数据的应用程序。
我已经阅读了文档,我很确定我理解它是如何工作的。通过遵循 Udi Cohen 编写的 great guide,我的大部分同步适配器都可以正常工作。
但是我确实有一个问题似乎无法解决,那就是在安装我的应用程序时自动启用同步。
当我的应用程序运行起来时,它会创建一个同步适配器和一个帐户,完成您期望它完成的所有工作,这很棒。但是,如果我转到设置 > 帐户 > 'My App',同步将关闭。无论如何我可以让它自动启用吗?
Screenshot of Accounts > 'My App'
设置同步适配器时,我的代码如下所示:
if(accountManager.addAccountExplicitly(account,null,null))
{
// Inform the system that this account supports sync
ContentResolver.setIsSyncable(account, CONTENT_AUTHORITY, 1);
// Inform the system that this account is eligible for auto sync
ContentResolver.setSyncAutomatically(account, CONTENT_AUTHORITY, true);
// Recommend a schedule for auto sync
ContentResolver.addPeriodicSync(account, CONTENT_AUTHORITY, new Bundle(), SYNC_FREQUENCY);
newAccount = true;
}
通过阅读同步适配器,我相信 ContentResolver.setSyncAutomatically()
是用于自动启用同步的正确方法。
我也试过设置ContentResolver.setMasterSyncAutomatically(true);
,但似乎没有任何效果。
我在我的 AndroidManifest 中声明了权限 android.permission.WRITE_SYNC_SETTINGS
,所以这不是问题所在。我的项目中也有同步服务和 xml 文件。我在下面附上了这些代码。
有没有其他人遇到过类似的问题?会不会是权限问题?
如果有人有任何建议,我很乐意尝试。谢谢。
AndroidManifest.xml
<service
android:name=".syncadapter.CalendarSyncService"
android:exported="true"
android:process=":sync">
<intent-filter>
<action android:name="android.content.SyncAdapter"/>
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/calendar_syncadapter"/>
</service>
syncadapter.xml
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.companyname.rostering"
android:allowParallelSyncs="true"
android:contentAuthority="com.android.calendar"
android:isAlwaysSyncable="true"
android:supportsUploading="true"
android:userVisible="true"/>
将清单更改为如下所示:
<service
android:name=".SyncService"
android:exported="true"
>
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter" />
</service>
在你的 syncadapter.xml
中有以下 属性:
<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="@string/content_authority"
android:accountType="@string/sync_account_type"
android:isAlwaysSyncable="true" />
我查看了提供的教程 link,其中 android:isAlwaysSyncable
是 false
所以我认为实现它会解决问题
更新
另一件事是,如果您在高于 KITKAT 的版本上安装应用程序,那么您可能想要更改调用 addPeriodicSync 的方式:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// we can enable inexact timers in our periodic sync
SyncRequest request = new SyncRequest.Builder().
syncPeriodic(syncInterval, flexTime).
setSyncAdapter(account, authority).
setExtras(new Bundle()).build();
ContentResolver.requestSync(request);
} else {
ContentResolver.addPeriodicSync(account,
authority, new Bundle(), syncInterval);
我终于找到了导致我出现问题的原因。
在我的 syncadapter.xml 中,我的内容权限设置为 android:contentAuthority="com.android.calendar"
。
但是,在我使用 ContentResolver.setSyncAutomatically(account, CONTENT_AUTHORITY, true);
将同步设置为自动的代码中,我的内容权限值实际上设置为与 XML.[=12= 中的内容权限不同的值]
设置同步适配器时的内容权限必须与 XML 中使用的内容权限相匹配。
我正在编写一个使用同步适配器同步数据的应用程序。
我已经阅读了文档,我很确定我理解它是如何工作的。通过遵循 Udi Cohen 编写的 great guide,我的大部分同步适配器都可以正常工作。
但是我确实有一个问题似乎无法解决,那就是在安装我的应用程序时自动启用同步。
当我的应用程序运行起来时,它会创建一个同步适配器和一个帐户,完成您期望它完成的所有工作,这很棒。但是,如果我转到设置 > 帐户 > 'My App',同步将关闭。无论如何我可以让它自动启用吗?
Screenshot of Accounts > 'My App'
设置同步适配器时,我的代码如下所示:
if(accountManager.addAccountExplicitly(account,null,null))
{
// Inform the system that this account supports sync
ContentResolver.setIsSyncable(account, CONTENT_AUTHORITY, 1);
// Inform the system that this account is eligible for auto sync
ContentResolver.setSyncAutomatically(account, CONTENT_AUTHORITY, true);
// Recommend a schedule for auto sync
ContentResolver.addPeriodicSync(account, CONTENT_AUTHORITY, new Bundle(), SYNC_FREQUENCY);
newAccount = true;
}
通过阅读同步适配器,我相信 ContentResolver.setSyncAutomatically()
是用于自动启用同步的正确方法。
我也试过设置ContentResolver.setMasterSyncAutomatically(true);
,但似乎没有任何效果。
我在我的 AndroidManifest 中声明了权限 android.permission.WRITE_SYNC_SETTINGS
,所以这不是问题所在。我的项目中也有同步服务和 xml 文件。我在下面附上了这些代码。
有没有其他人遇到过类似的问题?会不会是权限问题? 如果有人有任何建议,我很乐意尝试。谢谢。
AndroidManifest.xml
<service
android:name=".syncadapter.CalendarSyncService"
android:exported="true"
android:process=":sync">
<intent-filter>
<action android:name="android.content.SyncAdapter"/>
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/calendar_syncadapter"/>
</service>
syncadapter.xml
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.companyname.rostering"
android:allowParallelSyncs="true"
android:contentAuthority="com.android.calendar"
android:isAlwaysSyncable="true"
android:supportsUploading="true"
android:userVisible="true"/>
将清单更改为如下所示:
<service
android:name=".SyncService"
android:exported="true"
>
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter" />
</service>
在你的 syncadapter.xml
中有以下 属性:
<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="@string/content_authority"
android:accountType="@string/sync_account_type"
android:isAlwaysSyncable="true" />
我查看了提供的教程 link,其中 android:isAlwaysSyncable
是 false
所以我认为实现它会解决问题
更新
另一件事是,如果您在高于 KITKAT 的版本上安装应用程序,那么您可能想要更改调用 addPeriodicSync 的方式:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// we can enable inexact timers in our periodic sync
SyncRequest request = new SyncRequest.Builder().
syncPeriodic(syncInterval, flexTime).
setSyncAdapter(account, authority).
setExtras(new Bundle()).build();
ContentResolver.requestSync(request);
} else {
ContentResolver.addPeriodicSync(account,
authority, new Bundle(), syncInterval);
我终于找到了导致我出现问题的原因。
在我的 syncadapter.xml 中,我的内容权限设置为 android:contentAuthority="com.android.calendar"
。
但是,在我使用 ContentResolver.setSyncAutomatically(account, CONTENT_AUTHORITY, true);
将同步设置为自动的代码中,我的内容权限值实际上设置为与 XML.[=12= 中的内容权限不同的值]
设置同步适配器时的内容权限必须与 XML 中使用的内容权限相匹配。