Музыкальный сервис не работает через несколько секунд, когда приложение в фоновом режиме в Oreo

Как я могу запустить службу в фоновом режиме в oreo? Этот класс службы хорошо работает во всех версиях Android ниже Oreo, и я объявил эту службу в манифесте. В моем классе активности я запускаю startservice(getApplicationContext,ExoService.class).

public class ExoService extends Service {
private static Context context;
private static ItemRadio station;
private static ExoService service;
public static SimpleExoPlayer exoPlayer;
private static Uri uri;
private WifiManager.WifiLock wifiLock;
static ProgressTask task;

/*binder return null*/

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    task = new ProgressTask();
    task.execute();
    return START_STICKY;
/*Alrady set Start Sticky*/

 }

/*here is initilize service class*/

static public void initialize(Context context, ItemRadio station) {
    ExoService.context = context;
    ExoService.station = station;
    Log.e("inwhich", "");
}

/*this is my service instance*/

static public ExoService getInstance() {
    if (service == null) {
        service = new ExoService();
    }
    return service;
}

/*Oncreate method */

@Override
public void onCreate() {
    super.onCreate();
    try {
        TrackSelector trackSelector = new DefaultTrackSelector();
        LoadControl loadControl = new DefaultLoadControl();
        exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
}

/*public void stop() {
    if (exoPlayer != null && exoPlayer.getPlayWhenReady()) {
        exoPlayer.stop();
        exoPlayer.release();
        exoPlayer = null;
        this.wifiLock.release();
        this.stopForeground(true);
    }
}*/

public void start() {
    if (exoPlayer != null) {
        exoPlayer.setPlayWhenReady(true);
    }
}

/*after some second ondstroy method call in oreo.*/

public void onDestroy() {
    if (exoPlayer != null) {
        exoPlayer.stop();
    }
    Log.e("Destroyed", "Called");

}

/*public void pause() {
    if (exoPlayer != null) {
        exoPlayer.stop();
        // exoPlayer.setPlayWhenReady(false);
    }
}*/

public ItemRadio getPlayingRadioStation() {
    return station;
}

Асинхронная задача для декодирования URL-адреса песни:

@SuppressLint("StaticFieldLeak")
private class ProgressTask extends AsyncTask<String, Void, Boolean> {

    protected void onPreExecute() {
    }

    protected Boolean doInBackground(final String... args) {

        /*boolean bool = true;*/

        try {
            uri = Uri.parse(station.getRadiourl());

            DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter();
            DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, getString(R.string.app_name)), bandwidthMeterA);

            ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
            MediaSource audioSource = new ExtractorMediaSource(uri, dataSourceFactory, extractorsFactory, null, null);
            /* exoPlayer.addListener(eventListener);
            MediaSource videoSource = new HlsMediaSource(uri, dataSourceFactory, 1, null, null);*/

            final LoopingMediaSource loopingSource = new LoopingMediaSource(videoSource);

            if (station.getRadiourl().endsWith(".m3u8")) {
                exoPlayer.prepare(loopingSource);
            } else {
                exoPlayer.prepare(audioSource);
            }
            /*exoPlayer.setPlayWhenReady(true);*/

        } catch (IllegalArgumentException | IllegalStateException | SecurityException | NullPointerException e1) {
            e1.printStackTrace();
        }
        return true;
    }

    @SuppressLint("WifiManagerPotentialLeak")
    @Override
    protected void onPostExecute(final Boolean success) {

        try {
            if (success) {
                wifiLock = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE))
                        .createWifiLock(WifiManager.WIFI_MODE_FULL, "RadiophonyLock");
                wifiLock.acquire();

                exoPlayer.setPlayWhenReady(true);

            } else {
                /*Toast.makeText(context, context.getString(R.string.internet_disabled), Toast.LENGTH_SHORT).show();*/
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        /* dialog.dismiss();*/

    }
}
}`

Через некоторое время в oreo автоматически вызывается метод ondestroy. Как я могу справиться с этим?


person Naveen    schedule 12.03.2018    source источник
comment
Вам нужно использовать Foreground Service для этого.   -  person ADM    schedule 12.03.2018
comment
Фоновые службы были ограничены в Oreo. Вы можете проверить обсуждение в этом почта. Также ознакомьтесь с этим руководством.   -  person NightFury    schedule 12.03.2018
comment
Пожалуйста, прочитайте При каких обстоятельствах я могу добавить «срочно» или другие подобные фразы к моему вопросу, чтобы получить более быстрые ответы? - Подводя итог, можно сказать, что это не идеальный способ обращения к волонтерам и, вероятно, контрпродуктивно для получения ответов. Пожалуйста, воздержитесь от добавления этого к своим вопросам.   -  person halfer    schedule 12.03.2018
comment
Кроме того, пожалуйста, не делайте код для меня, пожалуйста. Stack Overflow — это не место для рекламы бесплатных рабочих запросов. Здесь рады помочь новичкам, но просить бесплатную рабочую силу — это слишком.   -  person halfer    schedule 12.03.2018
comment
У вас есть сбой или трассировка стека для вашего сбойного кода в Oreo?   -  person halfer    schedule 12.03.2018
comment
ok @halfer через несколько секунд после автоматического вызова метода ondestroy в oreo.i уже загрузил мой код.   -  person Naveen    schedule 12.03.2018
comment
я новичок в андроиде. я пытаюсь исправить эту ошибку за последний месяц, но я не могу найти никакого решения. Я уже прочитал так много учебников. плиз помогите кто нибудь...   -  person Naveen    schedule 12.03.2018
comment
это исправили?   -  person sudha    schedule 16.04.2018


Ответы (1)


Поскольку Oreo ограничивает использование фоновой службы, вам необходимо запустить службу переднего плана. Вот документация об ограничениях служб в Oreo. Цитата из него:

В Android 8.0 представлен новый метод startForegroundService(). для запуска новой службы на переднем плане. После того как система создала службу, у приложения есть пять секунд, чтобы вызвать startForeground(), чтобы отобразить видимое пользователю уведомление новой службы. Если приложение не вызывает startForeground() в течение установленного времени, система останавливает службу и объявляет приложение ANR.

Помещение службы на передний план в основном включает в себя прикрепление службы к уведомлению, которое видно пользователю:

service.startForeground(NOTIFICATION_ID, notification);

Служба startForeground доступна, начиная с API 5, тогда как startForegroundService поставляется с Oreo, поэтому вам необходимо проверить уровень API устройства и соответствующим образом запустить службу.

person marcbaechinger    schedule 13.03.2018
comment
я меняю целевую версию 25. теперь она отлично работает в фоновом режиме в Oreo. - person Naveen; 14.03.2018
comment
Это не решение, так как магазин Play довольно скоро применит целевой API 26 для обновлений. Прочтите эту запись в блоге: разработчики Android. googleblog.com/2017/12/ - person marcbaechinger; 14.03.2018