【问题标题】:How to detect new photos with workmanager如何使用 workmanager 检测新照片
【发布时间】:2019-05-29 19:48:10
【问题描述】:

现在我正在使用 Firebase 上传照片,而且效果很好,并且能够重建这项工作以使用 workmanager,但我不知道如何将内容 URI 触发器传递给我的 workmanager 构建器。

val dispatcher = FirebaseJobDispatcher(GooglePlayDriver(applicationContext))
    val job = dispatcher.newJobBuilder()
            .setService(UploadJobService::class.java)
            .setTag(TAG)
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(0, 60))
            .setTrigger(Trigger.contentUriTrigger( Arrays.asList(
                    ObservedUri(Uri.parse(Environment.getExternalStorageDirectory().absolutePath), ObservedUri.Flags.FLAG_NOTIFY_FOR_DESCENDANTS))
            ))
            .setLifetime(Lifetime.FOREVER)
            .setReplaceCurrent(false)
            .setConstraints(
                    Constraint.ON_UNMETERED_NETWORK
            )
            .build()
    dispatcher.mustSchedule(job)

这是我用于 workmanager 的代码,它大部分时间都可以工作,但是当我拍照并删除时,这不起作用,因为间隔 15 分钟, 我如何注册新的唯一工作人员,当检测到新照片时将开始工作?

编辑:这是我使用的代码及其工作,但不确定我是否正确实现......

这是调度工作人员的方法:

public static void Checkfornewphotos(String ONE_MY_WORK) {
    OneTimeWorkRequest.Builder photoCheckBuilder =
            new OneTimeWorkRequest.Builder(MyWorker.class);
    photoCheckBuilder.setConstraints(new Constraints.Builder()
            .addContentUriTrigger(MediaStore.Images.Media.INTERNAL_CONTENT_URI, true)
            .addContentUriTrigger(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true)
            .build());
    OneTimeWorkRequest Photocheck = photoCheckBuilder.build();
    WorkManager instance = WorkManager.getInstance();
    instance.enqueueUniqueWork(ONE_MY_WORK, ExistingWorkPolicy.REPLACE, Photocheck);
}

这是我的工人:

public class MyWorker extends Worker {

public MyWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
    super(context, params);
}

@Override
public Worker.Result doWork() {
    // Do your actual work
    try {
        Log.i(TAG, "mywork")
        Result.RETRY

    } catch (exception: Exception) {
        Log.i(TAG, "mywork")
        Result.SUCCESS
    }
    // Then start listening for more changes
    Checkfornewphotos(getTags().iterator().next());
}

}

【问题讨论】:

    标签: android kotlin android-workmanager


    【解决方案1】:

    WorkManager 不支持定期(即重复)内容 URI 触发器,但它支持将 OneTimeWorkRequestaddContentUriTrigger() 作为约束之一进行排队。

    public static void scheduleWork(String tag) {
      OneTimeWorkRequest.Builder photoCheckBuilder =
          new OneTimeWorkRequest.Builder(MyWorker.class);
      photoCheckBuilder.setConstraints(new Constraints.Builder()
          .addContentUriTrigger(MediaStore.Images.Media.INTERNAL_CONTENT_URI, true)
          .addContentUriTrigger(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true)
          .build());
      OneTimeWorkRequest photoCheckWork = photoCheckBuilder.build();
      WorkManager instance = WorkManager.getInstance();
      instance.enqueueUniqueWork(tag, ExistingPeriodicWorkPolicy.REPLACE, photoCheckWork);
    }
    

    因为它是OneTimeWorkRequest,它只会在第一次更改 URI 时触发 - 您需要在您的 Worker 完成后重新排队工作以捕捉下一次更改:

    public class MyWorker extends Worker {
    
      public MyWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
      }
    
      @Override
      public Worker.Result doWork() {
        // Do your actual work
    
        // Then start listening for more changes
        scheduleWork(getTags().iterator().next());
      }
    }
    

    【讨论】:

    • 此 API 需要 Android N - 是否有任何选项支持低于该 API 级别?
    • @amitavk - 在 Android N 之前,监听内容 URI 变化的唯一方法是让您的应用不断运行,所以没有。
    • developer.android.com/reference/android/hardware/… 的广播是否能达到 N 以下的效果?
    猜你喜欢
    • 2013-07-25
    • 2011-10-29
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多