Обработка последовательных событий с помощью планировщика заданий - PullRequest
1 голос
/ 23 июня 2019

Мое приложение должно знать о том, чтобы делать снимки любыми приложениями камеры на пользовательском устройстве, и делать определенный прогресс на этом изображении.
В API <24 я использовал широковещательный приемник, который перехватывает <code>com.android.camera.NEW_PICTURE события и работает нормально.
Но согласно этому документу для достижения этой цели в API> = 24 мы должны использовать Job-Scheduler.
Я использовал этот код, и он отлично работает для одной картинки за один раз. но когда я делаю последовательные снимки, планировщик заданий обрабатывает только первый.

@TargetApi(Build.VERSION_CODES.N)
public class CameraJobService extends JobService
{
private static final String TAG = "CameraJobService";

@Override
public boolean onStartJob(final JobParameters params)
{
    Log.i(TAG, "onStartJob: " + this);

    // do in background thread
    new Thread(() -> {
        doJob(params);

        // mark the job as 'finished'
        jobFinished(params, false);

        // create a new job
        prepareJob(getApplicationContext());
    }).start();

    // mark the job as 'on processing'
    return true;
}

@Override
public boolean onStopJob(JobParameters params)
{
    Log.i(TAG, "onStopJob: " + this);
    // reschedule job if it was terminated by os
    return true;
}

private void doJob(JobParameters params)
{
    if (params.getTriggeredContentAuthorities() != null && params.getTriggeredContentUris() != null)
    {
        //some job here
        Log.d(TAG, "doJob: ");
    }
}

@TargetApi(Build.VERSION_CODES.N)
public static void prepareJob(Context context)
{
    Log.i(TAG, "prepareJob");
    JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

    JobInfo.Builder builder = new JobInfo.Builder(1001,
            new ComponentName(context, CameraJobService.class));

    builder.addTriggerContentUri(
            new JobInfo.TriggerContentUri(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));

    if (scheduler != null)
    {
        scheduler.schedule(builder.build());
    }
}
}

Я инициализировал свои JobService и BroadcastReceiver Здесь, в MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    //
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // use job scheduler
        CameraJobService.prepareJob(this);
    } else {
        // use broadcast receiver
        CameraBroadcastReceiver.register(this);
    }
}

Я думаю, что эта проблема возникает из-за того, что сейчас выполняется одно задание, и мы не можем запустить новое до завершения текущего задания. но есть ли способ справиться с этой проблемой?

...