我有一个运行良好的同步适配器。它不需要互联网连接,因为它需要将地址簿与另一个本地存储(我的应用程序)同步。当 Wifi 关闭且设备没有任何互联网连接时,Android 会在“帐户和同步”设置活动中禁用同步。
即使连接关闭,有没有办法让我的同步适配器保持打开状态?
我有一个运行良好的同步适配器。它不需要互联网连接,因为它需要将地址簿与另一个本地存储(我的应用程序)同步。当 Wifi 关闭且设备没有任何互联网连接时,Android 会在“帐户和同步”设置活动中禁用同步。
即使连接关闭,有没有办法让我的同步适配器保持打开状态?
好吧,没有办法,SyncAdpater 框架在没有互联网连接的情况下将无法工作,因此最好将您的同步适配器重新实现为意图服务。
如果不修改 AOSP 或更改 ram 回答的设计,则无法实现此目的。
我的回答是针对那些愿意修改 AOSP 的人:
谷歌执行如下:
作业由 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);
在调用之前添加额外的 SYNC_EXTRAS_MANUAL
requestSync(account,authority, extras);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(account,authority, extras);
在 SyncManager 中,当 account-type 是您的时,尝试将 mDataConnection 设置为 true。
public static void requestManualSync(Account account, Bundle extras) {
//Do your Stuff here...
}
将上述方法放入Syncadapter ..