Android - 如何在 VPN 下安排需要网络功能的作业

问题描述 投票:0回答:1

我正在尝试设置一个 JobScheduler 来运行 JobService 以在某些条件下下载文件。

它的工作就像一个魅力,但我无法让它在 VPN 下工作。

我尝试过更改功能,但没有效果。 我尝试了多个 VPN,但都没有用。

这是我启动 JobService 的用例的代码。

/**
 * A use case for downloading a replay.
 *
 * This use case schedules a download job using the `JobScheduler`.
 * The download job is handled by the `DownloadJobService`.
 *
 */
class DownloadReplayUseCase @Inject constructor(
    @ApplicationContext private val context: Context,
    private val moshi: Moshi,
) : (Replay) -> Unit {

    companion object {
        private const val DOWNLOAD_JOB_ID_START = 10001
        private const val DOWNLOAD_JOB_ID_END = 20000
        private var currentJobId = DOWNLOAD_JOB_ID_START

        private const val MAXIMUM_SCHEDULING_LATENCY = 1000L
    }

    /**
     * Schedules a download job for the given replay.
     *
     * @param replay The replay to download.
     */
    override fun invoke(replay: Replay) {
        val networkRequest = NetworkRequest.Builder()
            .addCapability(NET_CAPABILITY_INTERNET)
            .addCapability(NET_CAPABILITY_VALIDATED)
            .addCapability(NET_CAPABILITY_NOT_VPN)
            .build()

        val bundle = PersistableBundle().apply {
            putString(DownloadJobService.REPLAY_JSON_KEY, ReplayJsonAdapter(moshi).toJson(replay))
        }

        val jobId = currentJobId++

        if (jobId > DOWNLOAD_JOB_ID_END) {
            currentJobId = DOWNLOAD_JOB_ID_START
        }

        val jobInfoBuilder = JobInfo.Builder(
            jobId, ComponentName(context, DownloadJobService::class.java),
        ).setExtras(bundle)

        val jobInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
            jobInfoBuilder
                .setRequiredNetwork(networkRequest)
                .setUserInitiated(true)
                .build()
        } else {
            jobInfoBuilder
                .setOverrideDeadline(MAXIMUM_SCHEDULING_LATENCY)
                .build()
        }

        val jobScheduler: JobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
        jobScheduler.schedule(jobInfo)
    }
}

在基本网络上时,一切都按预期工作,并且我的 DownloadJobService 立即启动。
但是,当我使用 VPN 时,什么也没有发生。它一直在排队,直到我停止 VPN。

欢迎任何帮助!

android vpn android-jobscheduler jobservice
1个回答
0
投票

在您的代码中,您有

.addCapability(NET_CAPABILITY_NOT_VPN)
。当与
JobInfo.Builder
一起使用时,这表示“仅当我们的网络不在 VPN 上时运行作业”。您报告说该作业仅在您不在 VPN 上时运行。因此,看起来代码就像文档一样工作。

该文档指出:

表示该网络不是 VPN。此功能是默认设置的,应针对 VPN 网络明确清除。

这表明您应该尝试

.removeCapability(NET_CAPABILITY_NOT_VPN)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.