没有互联网连接的syncadapter

时间:2012-01-28 09:40:58

标签: android connection android-syncadapter

我有一个工作正常的同步适配器。它不需要互联网连接,因为它需要将地址簿与另一个本地存储(我的应用程序)同步。 当Wifi关闭且设备没有任何互联网连接时,Android会禁用帐户中的同步功能。同步设置活动。

即使连接关闭,有没有办法让同步适配器保持开启状态?

5 个答案:

答案 0 :(得分:2)

没有办法,SyncAdpater框架无法在没有互联网连接的情况下工作所以最好将同步适配器重新实现为意图服务。

答案 1 :(得分:0)

如果不修改AOSP或按照rAm的回答更改设计,就无法实现这一目标。

我的答案是那些愿意修改AOSP的人:

Google强制执行以下操作:

作业是由SyncManager.java在网络约束下安排的

final int networkType = syncOperation.isNotAllowedOnMetered() ?
                JobInfo.NETWORK_TYPE_UNMETERED : JobInfo.NETWORK_TYPE_ANY;

        JobInfo.Builder b = new JobInfo.Builder(syncOperation.jobId,
                new ComponentName(mContext, SyncJobService.class))
                .setExtras(syncOperation.toJobInfoExtras())
                .setRequiredNetworkType(networkType)
                .setPersisted(true)
                .setPriority(priority);

但是NETWORK_TYPE_ANY映射到JobStatus.java中的CONSTRAINT_CONNECTIVITY

switch (job.getNetworkType()) {
    case JobInfo.NETWORK_TYPE_NONE:
        // No constraint.
        break;
    case JobInfo.NETWORK_TYPE_ANY:
        requiredConstraints |= CONSTRAINT_CONNECTIVITY;
        break;

有两种解决方案:

1。 首先删除互联网连接检查,仅检查常规连接

  diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
    index 4d5a920..6680c4e 100644
    --- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java
    +++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
    @@ -118,7 +118,8 @@ public final class ConnectivityController extends StateController implements
                     && !info.isRoaming();

             boolean changed = false;
    -        changed |= jobStatus.setConnectivityConstraintSatisfied(connectionUsable);
    +        //change to AOSP  : use connected instead of connectionUsable - since connection maybe considered usable within enterprise without NET_CAPABILITY_VALIDATED
    +        changed |= jobStatus.setConnectivityConstraintSatisfied(connected);
             changed |= jobStatus.setMeteredConstraintSatisfied(metered);
             changed |= jobStatus.setUnmeteredConstraintSatisfied(unmetered);
             changed |= jobStatus.setNotRoamingConstraintSatisfied(notRoaming);

2。 其次,您需要有条件地向SyncManager.java添加替代条件 我添加了充电条件,因为正在使用的自定义设备始终处于充电状态-可以将其更改为其他任何条件-但还需要一个附加条件。

diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 205e828..81f9a8c 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -1539,6 +1539,13 @@ public class SyncManager {
                 .setRequiredNetworkType(networkType)
                 .setPersisted(true)
                 .setPriority(priority);
+                
+        if (syncOperation.owningPackage.contains("com.example.yourcompany")) {
+           //Change to AOSP : Custom accounts need to sync wihout access to public internet
+           Slog.i(TAG, "set JobInfo.NETWORK_TYPE_NONE for "+syncOperation.target.toString());
+           b.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE);
+           b.setRequiresCharging(true);
+       }

         if (syncOperation.isPeriodic) {
             b.setPeriodic(syncOperation.periodMillis, syncOperation.flexMillis);

答案 2 :(得分:-1)

在致电SYNC_EXTRAS_MANUAL

之前添加额外 requestSync(account,authority, extras);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(account,authority, extras);

答案 3 :(得分:-1)

在SyncManager中,尝试在帐户类型为您时将mDataConnection设置为true。

答案 4 :(得分:-1)

 public static void requestManualSync(Account account, Bundle extras) {
   //Do your Stuff here...
}

将上述方法放在Syncadapter中..