Мое приложение должно знать о том, чтобы делать снимки любыми приложениями камеры на пользовательском устройстве, и делать определенный прогресс на этом изображении.
В 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);
}
}
Я думаю, что эта проблема возникает из-за того, что сейчас выполняется одно задание, и мы не можем запустить новое до завершения текущего задания. но есть ли способ справиться с этой проблемой?